FTP傳輸Port模式和 Passive模式

原文地址:FTP傳輸Port模式和 Passive模式 作者:ja_xiaok
當你對一個FTP問題進行排錯時候,你首先要問的一個問題是使用的是port模式的還是passive模式。因爲這兩種行爲迥異,所以這兩種模式引起的問題也不同;在過去,客戶端缺省爲active(port)模式;近來,由於Port模式的安全問題,許多客戶端的FTP應用缺省爲Passive模式。

數據傳輸的連接:

               port模式是服務器用20端口主動連接客戶端的臨時端口。
               Passive模式是客戶端用臨時分配的端口要要求服務器也分配一個臨時端口來回應它。
               模式體現在服務器是主動還是被動。

簡單的說:
主動還是被動都是針對服務器(FTP Server)來說的:
一個就是FTP Client打開一個端口,Server用21端口去連接這個端口來建立連接。這就是PORT方式。
一個就是FTP Server打開一個端口,Client可以去連接這個端口來建立連接。這就是PASV方式。

判斷問題是否在傳輸出模式上
  在登錄FTP時,經常會出現各種各樣的錯誤,那麼哪些是因爲傳輸模式設置不正確所造成的呢?下面這些無法連接的例子,都可能是傳輸模式設置不正確導致的。
  1.當出現“426 data connection closed,transfer aborted”提示時,表示你採用了主動模式的話,而防火牆禁止了來自FTP服務器的主動連接。
  2.如果出現“550 Passive mode notallowed on this server”的信息地,則表明FTP服務器被設置成了不支持被動模式的連接。
  3.除此之外,“數據Socket錯誤,連接已超時”的錯誤也非常多見,這同樣是由傳輸模式設置不正確引起的。

FTP Port模式
Port模式的FTP步驟如下:

1、 客戶端發送一個TCP SYN(TCP同步)包給服務器段衆所周知的FTP控制端口21,客戶端使用暫時的端口作爲它的源端口;

2、 服務器端發送SYN ACK(同步確認)包給客戶端,源端口爲21,目的端口爲客戶端上使用的暫時端口;

3、 客戶端發送一個ACK(確認)包;客戶端使用這個連接來發送FTP命令,服務器端使用這個連接來發送FTP應答;

4、當用戶請求一個列表(List)請求或者發起一個要求發送或者接受文件的請求,客戶端軟件使用PORT命令,這個命令包含了一個暫時的端口,客戶端希望服務器在打開一個數據連接時候使用這個暫時端口;PORT命令也包含了一個IP地址,這個IP地址通常是客戶自己的IP地址,而且FTP也支持第三方(third-party)模式,第三方模式是客戶端告訴服務器端打開與另臺主機的連接;

5、服務器端發送一個SYN包給客戶端的暫時端口,源端口爲20,暫時端口爲客戶端在PORT命令中發送給服務器端的暫時端口號;

6、 客戶端以源端口爲暫時端口,目的端口爲20發送一個SYN ACK包;

7、 服務器端發送一個ACK包;

8、發送數據的主機以這個連接來發送數據,數據以TCP段(注:segment,第4層的PDU)形式發送(一些命令,如STOR表示客戶端要發送數據,RETR表示服務器段發送數據),這些TCP段都需要對方進行ACK確認(注:因爲TCP協議是一個面向連接的協議)

9、當數據傳輸完成以後,發送數據的主機以一個FIN命令來結束數據連接,這個FIN命令需要另一臺主機以ACK確認,另一臺主機也發送一個FIN命令,這個FIN命令同樣需要發送數據的主機以ACK確認;

10、客戶端能在控制連接上發送更多的命令,這可以打開和關閉另外的數據連接;有時候客戶端結束後,客戶端以FIN命令來關閉一個控制連接,服務器端以ACK包來確認客戶端的FIN,服務器同樣也發送它的FIN,客戶端用ACK來確認。

FTP Port模式會給網絡管理人員在許多方面帶來很多問題,首先,在PORT命令消息中的IP地址和端口號的編碼不是直白地顯示。另外,應用層的協議命令理論上不應該包含網絡地址信息(注:IP地址),因爲這打破了協議層的原則並且可能導致協同性和安全性方面的問題。

使用FTP時候,網絡中的防火牆必須要聲明相應的端口,防火牆必須要跟蹤FTP對話然後檢查PORT命令,防火牆必須要參與從服務器端到客戶端在PORT命令中指定的端口連接的建立過程。

如果網絡中使用了NAT(注:網絡地址翻譯),那麼NAT的網關同樣也需要聲明相應的端口,網關需要把在PORT命令中指定的IP地址翻譯成分配給客戶的地址,然後重新計算TCP的Checksum;如果網關沒有正確地執行這個操作,FTP就失敗了。

FTP Passive模式

下面的列表描述了Passive模式的FTP的步驟,步驟1到3和Port模式FTP相同,步驟9到11同樣與Port模式FTP最後三步相同。

1、客戶端發送一個TCP SYN(TCP同步)包給服務器段衆所周知的FTP控制端口21,客戶端使用暫時的端口作爲它的源端口;

2、服務器端發送SYN ACK(同步確認)包給客戶端,源端口爲21,目的端口爲客戶端上使用的暫時端口;

3、客戶端發送一個ACK(確認)包;客戶端使用這個連接來發送FTP命令,服務器端使用這個連接來發送FTP應答;

4、當用戶請求一個列表(List)或者發送或接收文件時候,客戶端軟件發送PASV命令給服務器端表明客戶端希望進入Passive模式;

5、服務器端進行應答,應答包括服務器的IP地址和一個暫時的端口,這個暫時的端口是客戶端在打開數據傳輸連接時應該使用的端口;

6、客戶端發送一個SYN包,源端口爲客戶端自己選擇的一個暫時端口,目的端口爲服務器在PASV應答命令中指定的暫時端口號;

7、服務器端發送SYN ACK包給客戶端,目的端口爲客戶端自己選擇的暫時端口,源端口爲PASV應答中指定的暫時端口號;

8、客戶端發送一個ACK包;

9、發送數據的主機以這個連接來發送數據,數據以TCP段(注:segment,第4層的PDU)形式發送(一些命令,如STOR表示客戶端要發送數據,RETR表示服務器段發送數據),這些TCP段都需要對方進行ACK確認;

10、當數據傳輸完成以後,發送數據的主機以一個FIN命令來結束數據連接,這個FIN命令需要另一臺主機以ACK確認,另一臺主機也發送一個FIN命令,這個FIN命令同樣需要發送數據的主機以ACK確認;

11、客戶端能在控制連接上發送更多的命令,這可以打開和關閉另外的數據連接;有時候客戶端結束後,客戶端以FIN命令來關閉一個控制連接,服務器端以ACK包來確認客戶端的FIN,服務器同樣也發送它的FIN,客戶端用ACK來確認。

一個PASV請求要求服務器在服務器選擇的一個新的端口上接受數據連接,PASV命令沒有任何參數,服務器端的迴應只是一行顯示服務器IP地址和服務器接受連接的TCP端口號。

=====================================<二>====================================
什麼叫做PASV mode(被動模式傳送)?他是如何工作的?
FTP的連接一般是有兩個連接的,一個是客戶程和服務器傳輸命令的,另一個是數據傳送的連接。FTP服務程序一般會支持兩種不同的模式,一種是Port模式,一種是Passive模式(Pasv Mode),我先說說這兩種不同模式連接方式的分別。
先假設客戶端爲C,服務端爲S.
Port模式:
當客戶端C向服務端S連接後,使用的是Port模式,那麼客戶端C會發送一條命令告訴服務端S(客戶端C在本地打開了一個端口N在等着你進行數據連接),當服務端S收到這個Port命令後就會向客戶端打開的那個端口N進行連接,這種數據連接就生成了。
Pasv模式:
當客戶端C向服務端S連接後,服務端S會發信息給客戶端C,這個信息是(服務端S在本地打開了一個端口M,你現在去連接我吧),當客戶端C收到這個信息後,就可以向服務端S的M端口進行連接,連接成功後,數據連接也建立了。
從上面的解釋中,大家可以看到兩種模式主要的不同是數據連接建立的不同,對於Port模式,是客戶端C在本地打開一個端口等服務端S去連接建立數據連接;而Pasv模式就是服務端S打開一個端口等待客戶端C去建立一個數據連接。

簡單的說:
一個就是FTP Server打開一個端口,Client可以去連接這個端口來建立連接。這就是PASV方式。
一個就是FTP Client打開一個端口,Server去連接這個端口來建立連接。這就是PORT方式。

至於如何FXP,目前還沒有找到哪個服務器支持FXP,所以只能先把網上找到的理論貼一下,以後再嘗試FlashFxp
正常FXP要求(Serv-u):FXP中的兩個FTP(單獨相應的上傳下載正常)必須全部開放FXP功能(“攔截 FTP_bounce”攻擊和FXP 不能選),而且源(上傳)服務器的連接模式必須是PASV(絕不能是PORT模式)!這是FXP的必要條件!
http://bbs.et8.net/bbs/archive/index.php?t-415246.html

更詳細的基礎文章(轉載):
目錄

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

開場白

FTP是一種文件傳輸協議,它支持兩種模式,一種方式叫做Standard (也就是Active,主動方式),一種是 Passive (也就是PASV,被動方式)。 Standard模式 FTP 的客戶端發送 PORT 命令到FTP server。Passive模式FTP的客戶端發送 PASV命令到 FTP Server。
處理防火牆和其他網絡連接問題時最常見的一個難題是主動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端口到大於1024的端口(服務器響應客戶端的控制端口 S->C)
FTP服務器的20端口到大於1024的端口(服務器端初始化數據連接到客戶端的數據端口 S->C)
大於1024端口到FTP服務器的20端口(客戶端發送ACK響應到服務器的數據端口 S<-C)

畫出來的話,連接過程大概是下圖的樣子:
FTP傳輸Port模式和 Passive模式

在第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端口到任何大於1024的端口 (服務器響應到客戶端的控制端口的連接 S->C)
從任何端口到服務器的大於1024端口 (入;客戶端初始化數據連接到服務器指定的任意端口 S<-C)
服務器的大於1024端口到遠程的大於1024的端口(出;服務器發送ACK響應和數據到客戶端的數據端口 S->C)

畫出來的話,被動方式的FTP連接過程大概是下圖的樣子:
FTP傳輸Port模式和 Passive模式

在第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服務器指定一個有限的端口範圍來減小服務器高位端口的暴露。這樣,不在這個範圍的任何端口會被服務器的防火牆阻塞。雖然這沒有消除所有針對服務器的危險,但它大大減少了危險。詳細信息參看附錄1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章