今天遇到一个ftp,使用被动模式连接,连不上。仔细看了一下连接的日志信息:
[11:36:00]:CWD www
[11:36:00]:ftp_perform ends with SECONDARY: 0
[11:36:00]:250 Directory changed to /www
[11:36:00]:EPSV
[11:36:00]:Connect data stream passively
[11:36:00]:500 'EPSV': command not understood.
[11:36:00]:Failed EPSV attempt. Disabling EPSV
[11:36:00]:PASV
[11:36:00]:227 Entering Passive Mode (172,16,123,XXX,195,82)
[11:36:00]:Hostname was NOT found in DNS cache
[11:36:00]: Trying 172.16.123.XXX...
[11:36:00]:Connecting to 172.16.123.XXX (121.196.204.XXX) port 50002
[11:36:22]:connect to 172.16.123.XXX port 21 failed: Timed out
[11:36:22]:Failed to connect to 121.196.204.XXX port 21: Timed out
[11:36:22]:Closing connection 1
分析一下这段ftp被动模式连接的日志:首先发送命令切换到www目录,触发了被动模式。先尝试使用EPSV命令,发现服务器上不支持。然后改用PASV命令,这次返回亮眼了:227 Entering Passive Mode (172,16,123,XXX,195,82),懂的朋友一看就明白了,172.16开头的IP,这是什么鬼,这是内网IP啊!居然让ftp客户端跳转去连一个内网IP,当然结果死翘翘了,Timed out!
找到问题之后,我们来看看怎么解决。找了一个正常的ftp,对比一下被动模式的日志,人家返回的IP跟我ftp服务器是一致的啊!后来我上服务器看了一下,服务器是阿里云的,网卡IPv4那里是设置的自动获取IP地址,而我用ipconfig一看,获取到的IP还真是这个172.16.123.XXX,那大概就明白了:ftp服务器端软件把这个IP返回回来了。
下面就来解决这个问题。服务器上我用的是Serv-U,在Local Server下的Settings节点,找到右边的Advanced选项卡,检查里面设置的PASV port range,确认了这边没问题。然后又展开下面的域名,在当前域名下找到Settings节点,同样看Advanced选项卡,里面有一个选项:Allow passive mode data transfer, use IP:填空。这个空当前是空的,我尝试着在这个空里面填上服务器的外网IP。然后再通过ftp客户端进行测试,问题解决了。
我也是第一次了解到这个ftp被动模式的服务器IP是可以自行设置的,长知识了!
好了,关于ftp被动模式下的端口和服务器IP,本文就介绍这么多,然后对大家有所帮助。