歡迎您光臨本站 註冊首頁

主動FTP與被動FTP-權威解釋

←手機掃碼閱讀     火星人 @ 2014-03-29 , reply:0

處理防火牆和其他網路連接問題時最常見的一個難題是主動 FTP 與被動 FTP 的區別以及如何完美地支持它們。幸運地是,本文能夠幫助你清除在防火牆環境中如何支持 FTP 這個問題上的一些混亂。

本文也許不像題目聲稱的那樣是一個權威解釋,但我已經聽到了很多好的反饋意見,也看到了本文在許多地方被引用,知道了很多人都認為它很有用。雖然我一直在找尋改進的方法,但如果你發現某個地方講的不夠清楚,需要更多的解釋,請告訴我!最近的修改是增加了主動 FTP 和被動 FTP 會話中命令的例子 。這些會話的例子應該對更好地理解問題有所幫助 。例子中還提供了非常棒的圖例來解釋 FTP 會話過程的步驟 。現在,正題開始了 ...

基礎

FTP 是僅基於 TCP 的服務,不支持 UDP 。與眾不同的是 FTP 使用 2 個埠,一個數據埠和一個命令埠(也可叫做控制埠) 。通常來說這兩個埠是 21 -命令埠和 20 -數據埠 。但當我們發現根據( FTP 工作)方式的不同數據埠並不總是 20 時,混亂產生了 。

主動 FTP

主動方式的 FTP 是這樣的:客戶端從一個任意的非特權埠 N ( N>1024 )連接到 FTP 伺服器的命令埠,也就是 21 埠 。然後客戶端開始監聽埠 N+1 ,併發送 FTP 命令 「port N+1」 到 FTP 伺服器。接著 伺服器會從它自己的數據埠( 20 )連接到客戶端指定的數據埠( N+1 ) 。

針對 FTP 伺服器前面的防火牆來說,必須允許以下通訊才能支持主動方式 FTP :

任何埠到 FTP 伺服器的 21 埠 (客戶端初始化的連接 S)

FTP 伺服器的 21 埠到大於 1024 的埠( 伺服器響應客戶端的控制埠 S->C )

FTP 伺服器的 20 埠到大於 1024 的埠( 伺服器端初始化數據連接到客戶端的數據埠 S->C )

大於 1024 埠到 FTP 伺服器的 20 埠(客戶端發送 ACK 響應到 伺服器的數據埠 S)

畫出來的話,連接過程大概是下圖的樣子:



在第 1 步中,客戶端的命令埠與 FTP 伺服器的命令埠建立連接,併發送命令 「PORT 1027」 。然後在第 2 步中, FTP 伺服器給客戶端的命令埠返回一個 "ACK" 。在第 3 步中, FTP 伺服器發起一個從它自己的數據埠( 20 )到客戶端先前指定的數據埠( 1027 )的連接,最後客戶端在第 4 步中給 伺服器端返回一個 "ACK" 。

主動方式 FTP 的主要問題實際上在於客戶端 。FTP 的客戶端並沒有實際建立一個到 伺服器數據埠的連接,它只是簡單的告訴 伺服器自己監聽的埠號, 伺服器再回來連接客戶端這個指定的埠 。對於客戶端的防火牆來說,這是從外部系統建立到內部客戶端的連接,這是通常會被阻塞的 。

主動 FTP 的例子

下面是一個主動 FTP 會話的實際例子 。當然 伺服器名、 IP 地址和用戶名都做了改動 。在這個例子中, FTP 會話從 testbox1.slacksite.com (192.168.150.80) ,一個運行標準的 FTP 命令行客戶端的 Linux 工作站,發起到 testbox2.slacksite.com (192.168.150.90) ,一個運行 ProFTPd 1.2.2RC2 的 Linux 工作站 。debugging ( -d )選項用來在 FTP 客戶端顯示連接的詳細過程 。紅色的文字是 debugging 信息,顯示的是發送到 伺服器的實際 FTP 命令和所產生的回應信息 。伺服器的輸出信息用黑色字表示,用戶的輸入信息用粗體字表示 。

仔細考慮這個對話過程我們會發現一些有趣的事情 。我們可以看到當 PORT 命令被提交時,它指定了客戶端 (192.168.150.80) 上的一個埠而不是 伺服器的 。當我們用被動 FTP 時我們會看到相反的現象 。我們再來關注 PORT 命令的格式 。就象你在下面的例子看到的一樣,它是一個由六個被逗號隔開的數字組成的序列 。前四個表示 IP 地址,后兩個組成了用於數據連接的埠號 。用第五個數乘以 256 再加上第六個數就得到了實際的埠號 。下面例子中埠號就是 ( (14*256) + 178) = 3762 。我們可以用 netstat 來驗證這個埠信息 。

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PORT 192,168,150,80,14,178
200 PORT command successful.
---> LIST
150 Opening ASCII mode data connection for file list.
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.

被動 FTP

為了解決 伺服器發起到客戶的連接的問題,人們開發了一種不同的 FTP 連接方式 。這就是所謂的被動方式,或者叫做 PASV ,當客戶端通知 伺服器它處於被動模式時才啟用 。

在被動方式 FTP 中,命令連接和數據連接都由客戶端,這樣就可以解決從 伺服器到客戶端的數據埠的入方向連接被防火牆過濾掉的問題 。當開啟一個 FTP 連接時,客戶端打開兩個任意的非特權本地埠( N > 1024 和 N+1 ) 。第一個埠連接 伺服器的 21 埠,但與主動方式的 FTP 不同,客戶端不會提交 PORT 命令並允許 伺服器來回連它的數據埠,而是提交 PASV 命令 。這樣做的結果是 伺服器會開啟一個任意的非特權埠( P > 1024 ),併發送 PORT P 命令給客戶端 。然後客戶端發起從本地埠 N+1 到 伺服器的埠 P 的連接用來傳送數據 。

對於 伺服器端的防火牆來說,必須允許下面的通訊才能支持被動方式的 FTP:

從任何埠到 伺服器的 21 埠 (客戶端初始化的連接 S)

伺服器的 21 埠到任何大於 1024 的埠 ( 伺服器響應到客戶端的控制埠的連接 S->C )

從任何埠到 伺服器的大於 1024 埠 (入;客戶端初始化數據連接到 伺服器指定的任意埠 S)

伺服器的大於 1024 埠到遠程的大於 1024 的埠(出; 伺服器發送 ACK 響應和數據到客戶端的數據埠 S->C )

畫出來的話,被動方式的FTP連接過程大概是下圖的樣子:



在第 1 步中,客戶端的命令埠與 伺服器的命令埠建立連接,併發送命令 「PASV」 。然後在第 2 步中, 伺服器返回命令 "PORT 2024" ,告訴客戶端( 伺服器)用哪個埠偵聽數據連接 。在第 3 步中,客戶端初始化一個從自己的數據埠到 伺服器端指定的數據埠的數據連接 。最後 伺服器在第 4 步中給客戶端的數據埠返回一個 "ACK" 響應 。

被動方式的 FTP 解決了客戶端的許多問題,但同時給 伺服器端帶來了更多的問題 。最大的問題是需要允許從任意遠程終端到 伺服器高位埠的連接 。幸運的是,許多 FTP 守護程序,包括流行的 WU-FTPD 允許管理員指定 FTP 伺服器使用的埠範圍 。詳細內容參看附錄 1 。

第二個問題是客戶端有的支持被動模式,有的不支持被動模式,必須考慮如何能支持這些客戶端,以及為他們提供解決辦法 。例如, Solaris 提供的 FTP 命令行工具就不支持被動模式,需要第三方的 FTP 客戶端,比如 ncftp 。

隨著 WWW 的廣泛流行,許多人習慣用 web 瀏覽器作為 FTP 客戶端 。大多數瀏覽器只在訪問 ftp:// 這樣的 URL 時才支持被動模式 。這到底是好還是壞取決於 伺服器和防火牆的配置 。

被動 FTP 的例子

下面是一個被動 FTP 會話的實際例子,只是 伺服器名、 IP 地址和用戶名都做了改動 。在這個例子中, FTP 會話從 testbox1.slacksite.com (192.168.150.80) ,一個運行標準的 FTP 命令行客戶端的 Linux 工作站,發起到 testbox2.slacksite.com (192.168.150.90) ,一個運行 ProFTPd 1.2.2RC2 的 Linux 工作站 。debugging ( -d )選項用來在 FTP 客戶端顯示連接的詳細過程 。紅色的文字是 debugging 信息,顯示的是發送到 伺服器的實際 FTP 命令和所產生的回應信息 。伺服器的輸出信息用黑色字表示,用戶的輸入信息用粗體字表示 。

注意此例中的 PORT 命令與主動 FTP 例子的不同 。這裡,我們看到是 伺服器(192.168.150.90) 而不是客戶端的一個埠被打開了 。可以跟上面的主動 FTP 例子中的 PORT 命令格式對比一下 。

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV
227 Entering Passive Mode (192,168,150,90,195,149).
---> LIST
150 Opening ASCII mode data connection for file list
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.

總結

下面的圖表會幫助管理員們記住每種 FTP 方式是怎樣工作的:

主動 FTP :
命令連接:客戶端 >1024 埠 -> 伺服器 21 埠
數據連接:客戶端 >1024 埠 伺服器 20 埠

被動 FTP :
命令連接:客戶端 >1024 埠 -> 伺服器 21 埠
數據連接:客戶端 >1024 埠 -> 伺服器 >1024 埠

下面是主動與被動 FTP 優缺點的簡要總結:

主動 FTP 對 FTP 伺服器的管理有利,但對客戶端的管理不利 。因為 FTP 伺服器企圖與客戶端的高位隨機埠建立連接,而這個埠很有可能被客戶端的防火牆阻塞掉 。被動 FTP 對 FTP 客戶端的管理有利,但對 伺服器端的管理不利 。因為客戶端要與 伺服器端建立兩個連接,其中一個連到一個高位隨機埠,而這個埠很有可能被 伺服器端的防火牆阻塞掉 。

幸運的是,有折衷的辦法 。既然 FTP 伺服器的管理員需要他們的 伺服器有最多的客戶連接,那麼必須得支持被動 FTP 。我們可以通過為 FTP 伺服器指定一個有限的埠範圍來減小 伺服器高位埠的暴露 。這樣,不在這個範圍的任何埠會被 伺服器的防火牆阻塞 。雖然這沒有消除所有針對伺服器的危險,但它大大減少了危險 。

[火星人 ] 主動FTP與被動FTP-權威解釋已經有455次圍觀

http://coctec.com/docs/linux/show-post-203998.html