|
一、故障描述 由于開發(fā)提出需求,為他們搭建內(nèi)部ftp服務器,搭建好后,提交給他們,測試可以正常使用。后來過了一段時間后,有一天無法登陸了。于是去ftp主機上檢查問題,ftp的配置文件沒有改動,端口監(jiān)聽也正常。telnet也可以通。但是用網(wǎng)頁,或者winscp 訪問就是無法連接。后來谷歌后,發(fā)現(xiàn)ftp的iptables 規(guī)則比其它應用不太像,有點特別。需要特別的修改下防火墻。(詢問后,得知之前其它運維同事加固過該機器的防火墻....) 二、解決方式 1.在原有的防火墻規(guī)則中加入以下規(guī)則。 -A INPUT -p tcp -s 192.168.30.0/24 -p tcp -m state NEW --dport 21 -j ACCEPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 2.加入規(guī)則,重啟后,雖然能登陸了,但是使用ftp工具時一直報這個錯誤。無法列出目錄。 圖1. 圖2. 3.后來在iptables 的配置文件中,加入一個模塊后,就可以了??梢允褂靡韵旅钊ヌ砑?,永久生效。如下: sed -i '$ a IPTABLES_MODULES='ip_conntrack_ftp'' /etc/sysconfig/iptables-config 之后重啟iptables,即可將該ftp跟蹤模塊加載到內(nèi)核中。ip_conntrack_ftp模塊是專用于跟蹤ftp連接的。 三、原因分析 1.涉及到了主動和被動模式 主動模式: client 打開一個隨機端口 port1 去連接 server的 21 號端口,與server的默認21號端口建立連接后。這個時候,client會再打開一個隨機端口 port 2等待服務器來連接。服務器收到用戶端的命令后,就使用20專用數(shù)據(jù)傳輸端口去連接client隨機開放的port 2端口。 (注:如果客戶端開了防火墻,可能會阻塞ftp 服務器20端口與port 2 之間的連接,這個時候,被動模式就出現(xiàn)了。) 如下圖: 注:圖片來源于文末的參考資料 被動模式:client使用一個隨機端口 去連接ftp server 的21 端口,并發(fā)出PASV的要求。 server 去回應 client,并告知clinet : 我已經(jīng)將本機的 port 3 打開。你來連接吧。之后 client 就會收到 server 發(fā)送的 服務器ip+port3的 數(shù)據(jù)包。 client 就會在本機上打開一個隨機的端口 port 4 ,用 port 4去連接服務器上的 port3 端口。這樣client 和server 就建立了數(shù)據(jù)傳輸?shù)倪B接。 如下圖: 注:圖片來源于文末的參考資料 2. 期間我通過使用tcpdump 的分析,也更加的對以上的知識原理進行了進一步的實踐和學習。 四、主動&被動學習驗證 1.環(huán)境介紹: client 端: 192.168.30.58 server端: 192.168.30.203 2.主動模式驗證: server 端運行tcpdump 監(jiān)聽: ?。。〖m正一個錯誤:上圖中的標注客戶端將本機的隨機開放的端口發(fā)送給服務器內(nèi)容的那一條,實際上不是在這里發(fā)送的,而是在 第一次 ftp-data(20)端口 與 端口49404連接的往上數(shù)第四條,是在那兒發(fā)送的隨機端口。 客戶端登陸執(zhí)行的命令: 可能大家會對上述中的client后續(xù)隨機打開的端口計算方法有點疑問,一開始我也是,后來查了一下,解釋如下: PORT 命令 用于打開端口的命令。格式為 PORT a,b,c,d,e,f。其中 a,b,c,d 為點分十進制形式的 IP 地址;e,f 表示端口號,為 2 個 10 進制數(shù)字,用以標識 e×256 + f 運算出來的端口 號。本文章的e,f也就是192,252. 運行上面的公式后,就得到了端口號為49404 3.被動模式驗證: server 端運行tcpdump 監(jiān)聽: 其實我們也可以使用 tcpdump 時,在命令最后加上 -X ,可以詳細的看到報文內(nèi)容。我也是通過這種方式看到在哪一條進行的端口發(fā)送的。 客戶端登陸執(zhí)行的命令: 五、總結(jié) 1.主動模式:服務器只需要開啟21和20 端口,雖然比較安全,但是如果客戶端開啟了防火墻,那么可能會無法傳輸數(shù)據(jù)。 2.被動模式:默認開啟一個21端口后,后續(xù)服務器會對每個用戶的連接請求隨機開放一個端口,服務器安全性降低。 3.在iptables 中,我們需要為ftp 加上一個跟蹤模塊,即:ip_conntrack_ftp 4.盡量避免在公網(wǎng)中使用ftp傳輸數(shù)據(jù),因為用戶及密碼是明文傳輸?shù)摹?/p> |
|
|