一、 概念理解
FTP的主动、被动模式让人很烦,相信你认真看完下面的描述就不会再烦了!
由于历史原因,FTP服务默认需要有2个端口20(数据端口),21(控制端口)
FTP服务的最初的工作过程是:Client请求Server的21端口建立控制连接,然后Server主动用20端口去连Client建立数据连接,结果总是被Client的防火墙拒之门外。(主动模式)
Server毕竟是为大多数人服务的,这样低三下四又干不成事固然不行,于是为了解决服务端被拒之门外的问题,被动模式诞生了:Client请求Server的21端口建立控制连接,然后Server告诉Client我开了哪几个数据端口,你自己来连。(被动模式)
2种模式的区别总结为一句话:前提都是Client去请求Server建立控制连接,不同的是谁来发起数据连接。
二、 故障分析案例
FTP服务器公网IP为:124.x.x.x 内网IP:192.168.1.85 服务端为Vsftpd
故障如图(连接超时):
当我看到这个问题的时候,我并不知所措,也没有仔细去分析连接的过程,我习惯性的用工具连接了一下,因为我相信工具某些方面比人更强大,果然我用CuteFTP连接正常,于是我看工具连接的日志,注意到了一句话:
这句话是什么意思呢?为什么要替换呢?
我们来分析一下过程:
- Client向Server(公网IP)发出控制连接申请并通过账号密码验证
- Client向Server发出PASV命令进入被动模式
- Server向Client返回的是监听IP(192.168.1.85)和数据传输端口(38*256+254=9982)
- Client发现返回的IP(192.168.1.85)和之前发出的连接(124.x.x.x)不同,Client自行修改IP为正确的公网IP
- Client向124.x.x.x的9982端口发出数据连接申请,建立数据连接
这个分析完之后,我们再回过头来看用命令连接时出现的问题,不难看出,是卡在了Client向Server端发出数据连接申请的时候了,为什么?因为我们命令模式不是智能的,不会自己将Server返回的内网IP转成公网IP,所以连192.168.1.85返回超时。
然后分析的就是为什么会只返回内网IP?
原来,公网IP并不是配在该服务端的,而是通过路由进行绑定的,例如云主机上的“弹性IP”等,所以FTP服务端程序只知道存在一个内网的IP。
解决办法:配置文件写入pasv_address=公网IP
# man vsftpd.conf