500 Illegal PORT command. | Linux, vsftpd

Столкнулся с проблемой при доступе к ftp серверу – vsftpd.
При попытке соединения получал ошибку:

FTP command: Client "1.2.3.4", "PORT 172,16,5,239,15,188"
FTP response: Client "1.2.3.4", "500 Illegal PORT command."


При этом – 1.2.3.4 – это айпи шлюза через который я шёл клиентом, а 172,16,5,239,15,188 – это внутренний айпи клиента и соответственно порт.

На фтп я шёл total commender’ом. При этом тотал командер показывал что соединение и запрос PORT шел от имени внутреннего интерфейса шлюза, за которым находится vsftpd.

Схема такая:

клиент (172.16.5.239) -> шлюз (172.16.5.1/1.2.3.4) -> шлюз (2.3.4.5/192.16.2.1) -> 
шлюз (192.168.2.3/10.0.0.1) -> vsftpd (10.0.0.2)

На шлюзах – нат и форвардинг портов. Все настроено, соединение доходило до vsftpd, но отдавать директорию он не хотел, спотыкаясь на «500 Illegal PORT command».

Решение оказалось в следующем. В конфиге vsftpd (vsftpd.conf) есть переменная:

tcp_wrappers=YES

Это значит что vsftpd использует линуксовые /etc/hosts.allow и /etc/hosts.deny для контроля доступа.
При этом он может дополнительно указывать какой конфиг применять к какому клиенту через переменную VSFTPD_LOAD_CONF. У меня строки выгладели примерно так:

vsftpd: 1.2.3.4: setenv VSFTPD_LOAD_CONF /etc/vsftpd/conf/secure.conf

В файле /etc/vsftpd/conf/secure.conf – одна строка – pam_service_name=vsftpd-secure (важно, но не суть).

Собственно необходимо было добавить в /etc/hosts.allow адрес внутреннго интерфейса шлюза за которым был vsftpd и который показывал во время соединения ftp клиент (total commender) – в нашем случае это – 192.168.2.3:

vsftpd: 192.168.2.3: setenv VSFTPD_LOAD_CONF /etc/vsftpd/conf/secure.conf

Или пробовать отключать tcp_wrappers (по дефлту эта переменная стоит в NO).