我遇到的问题是,当我尝试以编程方式上传文件时,我收到来自FTP服务器的“500 Illegal PORT命令”响应。
这个程序是一个小型的c#应用程序,连接到一个FTP站点,并将文件复制到默认目录。 这个程序已经生产了好几年了,我相信代码本身工作得很好。 我也通过使用相同的应用程序连接到我自己的FTP站点来testing应用程序,它的工作原理。 被动模式似乎不是一个选项。
当试图连接到我们的合作伙伴的FTP站点时,程序按预期运行,直到执行FTP put命令。 我注意到在运行Wireshark时,我的请求的源IP与PORT命令发送的IP地址不同。 我已经上传了一个捕获的图像(所有的敏感信息已被删除,使用我的惊人的 Photoshop技能):
。
我已经联系了FTP站点的所有者,我们正在尝试传输这些文件,并且已经为我们的新静态IP地址打开了他们的防火墙。 我可以使用两个LAN IP上的机器使用FTP客户端连接到他们的站点,但是这些PORT命令总是使用与请求源相同的LAN IP发送。 我也尝试从程序驻留的服务器使用ftp.exe,并且成功(但是PORT命令使用与源相同的IP)。
所以我想最大的问题是如何控制PORT命令使用的IP地址? 或者,如果我无法控制,那么ftp程序确定的IP地址和端口号是多less?
事实certificate,答案确实与我使用的FTP库有关。 我确信这不是一个编码问题,但是当我嗅探图书馆是如何创build请求的时候,我想我已经find了答案。
这里是使用ILSpy的相关部分(我在最重要的行的周围放置空间):
private Socket CreateDataSocketActive() { Socket socket = new Socket(2, 1, 6); IPHostEntry iPHostEntry = Dns.Resolve(Dns.GetHostName()); IPEndPoint iPEndPoint = new IPEndPoint(iPHostEntry.get_AddressList()[0], 0); socket.Bind(iPEndPoint); socket.Listen(5); int port = ((IPEndPoint)socket.get_LocalEndPoint()).get_Port(); IPAddress address = ((IPEndPoint)socket.get_LocalEndPoint()).get_Address(); this.SetDataPort((IPEndPoint)socket.get_LocalEndPoint()); return socket; }
它看起来像库是通过简单地抓住可用IP地址列表中的第一个地址来创buildIP端点。 对于大多数解决scheme来说,这可能是可以接受的,但是因为我的服务器上有多个NIC,所以对我来说不起作用。
我知道通过使用FTP.exe,服务器将接受来自我的两个LAN IP子网的连接,只要发出的PORT命令是使用与请求源相同的LAN IP地址发出的。
我猜测有一些由FTP服务器完成的validation,比较两个地址来validation它们是相同的。 否则,一旦我login到FTP站点,理论上我可以将文件传输到完全不同networking上的其他设备。
现在我只需要找出一个解决方法,但是这只是一个寻找新库或者自己动手的问题。 如果能帮助其他人解决同样的问题,我使用的是com.enterprisedt.net.ftp。