FTP 的主動模式(active mode)和被動模式(passive mode)

 
  基礎
  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 )
  畫出來的話,連接過程大概是下圖的樣子:
按此在新窗口瀏覽圖片
  在第 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連接過程大概是下圖的樣子:
按此在新窗口瀏覽圖片
  在第 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 。

解決辦法,譬如leapftp,按F4,站點管理器,高級選項,“使用PASV模式”打勾去掉。

  參考資料
  O'Reilly 出版的《組建 Internet 防火牆》(第二版, Brent Chapman , Elizabeth Zwicky 著)是一本很不錯的參考資料 。裏面講述了各種 Internet 協議如何工作,以及有關防火牆的例子 。
  最權威的 FTP 參考資料是 RFC 959 ,它是 FTP 協議的官方規範 。RFC 的資料可以從許多網站上下載,例如:ftp://nic.merit.edu/documents/rfc/rfc0959.txt
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章