Назад | Перейти на главную страницу

Ошибка подключения wget по ftp после команды PASV

При попытке передать все файлы с одного веб-сервера («источник») на другой («пункт назначения») команда wget подключается через FTP, но не может продолжить работу за пределами команды PASV.

Я использую SSH-соединение с «целевым» сервером (Linux-сервер на общем хостинге) для выполнения команды wget.

«Исходный» сервер - это сервер Microsoft, и FTP-клиент на моем рабочем столе не имеет с ним проблем.

Вот команда, которую я использую для инициации передачи:

wget -m ftp://username:'password'@sourceserver.com

Вход в систему прошел успешно, затем выдаются следующие команды:

==> SYST ... done.      ==> PWD ... done.
==> TYPE I ... done.    ==> CWD not needed.
==> ... couldn't connect to xxx.xxx.xxx.xxx port 1128: Connection timed out
Retrying.

С ошибкой «не удалось подключиться» при каждой повторной попытке он пытается использовать другой номер порта (а не 21, к которому он уже успешно подключился). В первый раз, когда я обратил внимание на ошибку, он попробовал порты в диапазоне 487X.

Я не могу сказать, на стороне сервера Microsoft («исходный») или на стороне Linux («клиент»).

Мысли?

Для передачи файлов или списков каталогов FTP открывает дополнительные TCP-соединения на динамических портах. В активном режиме клиент создает локальный прослушиватель и сообщает серверу о своем IP: порту с помощью команды PORT, а затем сервер подключается к порту клиента (обычно с порта 20 на стороне сервера). В пассивном режиме сервер открывает порт и сообщает клиенту, где он слушает, в ответ на команду PASV клиентов.

Оба режима требуют

  • IP-адрес, доступный другой стороне, например активный режим с клиентом за простым NAT-роутером работать не будет
  • нет или широко открытый брандмауэр, потому что порты на стороне слушателя будут разными для каждого соединения.

Если у вас нет проблем с доступом к нему с вашего настольного клиента, возможно, ваш настольный клиент использует активный режим, а wget использует пассивный режим или что между вашим рабочим столом и сервером нет межсетевого экрана / NAT-маршрутизатора, но между вашим виртуальным хостингом и сервером он есть.

Не вдаваясь в подробности о вашей настройке, сложно строить предположения.

Другой способ - избежать пассивного режима, добавить аргумент --no-passive в вашу команду wget, чтобы это сделать.

wget -r --no-passive --no-parent ftp://account:<password>@<ip address>/folder/ -P /root

Для VSFTPD можно указать диапазоны пассивных портов.

pasv_min_port=1024
pasv_max_port=1048

Кредит: Настройка FTP на Amazon Cloud Server

Кроме того, я видел wget потерпеть поражение, но завиток добиться успеха когда

pasv_address

не соответствует IP-адресу запроса - например, запрос использовал IP-адрес внешней сети, но pasv_address был IP-адресом внутренней сети.

Не уверен, почему это произошло, но должно быть разница в базовой реализации между wget и curl.

Я предполагаю, что ваш ftp-сервер является частным IP и использует переадресацию портов NAT, вам необходимо включить FTP ALG на вашем устройстве NAT.

==> PASV ... не удалось подключиться к 192.168.1.3 порт 64316: время ожидания соединения истекло

После того, как вы включите FTP ALG на вашем устройстве NAT или брандмауэре, частный IP 192.168.1.3 изменится на общедоступный, поэтому wget сможет установить соединение с вашим ftp-сервером.