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

Может явно ftps через Filezilla, но не из кода

Первоначально это было опубликовано в 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. Однако это будет возможно только в том случае, если соединение TLS не использует Обмен ключами DH поэтому сначала отключите это на своем сервере или клиенте.

После того, как DH был деактивирован и у вас есть закрытый ключ, вы можете следовать инструкциям на Wireshark. вики-страница о SSL / TLS который объясняет процесс довольно подробно или это Сообщение блога это, возможно, немного легче понять.

я пропустил что-то очевидное

Возможно, вы ошибаетесь, полагая, что существует только один способ подключения к ftp-серверу, и, следовательно, предполагаете, что ваш код выполняет то же самое, что и клиент FileZilla.

Показываешь журнал, когда не подключается. Вам нужно сравнить его с журналом успешного подключения, чтобы увидеть, как подключается клиент. (Возможно, он не использует AUTH TLS или может использовать пассивный режим и т. Д.)

Кроме того, я ничего не знаю о FileZilla, но эта конфигурация (например, FTP, TLS и NAT) может вызвать проблемы, настолько, что некоторые FTP-серверы называют себя NAT-Friendly.