2012年11月21日 星期三

主動式與被動式 FTP 比較

主動式與被動式 FTP 比較

轉載至 http://vbb.twftp.org/showthread.php?t=9965

FTP 是所有通訊協定裡最特殊的,其他的通訊協定例如 HTTP、SMTP、POP3...都只需要一條連線、一個通訊埠,然而 FTP 卻需要兩條連線、兩個通訊埠。FTP的連線包括兩種不同用途,一個是傳遞客戶端與伺服器之間的Command的,也就是一般我們在設定的FTP通訊埠(預 設21)。另一個是資料傳送的連線,FTP資料傳送的模式又分二種:PORT、PASV。兩者主要分別在於它們會向FTP伺服器發出不同的FTP Command。

為了釐清者兩者的差別,以及其工作原理,特別撰寫這篇文章加以說明。


以下的文章,將由 FTP 的工作原理開始介紹,希望能清楚的描述兩者的差別以及正確的設定方式。文章中,我們也將透過實際連線,了解不同模式所傳遞的訊息,這將有助於您未來的故障排除能力。 基本原理
FTP
是屬於 TCP 服務的一種, FTP 是所有通訊協定裡最特殊的,其他的通訊協定例如 HTTPSMTPPOP3...都只需要一個通訊埠,然而 FTP 卻需要兩個通訊埠,一個用來傳遞客戶端與伺服器之間的命令,一般設在 port 21,稱之為命令通訊埠(Command Port);另一個是真正用來傳遞資料的,一般都設在 port 20,稱之為資料通訊埠(Data Port) 而問題就出在 Data Port 因為初期定義 FTP 通訊定的時候,並沒有考慮到後來防火牆的發展,使得傳統的 FTP 的工作原理無法完全適用在網際網路環境,因此就發展出了另外一種替代模式的 FTP 連線方式,在這種模式底下,Data Port 不再只是 20,也因此造成很多讀到舊資料的人,認為只要將 20, 21 個通訊打開,FTP Server 就能正常運作這樣的錯誤觀念。 以下就由傳統模式開始介紹。
主動式 FTP
傳統式 FTP 連線方式是採用主動模式,由用戶端隨機使用一個大於 1023 (也就是1024以上)的通訊埠(為了方便說明我們以 port N 來代表),與 FTP 伺服器的命令通訊埠(port 21) 建立連線,同時用戶端自己開啟一個 N+1 的通訊埠等待伺服器連線。伺服器接到用戶端的命令之後,便使用資料通訊埠(port 20)主動與用戶端的 port N+1 建立資料連線。 這樣的模式有點像我們開車去加油的溝通方式,駕駛打開窗戶(port N)對著服務人員(port 21)要求加油命令,同時打開油箱蓋、露出加油孔(port N+1),服務人員及拿著油槍(port 20)對著加油孔(port N+1)加油。 所謂的主動式,是以伺服器的觀點來看。要完成一個主動式連線,伺服器必須提供以下幾個溝通管道:

FTP
伺服器開啟 port 21 接受來自外部任意通訊埠的連線(由用戶端要求建立連線)
FTP
伺服器使用 port 21 連線到外部任一大於 1023 的通訊埠(回應用戶端的命令埠)
FTP
伺服器使用 port 20 連線到外部任一大於 1023 的通訊埠(伺服器主動建立資料連線)
FTP
伺服器開啟 port 20 接受來自外部任一大於 1023 的通訊埠連線 (用戶端回覆伺服器資料連線) 以下我們利用一張圖來做說明:



步驟一、用戶端使用 port 1024 與伺服器建立連線,並提供 port 1025 的資訊給伺服器。 步驟二、伺服器回應用戶端的連線。 步驟三、伺服器主動與用戶端的 port 1025 建立連線。 步驟四、用戶端回覆伺服器。 由以上的說明可以理解,主動式連線的真正問題不在於伺服器,而是在於用戶端的防火牆。由於用戶端程式並不是自行建立資料連線,而是自己開啟一個通訊埠,要 求伺服器連線進來,這對用戶端的防火牆來說是一個危險的安全警訊,大部分的網路環境,都不允許防火牆外部的系統連線到內部的用戶端電腦。 以下為實際的主動式 FTP 連線範例,我們以Rainbow FTP Server ezFTP 用戶端程式為例,觀察其連線的訊息。



圖中出現的 PORT 192,168,1,100,6,160 代表用戶端 IP 192.168.1.100, 通訊埠 256*6 + 160,也就是有用戶端只定通訊埠。這和後面要介紹的被動模式完全不同。 被動式 FTP (PASV)
為了解決由伺服器連線到用戶端所產生的安全疑慮,因此發展出了另一種不同的連線模式,稱之為被動模式(Passive Mode, PASV)。讓用戶端程式可以在連線的時候,通知伺服器使用動模式連線。 使用被動模式 FTP ,不論命令連線或是資料連線都是由用戶端建立,以解決防火牆以及相關資安問題。當用戶端開啟 FTP 連線時,用戶端程式先在本機開兩個大於1023的通訊埠(N, N+1),利用 port N 與伺服器的 port 21 建立連線。不同於主動模式的連線方式,用戶端這次不再提供 N+1 port IP 位址給伺服器,而是送出 PASV 的命令。伺服器收到 PASV 的命令之後,即開啟一個大於 1023 的通訊埠(P),並將這個通訊埠連同伺服器 IP 回覆給用戶端,被動等待用戶端連線,用戶端即利用 port N+1與伺服器所提供的 port P 建立資料連線。 以伺服器的觀點來看,要完成一個被動式連線,伺服器必須提供以下幾個溝通管道:

FTP
伺服器開啟 port 21 接受來自外部任意通訊埠的連線(由用戶端要求建立連線)
FTP
伺服器使用 port 21 連線到外部任一大於 1023 的通訊埠(回應用戶端的命令埠)
FTP
伺服器開啟一個大於 1023 的通訊埠,接受來自外部任一大於 1023 的通訊埠連線 (用戶端與伺服器建立資料連線)
FTP
伺服器使用一個大於 1023 的通訊埠,連線到外部任一大於 1023 的通訊埠(伺服器回復資料給用戶端) 以下我們利用一張圖來做說明:



步驟一、用戶端使用 port 1024 與伺服器建立連線,並發出 PASV 的要求。
步驟二、伺服器回應用戶端的連線,並通知用戶端,伺服器已開啟 port 1120 等待資料連線。
步驟三、用戶端使用 port 1025 與伺服器的 port 1120 建立資料連線。
步驟四、伺服器回覆用戶端。
使用被動模式雖然解決了用戶端的問題,卻也為伺服器帶來了一些問題,最大的問題在於伺服器必須開啟一定範圍的通訊埠供用戶端連線,好在目前絕大部分的 FTP 伺服器軟體,皆可以由管理者決定開啟哪些範圍的通訊埠。
另一個問題則是部分作業系統提供的的FTP命令列,不支援被動模式,因此必須使用其他的用戶端程式。 以下為實際的被動式 FTP 連線範例,我們以Rainbow FTP Server ezFTP 用戶端程式為例,觀察其連線的訊息。


請注意紅色箭頭標式的部份,前一行用戶端程式發出 PASV 的命令,伺服器則回應 210,202,94,228,8,0,也就是由伺服器開啟 256*8 +0 這個通訊埠,等待用戶端連線。
以下做個簡單的總結: 主動式 FTP : 命令連線: 用戶端 port N --> 伺服器 port 21 資料連線: 伺服器 port 20 --> 用戶端 N+1 被動式 FTP : 命令連線: 用戶端 port N --> 伺服器 port 21 資料連線: 用戶端 port N+1 --> 伺服器 port P 其中 NP 都必須大於 1023 兩種模式各有優缺點,主動模式對伺服器來說比較安全,但對用戶端來說卻是可能帶來危險,因此很可能被用戶端的防火牆所阻擋了。使用被動模式雖然解決了用戶 端的問題,但相對的伺服器必須開啟一定範圍的通訊埠供用戶端連線,好在目前絕大部分的 FTP 伺服器軟體,皆可以由管理者決定開啟哪些範圍的通訊埠。
特別注意的是,要使用那種模式連線是由用戶端決定(發出 PORT 或是 PASV 命令),但是伺服器卻可決定要不要支援這種模式的連線。

沒有留言:

張貼留言