Брандмауэр блокирует ответ FTP PASV

Брандмауэр блокирует ответ FTP PASV

У меня есть FTP-сервер, который поддерживает пассивный режим сервера (используя команду PASV). Это отлично работает с Windows XP. Когда я хочу получить доступ к этому серверу из Windows Vista или Windows 7 с включенным брандмауэром, я получаю немедленное отключение соединения. Пакет сброса отправляется на сервер, и сокет получает сигнал о том, что сервер сбросил соединение (что не соответствует действительности).

Проблема исчезает при отключении брандмауэра.

Подключения к другим FTP-серверам работают правильно. Разница в том, что ответ сервера на PASV не заключает поле адреса в скобки. Это допустимо, как указано в RFC-959 и RFC-1132.

Как настроить брандмауэр, чтобы остановить это нежелательное поведение?

решение1

Я не думаю, что виноваты скобки.
Я бы скорее подумал, что динамический диапазон портов, выделенный этим сервером, не соответствует Vista/7.

Для обсуждения этой темы см. эту статью:
Диапазон динамических портов по умолчанию для TCP/IP изменился в Windows Vista и Windows Server 2008

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

netsh int ipv4 show dynamicport tcp 

Чтобы задать динамический диапазон портов для TCP, используйте, например:

netsh int ipv4 set dynamicport tcp start=1024 num=30000

Дополнительные команды описаны в статье выше.

EDIT: Обратите внимание, что брандмауэр Windows может быть достаточно умен, чтобы открыть динамический порт, указанный в ответе PASV, даже если этот порт не попадает в его диапазон по умолчанию для динамических портов. Но может быть, что он все еще недостаточно умен, чтобы понять ответ без скобок. Возможно, стоит рассмотреть возможность расширения диапазона по умолчанию для динамических портов.

решение2

Это напоминает мне проблему, с которой я столкнулся при работе Java и FTP под Windows 7.

https://stackoverflow.com/questions/6990663/java-7-prevents-ftp-transfers-on-windows-vista-and-7-if-firewall-is-on-any-idea

В конечном итоге это оказалась ошибка брандмауэра Microsoft с FTP, пассивным режимом и соединениями IPv6 (адрес не обязательно должен быть IPv6, просто программное обеспечение, устанавливающее соединение, делает это с использованием стека IPv6).

Симптом, описанный в вашем вопросе, очень похож на эту проблему, поэтому я приведу здесь ссылку и кратко изложу ее (хотя этот вопрос не имеет никакого отношения к Java, исправление может быть тем же)

Краткое изложение нескольких упомянутых там решений:

  • Исправление Microsoft:http://support.microsoft.com/kb/2754804
  • Попробуйте заставить ваш FTP-клиент, работающий под управлением Vista/7, работать со стеком IPv4 (может быть возможно, а может и нет)
  • Отключите использование FTP с отслеживанием состояния в брандмауэре Windows netsh advfirewall set global StatefulFTP disable(это, однако, отключит непассивные FTP-соединения, проходящие через ваш брандмауэр)

решение3

Вы не можете настроить брандмауэр, потому что он глючит.

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

Этот клиент должен отправлять TYPE Iкоманду непосредственно перед каждой PASVкомандой, чтобы поддерживать брандмауэр в разумном состоянии. Если вам нужна небинарная передача, вы можете изменить параметр команды TYPE.

Связанный контент