Режим LFTP с серверами, которые не распознают команду PORT

Я использую LFTP для передачи файлов с сервера, который, к сожалению, не распознает команду PORT. Я не контролирую сервер (не знаю подробно, что такое сервер), и я должен использовать активный режим.

Это командная строка как:

lftp -e 'debug 10;set ftp:passive-mode off; set ftp:auto-passive-mode no; ls; bye;' -u user,password ftp://ftp.site.com

Это вывод отладки:

<--- 200 Using default language en_US
---> OPTS UTF8 ON
<--- 200 UTF8 set to on           
---> OPTS MLST modify;perm;size;type;UNIX.group;UNIX.mode;UNIX.owner;
<--- 200 OPTS MLST modify;perm;size;type;UNIX.group;UNIX.mode;UNIX.owner;
---> USER xxxxx
<--- 331 Password required for xxxxx
---> PASS xxxxxx
<--- 230 User xxxxx logged in     
---> PBSZ 0
<--- 200 PBSZ 0 successful               
---> PROT P
<--- 200 Protection set to Private       
---> PORT 172,16,133,11,146,168
<--- 500 Illegal PORT command                    
---> LIST
---> ABOR
---- Closing aborted data socket
---- Chiusura del socket di controllo

Кажется, что LFTP отказывается подключиться к сокету данных, потому что удаленный сервер не поддерживает команду PORT. Есть ли способ убедить, что LFTP все еще может подключиться к порту 20? По FTP руководство явно не проблема.

Ответ 1

Проблема, я думаю, не в том, что FTP-сервер не поддерживает команду PORT (она поддерживает), а в том, что ему не нравится IP-адрес/порт, который ваш FTP-клиент отправляет в команде PORT.

PORT 172,16,133,11,146,168

... сообщает серверу подключиться по адресу 172.16.133.11, порт 37544 *. Интересной частью здесь является IP-адрес: это адрес RFC 1918 (т.е. адрес частной сети). Это, в свою очередь, говорит о том, что ваш FTP-клиент находится где-то в локальной сети и подключается к FTP-серверу с использованием публичного IP-адреса.

Этот удаленный FTP-сервер не может подключиться к частному сетевому адресу; по определению, RFC 1918 адрес не является общедоступным.

Таким образом, вполне возможно, что FTP-сервер пытается установить соединение с адресом/портом, указанным в вашей команде PORT, происходит сбой, поэтому FTP-сервер не выполняет команду, говоря:

500 Illegal PORT command

Чтобы команда PORT работала с этим FTP-сервером, вам необходимо определить публичный IP-адрес, к которому может подключиться этот сервер, чтобы получить доступ к вашему клиентскому компьютеру. Допустим, это адрес 1.2.3.4. Затем вам нужно будет указать lftp использовать этот адрес в команде PORT, используя опцию ftp:port-ipv4.

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

Надеюсь это поможет!


* - почему 146,168 переводятся в порт 37544?

Согласно FTP RFC959 эти параметры:

(...) 16-битный адрес порта TCP. Эта адресная информация разбита на 8-битные поля, и значение каждого поля передается в виде десятичного числа (в символьном строковом представлении).

146 dec = 10010010 bin = A
168 dec = 10101000 bin = B

    A        B
10010010 10101000 bin = 37544 dec