主動FTP vs. 被動FTP 權威解釋

來源:互聯網
上載者:User

目錄

       
  • 開場白
  • 基礎
  • 主動FTP
  • 主動FTP的例子
  • 被動FTP
  • 被動FTP的例子
  • 總結
  • 參考資料
  • 附錄 1: 配置常見FTP伺服器

開場白

處理防火牆和其他網路連接問題時最常見的一個難題是主動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<-C)
  • FTP伺服器的21連接埠到大於1023的連接埠(伺服器響應用戶端的控制連接埠 S->C)
  • FTP伺服器的20連接埠到大於1023的連接埠(伺服器端初始化資料連線到用戶端的資料連接埠 S->C)
  • 大於1023連接埠到FTP伺服器的20連接埠(用戶端發送ACK響應到伺服器的資料連接埠 S<-C)

畫出來的話,串連過程大概是的樣子:


第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<-C)
  • 伺服器的21連接埠到任何大於1023的連接埠 (伺服器響應到用戶端的控制連接埠的串連 S->C)
  • 從任何連接埠到伺服器的大於1023連接埠 (入;用戶端初始化資料連線到伺服器指定的任意連接埠 S<-C)
  • 伺服器的大於1023連接埠到遠端大於1023的連接埠(出;伺服器發送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:
   命令串連:用戶端 >1023連接埠 -> 伺服器 21連接埠
   資料連線:用戶端 >1023連接埠 <- 伺服器 20連接埠

被動FTP:
   命令串連:用戶端 >1023連接埠 -> 伺服器 21連接埠
   資料連線:用戶端 >1023連接埠 -> 伺服器 >1023連接埠

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


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

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

參考資料

O'Reilly出版的《組建Internet防火牆》(第二版,Brent Chapman,Elizabeth Zwicky著)是一本很不錯的參考資料。裡面講述了各種Internet協議如何工作,以及有關防火牆的例子。

最權威的FTP參考資料是RFC 959,它是FTP協議的官方規範。RFC的資料可以從許多網站上下載,例如:ftp://nic.merit.edu/documents/rfc/rfc0959.txt

Active FTP vs. Passive FTP, Appendix 1

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.