昨天搭建了一台FTPS服務器,過程中學習了很多不清楚的知識點,還有遇到的問題,記錄一下。
(大部分內容匯集、整理自網絡)
一. 關於FTP傳輸模式
眾所周知,FTP傳輸有兩種工作模式,Active Mode和Passive Mode(主動模式和被動模式),簡單描述連接過程如下:
主動模式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時, 客戶端在命令鏈路上用PORT命令告訴服務器:“我打開了***端口,你過來連接我”。於是服務器從20端口向客戶端的***端口發送連接請求,建立一條數據鏈路來傳送數據。
被動模式的連接過程是:客戶端向服務器的FTP端口(默認是21)發送連接請求,服務器接受連接,建立一條命令鏈路。當需要傳送數據時, 服務器在命令鏈路上用PASV命令告訴客戶端:“我打開了***端口,你過來連接我”。於是客戶端向服務器的***端口發送連接請求,建立一條數據鏈路來傳送數據。
了解模式的目的,是為了了解端口。使用 FTP 傳輸時,至少會使用到兩個 Port 來建立連接通道:
-
一個為指令通道(Command Channel),默認使用 Port 21 建立,用來傳輸 FTP 指令,例如:列出清單(LIST)、變更目錄(CWD)、取得目前的目錄(PWD)、......等。
-
另一個為數據通道(DATA Channel),默認使用 Port 20,但是會因 FTP Client 選擇使用的模式不同而有所不同。
二. 再次比較兩種傳輸模式
-
主動模式 ( Active mode )
FTP Client 跟 FTP Server 聯機后,會主動利用 PORT 指令提出 DATA Channel 聯機的要求,如下:
1
2
|
指令:PORT 10,18,53,171,17,114
回應:200 Port command successful.
|
這里的 PORT 指令是由 FTP Client 送出的,當需要建立 DATA Channel 時,FTP Server 會主動利用 Server 主機的 Port 20 發出聯機到 FTP Client 的主機,而 PORT 指令后的參數說明如下:
前四個數字是 FTP Client 的 IP 地址:10.18.53.171
后兩個數字是 FTP Client 接受聯機的端口號,端口號的計算方式是 (第五個數字 * 256 + 第六個數字),以此范例來說,FTP Client 接受的聯機端口號是 17 * 256 + 114 = 4,466
由此可知,如果 FTP Client 處於 NAT 的環境下的話,FTP Server 幾乎無法正常的聯機到 FTP Client 的主機,所以現在大部分的聯機模式幾乎都建議用戶使用被動模式(Passive mode)。
-
被動模式 ( Passive mode )
FTP Client 跟 FTP Server 聯機后,會主動利用 PASV 指令提出 DATA Channel 聯機的要求,如下:
1
2
|
指令:PASV
回應:227 Entering Passive Mode(59,37,124,43,158,251)
|
你可以看到由 FTP Client 送出的 PASV 指令並沒有送出其他的參數,而是在 FTP Server 響應的時候出現了(59,37,124,43,158,251) 字符串,當需要建立 DATA Channel 時,這時就會由 FTP Client 主動連至 FTP Server 動態開放的 Port 供 FTP Client 連接,其中 (59,37,124,43,158,251) 的說明如下:
前四個數字是 FTP Server 的 IP 地址:59.37.124.43
后兩個數字是 FTP Server 接受聯機的端口號,端口號的計算方式是 (第五個數字 * 256 + 第六個數字),以此范例來說,FTP Server 可接受的聯機端口號是 158 * 256 + 251 = 40,699
由此可知,使用被動模式(Passive mode)對 FTP Server 的系統管理員來說,可掌控的部分是比較多的,因為 FTP Server 無法決定用戶是否可使用主動模式聯機,但若改使用被動模式聯機的話,就幾乎能讓所有人正常的使用。
需要注意的是FTP Client每次下指令傳輸數據時,都會建立一次 Data Connection,指令包括取得遠程的檔案清單(LIST)時回傳的檔案列表、下載文件、或上傳檔案。
三. FTPS (FTP over SSL)
隱式安全: 當FTP客戶端連接到FTP服務器時,隱式安全將會自動和SSL連接一起開始運行。在隱式安全中服務器定義了一個特定的端口(TCP端口990)讓客戶端來和其建立安全連接。

當通過SSL/TLS來使用FTP時(縮寫為FTPS),FTP客戶端和FTP服務器之間的控制連接就被加密了,因此除了它們之外誰也不能讀懂它們之間的控制連接的信息。正式因為這樣,NAT/PAT設備和防火牆再也不能監控數據連接,並且從中得到有用的信息,從而再有針對性地做一些事情了(做些什么事呢?),所以FTPS協議在防火牆和NAT環境下的實際應用受到嚴重的限制。(見四.FTPS倒在防火牆上)
四.FTPS倒在防火牆上
我用的是Windows Server 2008 中IIS 7.0 配置FTP over SSL,配置好后,內網測試正常,然而從外網訪問時,能驗證用戶名和密碼,但報錯:
讀取目錄列表失敗
然而不使用SSL時從外網訪問正常。
總結為:
-
使用非 SSL 加密的 ftp 協議,可以正常登錄,能夠顯示目錄和文件列表
-
使用 FTPS (即SSL加密)協議,可以正常登錄。但是顯示目錄列表時,因為超時而失敗
是什么原因呢?
肯定和防火牆有關系!!為什么使用非 SSL 加密的 ftp 協議一切正常呢?
這時需要學習下NAT設備轉發的一些細節。
NAT的基本原理並不復雜,只是在網關設備上維護私網地址(端口)到公網地址(端口)的映射關系,通過修改流經網關的IP報文頭部實現地址轉換,但是在落實到具體的軟件實現中,還是有很多的細節值得玩味的。
多數協議在經過NAT網關時只需要使用普通的NAT轉換處理,但是對於一些特殊協議如FTP、RTSP、SIP等,由於這些協議在應用層中攜帶了IP地址或端口等信息,因此需要ALG的幫助才能正常穿越NAT網關。
以FTP協議為例,PORT模式的FTP在經過NAT時需要ALG的處理,因此NAT網關需要關注用戶的每一個FTP命令,並識別需要進行ALG處理的命令,進行相應的ALG處理。
可以認為現在的NAT、防火牆一般都有FTP應用層感知能力,它能夠截獲ftp會話中的PORT、PASSIVE,自動將private的ip翻譯成對外的正確的ip,並實時的在NAT上開放臨時端口轉發。
可見,使用SSL FTP后,數據包被加密了嘛,NAT設備無法識別到FTP命令,也就不會進行ALG處理,故無法建立數據通道連接。
五.解決方案
只有在防火牆上乖乖地配置NAT策略了,開啟所有使用到的端口。又因為數據通道端口是隨機的,所以必須先限定端口范圍。
1. IIS 7.0 配置被動模式FTP Data Channel 端口段方法:http://netside.blog.51cto.com/766556/1359368
2. 在防火牆上配置這些端口的NAT Policy。
六. 還有些問題
我的環境中,如果在FTP Server上配置“防火牆外部IP”功能時(配置方法見附錄4),在內部網絡連接FTP會報錯:
1
|
GnuTLS error-53:Error in the function.
|
取消這個設置,就恢復正常了,不知怎么解決,可能和使用自簽署的證書有關嗎。
但這樣外網用戶FTP客戶端軟件會遇到這樣一條消息:
1
2
3
|
命令: PASV
響應: 227 Entering Passive Mode (*,*,*,*,7,230).
狀態: 服務器發回了不可路由的地址。使用服務器地址代替。
|
*,*,*,*為服務器的私有地址
“使用服務器地址代替 ”聰明的客戶端軟件能夠自動替換地址。
但總覺得是個缺憾。
結束語
FTP協議是一個顯得稍微有點凌亂的協議,並且沒有任何為應用於防火牆環境中的特別設計。