背景說明
最近有個項目涉及到FTP的上傳下載問題。在本地開發好的程序測試的時候能正常獲取FTP內容,但一放到生產上卻顯示connection timeout,無法連接。經過一些研究,發現是防火牆造成的。那究竟應該怎么開通網絡關系才能正常訪問到FTP呢?FTP中的主動模式與被動模式,對開通的網絡關系又有什么影響呢?雖然網絡上已有部分解釋主動模式和被動模式的文章,但是感覺還不是說得十分清楚。故我自己重新整理闡述一遍,看是否能更好的解釋主動模式和被動模式。
關於FTP
FTP是基於TCP的一個服務。它之所以特別是特別在它使用了兩個端口,一個用來傳送數據,一個用來傳送命令。大家通常理解的,是用來傳送命令的使用21端口,用來傳送數據的使用20端口。但實際上並不是總是用20端口進行數據傳輸的,這還是要看使用的模式。
FTP:主動模式
在主動模式中,FTP客戶端使用一個非分配端口(N>1023)與FTP服務端的21命令端口建立連接,並開始傾聽N+1端口,同時通過21端口將N+1端口告訴FTP服務端。FTP服務端獲取到客戶端告訴它的N+1端口后,使用數據傳輸的20端口與FTP客戶端N+1端口建立連接,從而進行數據傳輸。圖示如下:
第一步:FTP客戶端通過1026端口(N>1023)與FTP服務端的21端口建立通訊,並告訴FTP服務端它監聽的數據傳輸端口是1027。
第二步:FTP服務端發送ACK給FTP客戶端的1026端口。
第三步:FTP服務端通過數據端口20端口與FTP客戶端1027端口建立連接。
第四步:FTP客戶端傳送ACK給FTP服務端以確認建立連接。
根據上述描述,站在FTP服務端防火牆的角度,需要開通以下網絡關系:
-
FTP客戶端任意端口到FTP服務端21端口。
-
FTP服務端21端口到FTP客戶端的大於1023端口。
-
FTP服務端20端口到FTP客戶端的大於1023端口。
- FTP客戶端大於1023端口到FTP服務端20端口。
可以看出,FTP主動模式最大的問題是,FTP客戶端不是直接創建到FTP服務端20數據傳輸端口的連接,而只是告訴FTP服務端自己監控的端口,由FTP服務端創建連接。這會造成FTP客戶端的防火牆認為這是一個外部建立的連接而被攔截掉。
FTP:被動模式
為了解決主動模式中由於FTP服務端建立連接造成的問題,所以FTP有另一種模式——被動模式。在FTP被動模式中,FTP客戶端負責創建命令傳輸和數據傳輸兩條連接,從而解決防火牆攔截FTP服務端建立連接到FTP客戶端的問題。當FTP客戶端創建FTP連接的時候,FTP客戶端會開通隨機的兩個端口N和N+1(N>1023)。其中,N端口與FTP服務端21端口建立通訊,並發送PASV命令到FTP服務端。FTP服務端接收到PASV命令之后,會隨機創建一個端口P(P>1023),並將端口P返回給FTP客戶端。FTP客戶端拿到P端口后,就會通過N+1端口與P端口建立數據傳輸連接。圖示如下:
第一步:FTP客戶端與FTP服務端命令傳輸端口21建立通訊,並傳輸PASV命令。
第二步:FTP服務端通過21端口響應FTP客戶端1026端口,並告訴FTP客戶端它將監聽2024端口作為數據傳輸端口。
第三步:FTP客戶端1027端口與FTP服務端2024端口建立連接。
第四步:FTP服務端通過2024端口返回ACK確認給FTP客戶端1027端口。
根據上述描述,站在FTP服務端防火牆的角度,需要開通以下網絡關系:
1.FTP客戶端任意端口到FTP服務端21端口。
2.FTP服務端21端口到FTP客戶端的大於1023端口。
3.FTP客戶端任意端口到FTP服務端的大於1023端口。
4.FTP服務端大於1023端口到FTP客戶端大雨1023端口。
由此可見,被動模式解決了主動模式在客戶端上面開通網絡關系的問題。但存在另一個問題,就是FTP客戶端需要開通網絡關系到FTP服務端的所有大於1023端口,這可能也是網絡安全不允許的。不過現在有些FTP可以指定一個范圍的端口,以達到控制安全的作用。
一個細節
在使用FTP命令行打開FTP連接進行通訊的時候,有時候會有這樣的響應:
-
PORT 192,168,150,80,14,178
- 227 Entering Passive Mode (192,168,150,90,195,149)
這些響應中,那串數子頭4個是IP地址,后兩位是表示端口,端口的計算是將第5位數乘以256加上第六位數。如192,168,150,90,195,149,則端口為195*256+149=50069。
參考資料
-
Active FTP vs. Passive FTP, a Definitive Explanation
http://slacksite.com/other/ftp.html
這篇文章很詳細,看不明我寫的中文的,可以看這篇英文的。