У меня проблема с загрузкой файлов по 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.
Я могу представить следующие причины вашей проблемы:
Я бы посоветовал вам предпринять следующие шаги, чтобы сузить причину:
Кроме того, я рекомендую вместо этого использовать 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