Тайм-аут операции рукопожатия при передаче файла FTPS на удаленный компьютер - PullRequest
0 голосов
/ 07 марта 2019

Я получаю странную ошибку при попытке отправить файл на удаленный FTP-сервер, используя FTP через SSL / TLS.Я не нашел никаких следов решения онлайн: / Пожалуйста, помогите.

Вот мой код:

from ftplib import FTP_TLS
import sys, os
root = "\\home\\user\\test.txt"
dest = "/Destdir"
ftps = FTP_TLS('xxx.xxx.xxx.xxx')
ftps.set_debuglevel(1)
ftps.set_pasv(False)
ftps.connect(port=21, timeout=80)
ftps.login('user', 'pass')
ftps.prot_p()
ftps.ccc()
try:
    ftps.cwd(dest)
except Exception as e:
    print(e)
try:
    file = open('test.txt', 'rb')
    ftps.storbinary('STOR test.txt', file)
    file.close()
except Exception as e:
    print(e)
ftps.close()

А вот и вывод сценария:

*resp* '220 nas FTP server ready.'
*cmd* 'AUTH TLS'
*resp* '234 AUTH TLS command successful.'
*cmd* 'USER user'
*resp* '331 Password required for user.'
*cmd* 'PASS **********'
*resp* '230 User user logged in.'
*cmd* 'PBSZ 0'
*resp* '200 PBSZ command successful (PBSZ=0).'
*cmd* 'PROT P'
*resp* '200 Protection level set to Private.'
*cmd* 'CCC'
*resp* '200 Clearing control channel protection.'
*cmd* 'CWD /Destdir'
*resp* '250 CWD command successful.'
*cmd* 'TYPE I'
*resp* '200 Type set to I.'
*cmd* 'PORT 10,10,99,11,220,211'
*resp* '200 PORT command successful.'
*cmd* 'STOR test.txt'
*resp* "150 Opening BINARY mode data connection for 'test.txt'."
_ssl.c:704: The handshake operation timed out

Как соединениек удаленному FTP-серверу это нормально, тогда, я полагаю, это не проблема брандмауэра.

Примечание. Удаленный FTP-сервер - это NAS-устройство Synology с установленной операционной системой.

EDIT_0:

Еще одна попытка с пассивным режимом дала такой результат:

*resp* '220 nas FTP server ready.'
*cmd* 'AUTH TLS'
*resp* '234 AUTH TLS command successful.'
*cmd* 'USER user'
*resp* '331 Password required for user.'
*cmd* 'PASS **********'
*resp* '230 User user logged in.'
*cmd* 'PBSZ 0'
*resp* '200 PBSZ command successful (PBSZ=0).'
*cmd* 'PROT P'
*resp* '200 Protection level set to Private.'
*cmd* 'CCC'
*resp* '200 Clearing control channel protection.'
*cmd* 'CWD /Destdir'
*resp* '250 CWD command successful.'
*cmd* 'TYPE I'
*resp* '200 Type set to I.'
*cmd* 'PASV'
*resp* '227 Entering Passive Mode (xxx,xxx,xxx,xxx,216,241)'
*cmd* 'STOR test.txt'
*resp* "150 Opening BINARY mode data connection for 'test.txt'."
_ssl.c:704: The handshake operation timed out

Я также пробовал расширенный пассивный режим, но он тоже не помог:

*resp* '250 CWD command successful.'
*cmd* 'TYPE I'
*resp* '200 Type set to I.'
*cmd* 'EPSV'
*resp* '229 Entering Extended Passive Mode (|||55536|)'
*cmd* 'STOR test.txt'
*resp* "150 Opening BINARY mode data connection for 'test.txt'."
_ssl.c:704: The handshake operation timed out

EDIT_1: Таким образом, скрипт работает частично, он может открыть соединение, начинает передачу файла.Файл get создается на удаленном сервере, но он не содержит те же данные, что и исходный файл.Конечный файл имеет размер 1 КБ и несколько случайных символов (файл закодирован в ANSII, а исходный файл - в формате UTF8. Тем временем я могу успешно загрузить файл с помощью WinSCP.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Вероятно, это проблема брандмауэра. FTP довольно особенный, потому что он использует другое соединение для передачи. Соединение, которое в настоящее время работает согласно вашей трассировке, является соединением command , которое устанавливается клиентом и предназначено для FTP-порта сервера (обычно 21).

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

Это означает, что, если брандмауэр не разрешает большие диапазоны адресов или программное обеспечение брандмауэра не выполняет специальную обработку для динамического разрешения адресов, передаваемых в командах FTP, брандмауэр может разрешить соединение команд, а затем заблокировать любое соединение для передачи данных.

Refs:

0 голосов
/ 08 марта 2019

Вы используете активный режим FTP:

ftps.set_pasv(False)

И, судя по вашим комментариям, у вас нет веских причин для этого.

Активный режим FTP обычно не работает, так как это требует от клиента возможности принимать входящие соединения.Как правило, это невозможно без открытия локального (как Windows, так и локальной сети) брандмауэра и / или настройки NAT.Даже не пытайтесь использовать активный режим, если у вас нет особых причин для этого.Используйте пассивный режим.Просто удалите вызов ftps.set_pasv.Пассивный режим является режимом по умолчанию в ftplib.

Подробнее см. Мою статью о Режимах FTP-соединения .

...