我有一个支持被动服务器模式(使用 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 时遇到的问题。
最终,它成为 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 命令的参数。