FTP主被动模式抓包分析
FTP主被动模式抓包案例分析
1 FTP 工作模式
FTP有两种工作模式,分别为主动模式和被动模式。所谓的主被动模式,是相对于服务器端而言的。
1.1主动模式
主动模式(Active Mode)是指在发起数据传输的时候,是由服务器端向客户端主动发起连接请求。
主动模式的时序图如下图所示
抓包如下图所示:
主动模式下的服务器端向客户端发起请求
在主动模式下,如果客户端有防火墙的话,就有可能服务器端发起主动连接失败。
1.2 被动模式
被动模式(Passive Mode)是指在发起数据传输的时候,是客户端主动发起请求(也就是服务器端被动)。
被动模式时序图如下图所示:
抓包分析的结果如下
控制信道三次握手
客户端向服务器21端口发起请求(PASV模式)
服务器端响应了PORT 218,168,180,194,108,115,也就是跟客户端说,你可以连接我的108*256+115端口,也即是27763端口
被动模式的情况下,如果主机或者防火墙有限制,客户端在请求数据的时候,就无法连接服务器。
在被动模式下,如果是LINUX服务器,可以通过启用ip_conntrack_ftp模块来支持被动模式的FTP连接。具体修改方法如下
# vi /etc/sysconfig/iptables-config, 将IPTABLES_MODULES 一行修改为 IPTABLES_MODULES="ip_conntrack_ftp"
然后在iptables规则中,增加
# vim /etc/sysconfig/iptables # Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
2 实际生产环境分析
生产环境的话,由于中间有防火墙,假设我们是客户端,我们通过Active Mode去连接FTP服务器,首先我们通过防火墙出去访问公网FTP的话,防火墙肯定会进行NAT转换,否则 FTP服务器端收到的PORT就是192,168,0,100,xx,xx,这样的话,服务器端肯定连接不了客户端。
3 案例分析
生产环境一公网FTP 用户登录正常,但是无法列出目录,报错如下图所示:
分析过程如下:
- 这个是一个vsftpd服务器,客户端用的是被动模式。
- 已经登陆上了,证明控制信道是没有问题的,是连接信道的问题。
- 抓包分析
客户端
服务器端
这里至于为什么源IP和目的IP抓包看到都不一样,是因为是公网IP,做过转换的。
从这里可以看出,客户端要连接服务器的12*256+166 = 3238端口。但是发的包服务器端没有收到(客户端还重发了包),到这里,猜测两个原因:
- 网络前端防火墙策略为开放3238端口
- 服务器端有防火墙
检查了服务器端的防火墙配置,发现selinux, iptables都没问题。
与网络沟通了一下,网络反馈没有做过任何变更。继续追问网络前端是否有安全策略,答曰有。让其截图看了一下
开放的端口是3001~3100。查看了一下vsftpd的配置文件,其中有两行如下
pasv_min_port=3001
pasv_max_port=3300
显然,是这里的端口跟防火墙的不匹配,让网络同事把安全策略调整了一下后恢复正常。