ftp连接原理

關於 FTP

事實上﹐僅知道如何操作 iptables 工具﹐還不足以設定好您的防火牆及 NAT ﹐您還要對各種 TCP/IP 服務都要有相當程度的了才行﹕您必須知道一個連線的建立過程是怎樣的﹐每一個封包動作是怎樣從一端送到另一端的。您除了要知道每一個封包的來源和目的位址﹐還要知道它們的來源埠口和目的埠口。而且﹐我們不要忘記了﹕所有連線都是雙向的﹐您除了要照顧從客戶端到伺服器端的請求﹐也要照顧從伺服器到客戶端的回應。下面﹐讓我們看一看火牆的設定如何影響 FTP 的運作的( FTP 是一個非常經典的 NAT/Firewall 設定範例)。

首先﹐我們要知道 FTP 的連線模式有兩種﹕主動模式( active )和被動模式( passive )。要了解這兩個模式的不同﹐得要了解 FTP 的連線是怎樣建立的﹕

在正常模式下﹕

 

  1. FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21請求連線。當順利完成 Three-Way Handshake 之後﹐連線就成功建立﹐但這僅是命令通道的建立。
  2. 當兩端需要傳送資料的時候﹐client 透過命令通道用一個 port 命令告訴 server ﹐客戶端可以用另一個高於 1024 的 port 做數據通道﹐並準備好 socket 資源。
  3. 然後 server 用 port 20 和剛才 client 所告知的 socket 建立數據連線。請注意﹕連線方向這是從 server 到 client 的﹐TCP 封包會有一個 SYN 旗標。
  4. 然後 client 會返回一個帶 ACK 旗標的確認封包﹐並完成另一次的 Three-Way Handshake 手續。這時候﹐數據通道才能成功建立。
  5. 開始數據傳送。

 

在 passive 模式下﹕

 

  1. FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21請求連線﹐並完成命令通道的建立。
  2. 當兩端需要傳送資料的時候﹐client 透過命令通道送一個 PASV 命令給 server﹐要求進入 passive 傳輸模式。
  3. 然後 server 像上述的正常模式之第 2 步驟那樣﹐挑一個高於 1024 的 port ﹐並用命令通道告訴 client 關於 server 端用以做數據通道的 socket。
  4. 然後 client 用另一個高於 1024 的 port 呼叫剛才 server 告知的 scoekt 來建立數據通道。此時封包帶 SYN 標籤。
  5. server 確認後回應一個 ACK 封包。並完成所有交握手續、成功建立數據通道。
  6. 開始數據傳送。

 

我們都知道﹕火牆的保護對象是內部網路的 client 主機。防火牆為了擋掉一些來自外面的危險動作﹐通常會限制那些來自外面的主動連線﹐也就是帶 SYN 標籤的封包(請參考 Three-Way Handshake 的過程)。在這樣的情況下﹐iptables 或許有這樣的一個設定﹕

iptables -I INPUT -i ppp0 -p TCP --syn -j DROP 
iptables -I FORWARD -i ppp0 -p TCP ! --syn -j ACCEPT

在第二行中的那個 " ! " 就是 NOT 的意思﹐" ! --syn " 就是 NOT SYN 之意﹐也就是只允許非主動連線的 TCP 封包從外部界面進入﹐這和第一行的意思一樣﹕不接受來自外面主動建立的連線。

 

Tips﹕前面我們已經說過我們可以將傳到 NAT 外部界面的連線轉到 DMZ 裡面去。假如我們有這樣的要求﹐卻繼續沿用前面那行帶 " ! -y " 的規則的話﹐外面的客戶主機就無從建立連線來連接我們的服務主機了。但我們又不想取消它﹐以免危害到其它非 DMZ 的內部網路。

還記得 iptables 的行為習慣嗎﹕它會自上而下的對比規則﹐找到符合的就不再往下找了。根據這樣的特性﹐我們可以將 NAT 外部界面進入的某些連線﹐在那行 syn 過濾規則之前 ACCEPT 進來。不過﹐就要非常小心別漏了必要的限制元素﹐有可能的話﹐盡您想象把規則設得嚴密又嚴密吧。

 

假設我們這時候有一個在防火牆之後的 FTP client 要試圖連接外面的 FTP server 。在正常模式下﹐(第 3 步)來自 server 的數據通道之建立請求就會被擋下來﹐這會導致數據通道無從建立。雖然您可以 login 進遠端的 FTP 伺服器﹐但如果輸入 ls 後﹐卻看不到結果的。FTP 的 login 與 ls 是透過命令通道進行的﹐因為命令通道的建立並沒問題﹐所以 server 可以收到命令。但 ls 的結果確需要透過數據通道送回來﹐然而數據通道卻不能建立建立。所以 server 在傳送失敗後﹐再用命令通道告訴您﹕ “Can't build data connection: Connection refused.”

明白了﹖是否解釋了困繞您心目中以久的疑團呢﹖ ^_^

好了﹐如果用 Passive 模式又會如何呢﹖讓我們回去看看正常模式的第 3 步和 Passive 模式的第 4 步﹐然後檢查它們進出防火牆的方向﹐以及防火牆如何處理 SYN 封包就知道了。我不想直接把答案告訴您。自己要懂得思考﹐才會有進步﹗不是嗎﹖

猜你喜欢

转载自ydlmlh.iteye.com/blog/1735438
今日推荐