我使用以下方式启动了我的 ftp 服务器pure-ftpd -l puredb:/etc/pure-ftpd/pureftpd.pdb -E -j -R -P 67.68.xxx.xx -s -A -j -Z -H -4 -E -R -G -X -x -d -d -U 113:000 -p 30000:30009 -c 50 -C 5
在我的 Pure-FTPd 日志文件中,我有:
[DEBUG] Command [pasv] [] 227 Entering Passive Mode (67,68,xxx,xx,117,54)
但是,我的 ftp 客户端收到此信息:
---> PASV 227 Entering Passive Mode (192,168,2,23,231,6) ftp: connect: No route to host
为什么会发生这种情况?我怎样才能获得正确的 IP 地址?谢谢。
答案1
由于 FTP 发送 IP 地址和端口里面像这样的消息(不仅仅在数据包头中),它不是一种 NAT 友好协议。
因此,NAT 网关通常具有处理 FTP 的特殊代码。此代码称为 FTP“应用层网关”或 ALG。FTP ALG 会查找 PASV 命令之类的消息并重写 IP 地址以表示 NAT 网关的公共 IP 地址,以使通信正常进行。
如果您的 FTP 客户端位于 NAT 网关后面而您的 FTP 服务器不在,那么使用被动模式是解决没有 FTP ALG 的错误 NAT 网关的一种方法。
如果您的 FTP 客户端是不是在 NAT 网关后面,但您的 FTP 服务器是,那么你可以毫无问题地使用正常的主动 FTP,但如果 FTP 服务器前面的 NAT 网关没有良好的 FTP ALG,那么被动模式实际上会在这种情况下中断。许多 NAT 网关的 FTP ALG 都半坏了,只能使主动 FTP 为 NAT 后面的 FTP 客户端工作,但不能处理“FTP服务器NAT 后面的服务器”的情况。显然,许多 NAT 网关供应商并不考虑或关心 NAT 后面的服务器的情况。
如果您的 FTP 客户端和 FTP 服务器分别位于没有 FTP ALG 的单独 NAT 网关后面,则主动 FTP 将被客户端的 NAT 阻止和被动 FTP 将被服务器的 NAT 阻止,因此在这种情况下您根本无法执行普通 FTP,并且需要设置某种隧道或其他解决方法。切换到加密 FTP 会起作用,因为加密 FTP 协议是在 NAT 网关普及之后开发的,并且作者知道 NAT 网关无法查看或干扰协议的内部,因此他们必须将其设计为适用于所有各种 NAT 场景。