Активный режим 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 явно проблем нет.


person Marco    schedule 22.02.2013    source источник


Ответы (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?

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

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

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

    A        B
10010010 10101000 bin = 37544 dec
person Castaglia    schedule 06.01.2016