我们合作的一个项目需要第三方通过 FTP 提供的一些数据,我们获取该文件以便稍后将其作为管道的一部分进行处理。这突然变成了一个问题,因为我们无法再获取数据了。我尝试通过主动(连接挂起)和被动模式获取数据,但都没有成功。
我注意到,使用 FileZilla 时我可以获取文件,因此我确信我可以以某种方式重现 FileZilla 以编程方式获取文件的操作。问题似乎是第三方方面的配置错误,因为当我们在被动模式下发出请求时,我们从服务器获取的是本地 IP 地址,而不是实际服务器的 IP。FileZilla 输出以下内容:
Command: PASV
Response: 227 Entering Passive Mode (a local IP address is given here).
Status: Server sent passive reply with unroutable address. Using server address instead.
FileZilla 对 做了什么use the server address instead
?我尝试通过手动 FTP 命令重现此问题,但没有任何效果。
答案1
您正在连接的服务器配置不正确。
FTP 握手的工作方式在 Wikipedia 中有描述 文件传输协议 (FTP)。
- 在主动模式下,客户端开始在端口 M 上监听来自服务器的传入数据连接。它发送 FTP 命令 PORT M 来通知服务器它正在监听哪个端口。然后,服务器从其端口 20(FTP 服务器数据端口)启动到客户端的数据通道。
- 如果客户端位于防火墙后面,无法接受传入的 TCP 连接,则可以使用被动模式。在此模式下,客户端使用控制连接向服务器发送 PASV 命令,然后从服务器接收服务器 IP 地址和服务器端口号,然后客户端使用该 IP 地址和服务器端口号从任意客户端端口打开到收到的服务器 IP 地址和服务器端口号的数据连接。
您的 FTP 服务器很可能应该使用被动模式进行连接。但是,在发送其服务器 IP 地址和端口时,它错误地发送了其本地网络上的本地 IP 地址,而该地址在互联网外部当然无法访问(或无法路由)。
FileZilla 已保护自己免受此类情况的影响,如 关联 由用户 Kamil Maciorowski 提供。
FileZilla 仅检查通常是本地的 IP 地址,并忽略服务器发送的任何此类 IP 地址,继续使用用于初始连接的初始 IP 地址。
简而言之,问题不在于您,而在于服务器端,服务器端的一些错误配置会让您的第三方应用感到困惑。该应用可能确实在尝试使用这个不可用的 IP 地址。
您应该联系双方,即应用程序作者和服务器管理员,并要求他们各自更正自己的错误。服务器应该返回正确的 IP,应用程序应该忽略任何返回的本地 IP(或任何返回的 IP)。