FTP: 为什么要使用 PASV 响应的 IP?

FTP: Why use IP of PASV response at all?

当发送FTP命令"PASV"时,FTP服务器响应有关可以建立数据连接的主机和端口的信息。

如果涉及 NAT,此主机信息可能会有问题。一些客户端通过将建议的数据连接主机的 IP 与来自控制连接的 IP 进行比较来解决此问题:如果在 PASV 之后建议的是本地主机,而控制连接未使用本地主机,则仅使用 PASV 提供的端口使用主机连接的 IP 时使用响应。

例如,参见 Apache Commons 实现:http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java?revision=1788985&view=markup#l3876

我现在的问题是:为什么要使用 PASV 答案的主机?为什么不总是只使用 PASV 应答的端口而是使用控制连接的主机?据我所知,这就是 IPv6 的处理方式,但我从未在 IPv4 中看到过。为什么?

当时FTP设计时有足够的IP地址,NAT不是要考虑的事情。但是 FTP 旨在支持客户端发起两个不同系统之间的传输的用例 - 有关详细信息,请参见 RFC 959 or read about File eXchange Protocol 中的图 2。对于这个用例,PORT 或 PASV 命令中的 IP 地址必须与(单个)服务器不同。客户端 IP.

As far as I know this is how it's done with IPv6 but I never see it with IPv4.

您可能指的是 EPRT 和 EPSV 命令,它们只需要一个端口号,没有 IP 地址。虽然引入这些命令是因为原始的 PORT 和 PASV 命令不支持 IPv4,但这些命令可用于 IPv6 和 IPv4,并且一些客户端也将它们用于 IPv4,从而避免了 PORT/PASV 中 IP 地址错误的问题.