3

Я настроил proftpd для использования ssl/tls. Пытаясь подключиться, я получаю «Неверная команда PORT»

Finding Host xxx.nl ...
Connecting to xxx.xxx.xxx.xxx:21
Connected to xxx.xxx.xxx.xxx:21 in 0.018001 seconds, Waiting for Server 
Response
Initializing SSL Session ...
220 FTP Server ready.
AUTH TLS
234 AUTH TLS successful
SSL session NOT set for reuse
SSL Session Started.
Host type (1): AUTO
USER xxx
331 Password required for xxx
PASS (hidden)
230 User xxx logged in
SYST
215 UNIX Type: L8
Host type (2): Unix (Standard)
PBSZ 0
200 PBSZ 0 successful
PROT P
200 Protection set to Private
PWD
257 "/" is the current directory
CWD /var/www/html/
250 CWD command successful
PWD257 "/var/www/html/" is the current directory
TYPE A
200 Type set to A
PORT 192,168,192,14,211,181
500 Illegal PORT command
Port failed 500 Illegal PORT command
PASV
227 Entering Passive Mode (xxx,xxx,xxx,xxx,160,151).
connecting data channel to xxx.xxx.xxx.xxx:160,151(41111)
Failed to connect data channel to xxx.xxx.xxx.xxx:160,151(41111)

Iptables:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     icmp --  anywhere             anywhere            /* 000 accept all icmp */
ACCEPT     all  --  anywhere             anywhere            /* 001 accept all to lo interface */
REJECT     all  --  anywhere             loopback/8          /* 002 reject local traffic not on loopback interface */ reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere            /* 003 accept all to eth1 interface */
ACCEPT     all  --  anywhere             anywhere            /* 004 accept related established rules */ state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            multiport ports ftp /* 021 allow ftp. */
ACCEPT     tcp  --  anywhere             anywhere            multiport ports ssh /* 022 allow ssh. */
ACCEPT     tcp  --  anywhere             anywhere            multiport ports smtp /* 025 allow smtp. */
ACCEPT     tcp  --  anywhere             anywhere            multiport ports pharos /* 051 allow rundeck. */
ACCEPT     tcp  --  anywhere             anywhere            multiport ports 8140 /* 814 allow puppetserver. */
ACCEPT     tcp  --  anywhere             anywhere            multiport ports http /* 080 allow http. */
ACCEPT     tcp  --  anywhere             anywhere            multiport ports https /* 443 allow https. */
DROP       all  --  anywhere             anywhere            /* 999 drop all */

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Подключение через обычный ftp работает просто отлично ...

Я использую WS_FTP с ftp-authssl//xxx.nl/.... Я пробовал несколько других вариантов подключения, порты и т.д. Но все выдают ту же ошибку. Хотя кажется, что иногда отображается первый список каталогов (но это может быть кеширование WS_FTP)

4 ответа4

6

Прежде всего обратите внимание, что две последние команды, PORT и PASV, не имеют ничего общего друг с другом. Это две независимые попытки подключения (одна для активного FTP, другая для пассивного FTP).


Итак, ваш сбой в порту ожидается.

PORT работает (режим "активный FTP"), когда клиент отправляет свой адрес на сервер - сервер подключается к вам для передачи данных.

Согласно журналам, ваш клиентский компьютер находится за NAT и имеет "частный" IP-адрес. Это единственный адрес, который он знает, поэтому он отправляет его с помощью команды PORT.

Обычно ваш маршрутизатор распознает FTP-соединение и незаметно редактирует команду PORT, заменяя ваш личный адрес собственным публичным. (Или, если вам не повезет, он заменит его мусором.)

Однако, поскольку ваше управляющее соединение теперь зашифровано с использованием TLS, маршрутизатор не может выполнить это исправление (все, что он видит, это зашифрованные данные), и сервер получает именно то, что отправляет ваш клиент: ваш личный адрес.

Поскольку сервер находится в другой сети, он не может достичь частного адреса (в этом и заключается весь смысл NAT). Хотя это даже не мешает попробовать - по соображениям безопасности большинство серверов просто сразу отказывают в любом адресе, который не совсем совпадает с тем, откуда пришло управляющее соединение.

tl; dr Переключите ваш FTP-клиент в пассивный режим. Да, ваши журналы показывают, что пассивный режим (PASV) также нарушен. Но по крайней мере это несколько исправимо, если ваш сервер имеет выделенный публичный IP-адрес, а активный режим - нет.


Что насчет PASV? Ну, проблема похожа.

Обычно брандмауэр вашего сервера отслеживает управляющее соединение FTP, извлекает временный порт из ответа «Вход в пассивный режим (x, y, z…)» и помечает его как принадлежащий "СВЯЗАННОМУ" соединению. Тогда ваше правило # 004 позволит это.

Однако, опять же, iptables не может видеть через TLS (все, что он видит, это зашифрованные данные) и больше не может распознавать ваши подключения к данным FTP как связанные. Таким образом, ваше соединение просто соответствует правилу № 999 и прерывается.

Чтобы заставить PASV работать, вам нужно настроить ProFTPd на использование определенного диапазона пассивных портов (неважно, какой именно диапазон) и указать iptables разрешить соединения с этими портами.

2
PORT 192,168,192,14,211,181

Эта команда означает, что клиент прослушивает IP-адрес 192.168.192.14 порта 54197 для подключения к данным с сервера. 192,168.*. * являются частными IP-адресами, которые нельзя маршрутизировать через Интернет. Это означает, что этот IP-адрес недоступен с сервера в Интернете. И именно поэтому сервер считает команду PORT недействительной.

0

Я разместил вопрос также в SuperUser и получил ответ там: я добавил следующее в proftpd.conf:

PassivePorts 49152 65534
TLSOptions NoSessionReuseRequired

Для PassivePorts см http://proftpd.org/docs/directives/linked/config_ref_PassivePorts.html

Для TLSOptions см. Http://www.proftpd.org/docs/howto/TLS.html (основываясь на некоторых сообщениях журнала от WS_FTP, я понял, что NoSessionReuseRequired должен помочь).

0

Это сработало для меня: вам нужно добавить следующие строки в vsftpd.conf .  Я потратил несколько дней, пытаясь найти этот ответ

listen=YES
#listen_ipv6=YES

Ниже всех некомментированных элементов в vsftpd.conf

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1048
port_enable=YES
pasv_address=PUT YOUR PUBLIC IP ADDRESS HERE (e.g. 18.236.105.3)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .