Linux

使用主動 FTP 模式而不是被動模式的風險

  • September 26, 2012

在伺服器上,我正在使用 Perl 腳本,該腳本計劃使用 FTP 從另一台伺服器定期下載一些文件。不幸的是,Perl FTP 模組中存在一些問題,導致腳本有時會失敗並意外終止。我發現這個問題可以通過從被動模式切換到主動模式來輕鬆解決。

如果我正確理解這兩種 FTP 模式之間的區別,使用主動模式意味著我需要在防火牆內打開某個埠範圍。我認為這會帶來一些安全風險。所以我的問題是是否有一些解決方法或一個好的做法,所以我可以在我的伺服器上使用活動模式,而不會造成任何額外的風險。

簡而言之:

  • FTP 連接由兩個流組成:命令(控制)和數據
  • 當套接字打開並且程式碼沒有顯式綁定到埠時,作業系統將使用其臨時埠範圍內的高編號埠 ( sysctl -a | grep ip_local_port_range)
  • 非 root 程序必須使用 >1024 的埠

主動模式 FTP

客戶端通過 21 埠連接到伺服器並建立命令流:

client:32198 -> server:21

客戶端必鬚髮送或接收一些數據,因此它通知伺服器在某個埠上連接回它。為此,它會發送類似於以下內容的 PORT 命令:

PORT 1,2,3,4,5,6

這是客戶端通知伺服器伺服器可以連接回客戶端(在埠 (5 * 256) + 6 = 1286 上的地址 1.2.3.4。

server:20 -> client:1286

通常,這是您看到活動模式 FTP 會話終止的地方;對於防火牆和負載均衡器,通常從客戶端 -> 伺服器的流量是預期的,但是伺服器發起到客戶端的連接通常被拒絕(負載均衡器通常足夠聰明,可以將此數據流與現有的命令流聯繫起來)。

您對需要在防火牆上打開埠範圍以促進此行為的理解是絕對正確的。

被動模式 FTP

在這種情況下,客戶端像以前一樣建立命令會話:

client:56221 -> server:21

但是當數據被傳送時,客戶端會發送一個PASV命令原語。伺服器響應客戶端應連接回的 IP:Port 組合(格式與PORT之前的請求類似。因此客戶端然後按如下方式連接到伺服器:

client:12347 -> server:4566

這繞過了上述活動模式的防火牆問題,因為連接是以傳統和預期的方式建立的。

被動模式的缺點是它在伺服器上消耗更多的套接字。在重負載環境中頻繁發出PASV原語最終可能導致埠耗盡。(套接字將在TIME_WAIT某個作業系統定義的時間段內停留在某個狀態(我認為在 Redhat 系統上約為 2 分鐘)。

關於你的問題

除非您真的遇到埠耗盡問題,否則被動模式會失敗而主動模式通常會成功是非常罕見的。通常是相反的。如果您能夠發布更多關於您偶爾收到的錯誤的資訊,我們可以進一步調試它。

我建議盡可能使用被動模式,因此我建議在使用主動模式 FTP 之前查看被動模式特定的故障以找出問題的根本原因。

引用自:https://serverfault.com/questions/291539