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

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

以下的文章,將由 FTP 的工作原理開始介紹,希望能清楚的描述兩者的差別以及正確的設定方式。文章中,我們也將透過實際連線,了解不同模式所傳遞的訊息,這將有助於您未來的故障排除能力。 

【基本原理】

FTP 是屬於 TCP 服務的一種, FTP 是所有通訊協定裡最特殊的,其他的通訊協定例如 HTTP、SMTP、POP3...都只需要一個通訊埠,然而 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 

其中 N、P 都必須大於 1023 

兩種模式各有優缺點,主動模式對伺服器來說比較安全,但對用戶端來說卻是可能帶來危險,因此很可能被用戶端的防火牆所阻擋了。使用被動模式雖然解決了用戶端的問題,但相對的伺服器必須開啟一定範圍的通訊埠供用戶端連線,好在目前絕大部分的 FTP 伺服器軟體,皆可以由管理者決定開啟哪些範圍的通訊埠。

特別注意的是,要使用那種模式連線是由用戶端決定(發出 PORT 或是 PASV 命令),但是伺服器卻可決定要不要支援這種模式的連線。 

轉自Mobile01

arrow
arrow
    全站熱搜

    軒軒的爸媽 發表在 痞客邦 留言(0) 人氣()