FTP 使用 Windows ftp.exe 上传失败:"PORT IP is not same as nnn.nnn.nnn.nnn"

Failed to FTP upload using Windows ftp.exe: "PORT IP is not same as nnn.nnn.nnn.nnn"

我正在调用 ftp.exe 将文件上传到 FTP 服务器。

这个程序 运行 多年以来上传到许多服务器,到目前为止没有问题。

其中一台接收服务器更新后,将无法再上传。

这是命令序列:

open ftp.xxx.de
<user>
<pw>
>230 User logged in, proceed
cd upload
bin
put <filename>

服务器回复:

501 PORT IP is not the same as 10.100.244.5
150 File Status okay, about to open Connection

就是这样,在此之后连接被卡住并在一定的超时时间后关闭。

有趣的是,google 搜索 "PORT IP is not the same as" return 恰好有一个结果,这说明服务器看到的 IP 与预期的不同。

此外,当使用 WinSCP、FileZilla 或其他 FTP 实用程序时,连接没有问题并且可以正常传输文件。

那么,为什么会出现这种情况,如何解决呢?

ftp.exe 使用老式的主动模式命令 PORT,它要求客户端指定其 IP 地址,FTP 服务器需要连接回该地址以打开一个数据传输连接。

如果您在防火墙或 NAT 后面,客户端可能不知道其外部 IP 地址并使用其本地网络地址。这会引起麻烦。服务器无法重新连接,因为它显然无法连接到客户端的本地网络。或者,如果指定的 IP 地址与 FTP 客户端连接到服务器的 IP 地址不匹配,服务器会立即拒绝 PORT 命令。这是一项安全措施,因为差异可能表示 man-in-the-middle attack。您的服务器进行验证。某些服务器可能配置为忽略 PORT 命令中指定的 IP 地址并连接到客户端的已知 IP 地址。

解决这个问题的另一种方法是,如果 firewall/NAT 可以检查 FTP 流量并无缝修改 PORT 命令中的 IP 地址。这显然不会发生。


您不会遇到 WinSCP 或 FileZilla 的问题,因为这些客户端默认为被动 FTP 模式,这没有问题。同样在活动模式下,这些客户端可以是 configured to use the external IP address。 FileZilla 还支持现代 EPRT 命令,完全不需要指定 IP 地址(服务器使用客户端已知的 IP 地址)。


有关详细信息,请参阅我关于 active/passive FTP mode 的文章。


我认为没有任何方法可以让它与 Windows ftp.exe 一起工作。它neither supports the passive mode,也不能配置为使用外部IP地址,也不支持EPRT命令。


所以除非你可以配置 FTP 服务器不做检查并连接到客户端的已知 IP 地址,或者配置你的 firewall/NAT 修改 [=11] 中的 IP 地址=] 命令,你必须使用另一个 FTP 客户端。

如您所知,WinSCP 可以工作,请参阅 converting the Windows ftp.exe script to WinSCP script 的指南。

(我是WinSCP的作者)