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

Передача файлов по FTP зависает и истекает время ожидания

У меня проблема с загрузкой файлов по FTP. Я могу успешно перечислить каталоги, но когда я пытаюсь загрузить файл, скажем ".htaccess", он зависает примерно на 20 секунд на STOR .htacess, а затем выдает тайм-аут. Он пытается повторить несколько раз, но всегда терпит неудачу.

Вот как выглядит полный вывод FTP-клиента при передаче файлов:

Status: Connecting to 88.150.168.207:21...
Status: Connection established, waiting for welcome message...
Response:   220 Welcome to CodeBuster FTP service.
Command:    USER codebuster
Response:   331 Please specify the password.
Command:    PASS ********
Response:   230 Login successful.
Command:    OPTS UTF8 ON
Response:   200 Always in UTF8 mode.
Status: Connected
Status: Starting upload of D:\Projects\codebuster\.htacess
Command:    CWD /public_html
Response:   250 Directory successfully changed.
Command:    PWD
Response:   257 "/public_html"
Command:    TYPE A
Response:   200 Switching to ASCII mode.
Command:    PASV
Response:   227 Entering Passive Mode (88,150,168,207,155,25).
Command:    STOR .htacess
Error:  Connection timed out
Error:  File transfer failed
Status: Connecting to 88.150.168.207:21...
Status: Connection established, waiting for welcome message...
Response:   220 Welcome to CodeBuster FTP service.
Command:    USER codebuster
Response:   331 Please specify the password.
Command:    PASS ********
Response:   230 Login successful.
Command:    OPTS UTF8 ON
Response:   200 Always in UTF8 mode.
Status: Connected
Status: Starting upload of D:\Projects\codebuster\.htacess
Command:    CWD /public_html
Response:   250 Directory successfully changed.
Status: Retrieving directory listing...
Command:    TYPE I
Response:   200 Switching to Binary mode.
Command:    PASV
Response:   227 Entering Passive Mode (88,150,168,207,73,43).
Command:    LIST
Response:   150 Here comes the directory listing.
Response:   226 Directory send OK.
Command:    TYPE A
Response:   200 Switching to ASCII mode.
Command:    PASV
Response:   227 Entering Passive Mode (88,150,168,207,222,74).
Command:    STOR .htacess
Error:  Connection timed out
Error:  File transfer failed
Status: Connecting to 88.150.168.207:21...
Status: Connection established, waiting for welcome message...
Response:   220 Welcome to CodeBuster FTP service.
Command:    USER codebuster
Response:   331 Please specify the password.
Command:    PASS ********
Response:   230 Login successful.
Command:    OPTS UTF8 ON
Response:   200 Always in UTF8 mode.
Status: Connected
Status: Starting upload of D:\Projects\codebuster\.htacess
Command:    CWD /public_html
Response:   250 Directory successfully changed.
Status: Retrieving directory listing...
Command:    TYPE I
Response:   200 Switching to Binary mode.
Command:    PASV
Response:   227 Entering Passive Mode (88,150,168,207,35,185).
Command:    LIST
Response:   150 Here comes the directory listing.
Response:   226 Directory send OK.
Command:    TYPE A
Response:   200 Switching to ASCII mode.
Command:    PASV
Response:   227 Entering Passive Mode (88,150,168,207,109,53).
Command:    STOR .htacess
Error:  Connection timed out
Error:  File transfer failed

Это с выключенным iptbles, поэтому проблема не в брандмауэре. Размер файла, конечно, не проблема, так как это всего одна строка с настройкой индекса каталога.

В качестве дополнительного примечания, это каталог chrot, принадлежащий codebuster: codebuster и разрешения drwxrw-rw-.

Вот несколько дополнительных примечаний:

строка из журнала vsftpd показывает:

Sat Jan 10 14:46:23 2015 240 ::ffff:89.72.176.192 35 /public_html/.htacess a _ i r codebuster ftp 0 * c

, поэтому он утверждает, что передача была завершена, но это не так.

Удаление файлов работает правильно

Резюме tcpdump port ftp показывает:

100 packets captured
101 packets received by filter
0 packets dropped by kernel

Использование активного режима в ftp-клиенте ситуации не меняет.

Я могу успешно перечислить каталоги, но когда я пытаюсь загрузить файл ... он зависает примерно на 20 секунд ... а затем выдает тайм-аут.

Список каталогов и передача файлов используют один и тот же базовый механизм, то есть как открытие соединения для передачи данных, так и передача данных. В вашем случае клиенты открывают соединение с адресом, указанным сервером в ответе на команду PASV.

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

Я могу представить следующие причины вашей проблемы:

  1. Какая-то странная проблема на сервере.
  2. Какой-то промежуточный ящик для глубокой проверки (например, брандмауэр), между которыми активно мешает трафику либо политикой, либо из-за ошибки. Некоторые брандмауэры запрещают загрузку в качестве защиты от утечки данных.
  3. Какой-то брандмауэр, скорость которого ограничивает количество подключений к данным.
  4. Какой-то сломанный маршрутизатор, который хрипит на некоторых параметрах TCP, используемых при передаче

Я бы посоветовал вам предпринять следующие шаги, чтобы сузить причину:

  • Просмотрите файл журнала FTP-сервера, чтобы узнать, есть ли какие-либо проблемы.
  • Попробуйте использовать пассивное FTP-соединение на самом VPS (к локальной системе).
  • Попробуйте из другого места.
  • Попробуйте сделать несколько списков каталогов в одном сеансе FTP друг за другом.
  • Попробуйте получить файлы с сервера, чтобы узнать, затронута ли только загрузка.

Кроме того, я рекомендую вместо этого использовать SFTP (передача файлов через SSH), потому что он более безопасен (зашифрованный вход) и вызывает меньше проблем (только одно соединение, никаких дополнительных подключений к данным).

Во-первых, вы можете протестировать, не используя пассивный режим, на случай, если вся ваша установка работает с ним.

Во-вторых, взгляните на эту строку:

Ответ: 227 Переход в пассивный режим (88,150,168,207,155,25).

Это IP-адрес VPS плюс еще два числа, назовем их p1 и p2. Эти числа сообщают вам порт, к которому вы должны подключиться, по формуле «порт = (p1 * 256) + p2». Исходя из этого, я бы порекомендовал вам получить одновременный захват сети на вашем компьютере и VPS, чтобы узнать, в чем проблема. Если вы видите подключение к пассивному порту, инициированное с вашего компьютера, но не достигающее VPS, проблема может быть в вашей локальной сети (как вы сказали, перед вашим VPS нет брандмауэра). Если пакеты попадают на сервер, но он не отвечает, проблема может заключаться в настройке FTP на сервере.

Имейте в виду, что ответить на такие вопросы без всей информации сложно, но я надеюсь, что это даст вам некоторое руководство.

Похоже, что разрешены только исходящие подключения к портам ниже 20000. Убедитесь, что исходящие сообщения на клиенте и входящие на сервер разрешены во всем диапазоне PASV FTP-сервера. Если вы не можете найти там диапазон, 1024-65535 должно работать.

>>> 155*256+25
39705
>>> 73*256+43  #OK
18731
>>> 222*256+74
56906
>>> 35*256+185  #OK
9145
>>> 109*256+53
27957