東森新聞速報

2008年7月2日 星期三

FTP 的工作原理

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 的通訊埠相機,並將這個通訊埠連同伺服器 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 命令),但是伺服器卻可決定要不要支援這種模式的連線。


目前絕大部分的用戶端都不允許外部連線進來,因此如果您要提供給外部連線,您的 FTP Server 最好支援 PASV 模式,否則您的客戶可能無法正常連線。
症狀:登入成功,但是一片空白,或是告訴您權限不夠...

使用 PASV 模式,Server 必須開啟 1024 ~65535 之間的通訊部,不過目前的 FTP Server 都允取設定一定範圍,例如平常最大連線只有 10 個人,那就開 1024~1033 就好了(這是理論值),如果要讓連線順暢,最好開個兩倍以上,例如 1024~1048,這樣 Server 就會在這範圍內開啟資料連線通訊部(DATA PORT)。

Server 設定好之後,您必須設定防火牆或寬頻分享器,將這些 Port 對應到您的 FTP Server。

有關寬頻分享器的設定,您可以參考線上教學課程。

以下幾項重點請參考:
1.使用什麼模式,是由 Client 決定,所以開啟 PASV 模式,只是代表 Server [可以]接受這種模式,原有 PORT 模式還使可以用。

2.如果是在 Lan 裡面使用,因為都在防火牆內,可以不需要使用 PASV 模式,全部使用 PORT 模式。不過因為作業系統防火牆的問題,Client 端將會出現警告訊息

這是因為 Server要連線到Client的原因。您必須解除封鎖。

3. IE 預設是 PASV 模式,因此鄉民流傳一句話[IE很爛,不要用它當作 FTP Client],雖然有點爛,但不能全部叫他背黑鍋,原因在於很多人的 FTP Server 不支援或是沒設定好 PASV 模式,但是 IE 預設又是 PASV ,所以不通,只要到IE的 [工具] -> [網際網路選項] ->[進階] 往下拉找到 [瀏覽],其中有一個選項[使用被動式 FTP],把勾勾取消就變成 PORT 模式了。

原文網址

沒有留言:

張貼留言

現在對外IP