1. 程式人生 > >FTP之主動模式vs被動模式

FTP之主動模式vs被動模式

背景說明

最近有個專案涉及到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服務端防火牆的角度,需要開通以下網路關係:

  1. FTP客戶端任意埠到FTP服務端21埠。

  2. FTP服務端21埠到FTP客戶端的大於1023埠。

  3. FTP服務端20埠到FTP客戶端的大於1023埠。

  4. 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連線進行通訊的時候,有時候會有這樣的響應:

  1. PORT 192,168,150,80,14,178

  2. 227 Entering Passive Mode (192,168,150,90,195,149)

這些響應中,那串數子頭4個是IP地址,後兩位是表示埠,埠的計算是將第5位數乘以256加上第六位數。如192,168,150,90,195,149,則埠為195*256+149=50069。

參考資料

  1. Active FTP vs. Passive FTP, a Definitive Explanation

    這篇文章很詳細,看不明我寫的中文的,可以看這篇英文的。