Первоначально это было опубликовано в StackOverflow, но поскольку код работает и это, скорее всего, проблема с сетью / брандмауэром, я решил, что спрошу здесь.
Как указано в заголовке, я могу подключиться к другому компьютеру со своего сервера через FileZilla Client, но не могу через код (.Net - FTPWebRequest)
Я знаю, что код хорош, так как он работает с другой машины. Конкретная машина, с которой у меня возникли проблемы, находится за NAT, но SA открыла все порты для трафика от хоста, с которым мы пытаемся поговорить.
Есть предложения - я пропустил что-то очевидное?
Исключение, которое я получаю от попытки подключения:
"Unable to read data from the transport connection: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond."
И журналы с машины, которую мы пытаемся подключить, показывают:
7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> Connected, sending welcome message...
7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220-FileZilla Server version 0.9.32 beta
7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com
7/26/2010 12:40:23 PM - (not logged in) (xx.xx.xxx.xxx)> AUTH TLS
7/26/2010 12:40:24 PM - (not logged in) (xx.xx.xxx.xxx)> 234 Using authentication type TLS
7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> 421 Login time exceeded. Closing control connection.
7/26/2010 12:41:24 PM - (not logged in) (xx.xx.xxx.xxx)> disconnected.
РЕДАКТИРОВАТЬ: я использую пассивный режим как для кода, так и для подключения к filezilla. В соответствии с запросом, вот журнал успешного ftps-соединения (СПИСОК) из кода (на другом компьютере):
26.07.2010 12:45:03 - (не авторизован) (xx.xx.xxx.xxx)> Подключено, отправляется приветственное сообщение ...
26.07.2010 12:45:03 - (не авторизован) (xx.xx.xxx.xxx)> 220-FileZilla Server версии 0.9.32 beta
26.07.2010 12:45:03 - (не авторизован) (xx.xx.xxx.xxx)> 220 ftp.xxxxxxxxxx.com
26.07.2010 12:45:03 - (не авторизован) (xx.xx.xxx.xxx)> AUTH TLS
26.07.2010 12:45:04 - (не авторизован) (xx.xx.xxx.xxx)> 234 Использование типа аутентификации TLS
26.07.2010 12:45:04 - (не авторизован) (xx.xx.xxx.xxx)> SSL-соединение установлено
26.07.2010 12:45:04 - (не авторизован) (xx.xx.xxx.xxx)> PBSZ 0
26.07.2010 12:45:04 - (не авторизован) (xx.xx.xxx.xxx)> 200 PBSZ = 0
26.07.2010 12:45:05 - (не авторизован) (xx.xx.xxx.xxx)> PROT P
26.07.2010 12:45:05 - (не авторизован) (xx.xx.xxx.xxx)> 200 Уровень защиты установлен на P
26.07.2010 12:45:05 - (не авторизован) (xx.xx.xxx.xxx)> имя пользователя USER
26.07.2010 12:45:05 - (не авторизован) (xx.xx.xxx.xxx)> 331 Требуется пароль для имени пользователя
26.07.2010 12:45:05 - (не авторизован) (xx.xx.xxx.xxx)> PASS xxxxxxxxxx
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 230 Авторизован
26.07.2010 12:45:05 - логин (xx.xx.xxx.xxx)> OPTS utf8 на
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 200 включен режим UTF8
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> PWD
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 257 "/" - текущий каталог.
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> CWD /
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 250 CWD успешно. «/» - текущий каталог.
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> ТИП I
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 200 Тип установлен на I
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> PASV
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 227 Вход в пассивный режим (xx, xx, xxx, xxx, xxx, xxx)
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> СПИСОК
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 150 Соединение принято
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> SSL-соединение для передачи данных установлено
26.07.2010 12:45:05 - имя пользователя (xx.xx.xxx.xxx)> 226 Передача ОК
26.07.2010 12:46:43 - имя пользователя (xx.xx.xxx.xxx)> отключено.
РЕДАКТИРОВАТЬ - и вот журнал успешной попытки с того же компьютера с использованием клиента FileZilla
28.07.2010 10:01:53 - (не авторизован) (xx.xx.xxx.xxx)> Подключено, отправка приветственного сообщения ...
28.07.2010 10:01:53 - (не авторизован) (xx.xx.xxx.xxx)> 220-FileZilla Server версии 0.9.32 beta
28.07.2010 10:01:53 - (не авторизован) (xx.xx.xxx.xxx)> 220 ftp.xxxxxxxx.com
28.07.2010 10:01:53 - (не авторизован) (xx.xx.xxx.xxx)> SSL-соединение установлено
28.07.2010 10:01:53 - (не авторизован) (xx.xx.xxx.xxx)> имя пользователя USER
28.07.2010 10:01:53 - (не авторизован) (xx.xx.xxx.xxx)> 331 Требуется пароль для имени пользователя
28.07.2010 10:01:53 - (не авторизован) (xx.xx.xxx.xxx)> PASS ********
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 230 Авторизован
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> SYST
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 215 UNIX, эмулированный FileZilla
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> FEAT
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 211-Функции:
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> MDTM
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> REST STREAM
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> РАЗМЕР
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> тип MLST *; размер *; изменить *;
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> MLSD
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> AUTH SSL
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> AUTH TLS
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> UTF8
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> CLNT
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> MFMT
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 211 End
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> PBSZ 0
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 200 PBSZ = 0
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> PROT P
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 200 Уровень защиты установлен на P
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> PWD
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 257 "/" - текущий каталог.
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> ТИП I
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 200 Тип установлен на I
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> PASV
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 227 Переход в пассивный режим (xx, xx, xxx, xxx, xxx, xxx)
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> MLSD
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 150 Соединение принято
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> SSL-соединение для передачи данных установлено
28.07.2010 10:01:53 - имя пользователя (xx.xx.xxx.xxx)> 226 Передача ОК
28.07.2010 10:02:18 - имя пользователя (xx.xx.xxx.xxx)> отключено.
Решение таких проблем может быть трудным, потому что журналы обычно сообщают вам только часть того, что происходит.
Лучше всего на этом этапе использовать программное обеспечение для захвата и анализа пакетов (например, самое отличное - и бесплатное - WireShark), чтобы увидеть, что на самом деле происходит на проводе.
Убедитесь, что вы захватили весь трафик между вашим компьютером и удаленной системой, и попытайтесь увидеть, какую разницу вы можете заметить между рабочим соединением и вашим кодом. Это может дать вам представление о том, в чем проблема.
Обратите особое внимание на способ согласования TLS-соединения, потому что это может указывать на реальную проблему (есть довольно красивый и простой для понимания документ, который можно найти по адресу IBM). Например:
Если вы видите, что канал TLS успешно согласован, тогда вам придется взяться за дело: захватить закрытый ключ сервера и декодировать трафик TLS. Однако это будет возможно только в том случае, если соединение TLS не использует Обмен ключами DH поэтому сначала отключите это на своем сервере или клиенте.
После того, как DH был деактивирован и у вас есть закрытый ключ, вы можете следовать инструкциям на Wireshark. вики-страница о SSL / TLS который объясняет процесс довольно подробно или это Сообщение блога это, возможно, немного легче понять.
я пропустил что-то очевидное
Возможно, вы ошибаетесь, полагая, что существует только один способ подключения к ftp-серверу, и, следовательно, предполагаете, что ваш код выполняет то же самое, что и клиент FileZilla.
Показываешь журнал, когда не подключается. Вам нужно сравнить его с журналом успешного подключения, чтобы увидеть, как подключается клиент. (Возможно, он не использует AUTH TLS или может использовать пассивный режим и т. Д.)
Кроме того, я ничего не знаю о FileZilla, но эта конфигурация (например, FTP, TLS и NAT) может вызвать проблемы, настолько, что некоторые FTP-серверы называют себя NAT-Friendly.