防火墙阻止 FTP PASV 响应

防火墙阻止 FTP PASV 响应

我有一个支持被动服务器模式(使用 PASV 命令)的 FTP 服务器。它在 Windows XP 上工作正常。当我想从启用了防火墙的 Windows Vista 或 Windows 7 访问此服务器时,连接立即关闭。重置数据包被发送到服务器,并且套接字发出信号表明服务器已重置连接(事实并非如此)。

当防火墙被禁用时,问题消失。

与其他 FTP 服务器的连接正常。不同之处在于服务器对 PASV 的响应未用括号括住地址字段。这是合法的,如 RFC-959 和 RFC-1132 中所述。

我该如何配置防火墙来阻止这种不良行为?

答案1

我不认为括号是罪魁祸首。
我宁愿认为该服务器分配的动态端口范围与 Vista/7 不一致。

有关该主题的讨论,请参阅以下文章:
Windows Vista 和 Windows Server 2008 中的 TCP/IP 默认动态端口范围已发生更改

要查看计算机上的 IPv4 动态端口范围,请使用以下命令:

netsh int ipv4 show dynamicport tcp 

要设置 TCP 的动态端口范围,例如使用:

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

上面的文章中描述了更多命令。

编辑:请注意,Windows 防火墙可能足够智能,可以打开 PASV 响应中指定的动态端口,即使此端口不在其默认的动态端口范围内。但它可能仍然不够智能,无法理解没有括号的响应。看看扩展动态端口默认范围的可能性可能会有所帮助。

答案2

这让我想起了在 Windows 7 下运行 Java 和 FTP 时遇到的问题。

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
  • 尝试让在 Vista/7 下运行的 FTP 客户端使用 IPv4 堆栈运行(可能可行,也可能不可行)
  • 禁用 Windows 防火墙的状态 FTP 使用netsh advfirewall set global StatefulFTP disable(但这将禁用穿透防火墙的非被动模式 FTP 连接)

答案3

您无法配置防火墙,因为它有缺陷。

只要您无法更改 FTP 服务器以发送括号中的端口信息(因为它内置于现场的旧设备中),您就需要具有以下行为的特殊客户端。

此客户端必须TYPE I在每个命令之前立即发送一个命令PASV,以保持防火墙处于正常状态。如果您需要非二进制传输,您可以更改 TYPE 命令的参数。

相关内容