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
顯然,是這里的端口跟防火牆的不匹配,讓網絡同事把安全策略調整了一下后恢復正常。