我正在使用ftp.exe
调用将文件上传到FTP服务器。
这个程序运行多年并上传到多台服务器,到目前为止没有问题。
更新其中一个接收服务器后,无法再上传。
这是命令序列:
open ftp.xxx.de
<user>
<pw>
>230 User logged in, proceed
cd upload
bin
put <filename>
并且响应于此,服务器回复:
501 PORT IP与10.100.244.5
不同 150文件状态好,即将打开连接
就是这样,在此之后连接被卡住并在一定的超时时间后关闭。
有趣的是,谷歌搜索“PORT IP不一样”只返回一个结果,这说明服务器看到的IP与预期的IP不同。
此外,使用WinSCP,FileZilla或其他FTP实用程序时,连接没有问题,并且传输文件就好了。
那么,为什么会出现以及如何解决呢?
答案 0 :(得分:2)
ftp.exe
使用老式的主动模式命令PORT
,它要求客户端指定FTP服务器需要连接的IP地址以打开数据传输连接。
如果您位于防火墙或NAT后面,客户端可能不知道其外部IP地址并使用其本地网络地址。这会引起麻烦。服务器无法连接回来,因为它显然无法连接到客户端的本地网络。或者,如果指定的IP地址与FTP客户端连接到服务器的IP地址不匹配,服务器会立即拒绝PORT
命令。这是一种安全措施,因为差异可能表示man-in-the-middle attack。您的服务器进行验证。某些服务器可能配置为忽略PORT
命令中指定的IP地址并连接到客户端的已知IP地址。
另一种解决方法是,如果防火墙/ 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地址或配置防火墙/ NAT以修改PORT
命令中的IP地址,否则必须使用另一个FTP客户端。
如您所知WinSCP有效,请参阅converting the Windows ftp.exe
script to WinSCP script指南。
(我是WinSCP的作者)