主動模式FTP:
在主動模式下,FTP客戶端從任何非專用端口下載數據(n >;1023)連接到FTP服務器的命令端口——端口21。然後,客戶端在N+1(N+1 >:= 1024)端口監聽發送消息,並通過N+1(N+1 >;= 1024)端口向FTP服務器發送命令。服務器將依次連接到用戶在本地指定的數據端口,如端口20。
基於服務器端防火墻,要支持主動模式FTP,需要打開以下交互中使用的端口:
L FTP服務器命令(21) port接受客戶端的任意端口(客戶端初始連接)。
L FTP服務器命令(21)端口到客戶端端口(>;1023)(服務器響應客戶端命令)
L FTP服務器數據(20)端口到客戶端端口(>:1023)(服務器初始化數據連接到客戶端數據端口)
L FTP服務器數據(20)端口接受客戶端端口(>:1023)(客戶端向服務器的數據端口發送ACK包)
如下所示:
在步驟1中,客戶端的命令端口與FTP服務器的命令端口建立連接,並發送命令“端口1027”。然後在步驟2中,FTP服務器向客戶端的命令端口返回“ACK”。在步驟3中,FTP服務器從它自己的數據端口(20)向客戶機先前指定的數據端口(1027)發起連接,最後客戶機在步驟4中向服務器返回“ACK”。
主動FTP的主要問題其實出在客戶端。FTP客戶端實際上並沒有建立到服務器數據端口的連接。它只是告訴服務器它監聽的端口號,然後服務器回來連接到客戶機指定的端口。對於客戶端的防火墻來說,這是建立壹個從外部系統到內部客戶端的連接,通常是被阻斷的。
主動FTP的示例:
下面是壹個活動FTP會話的實例。當然,服務器名稱、IP地址和用戶名都被更改了。在這個例子中,FTP會話來自testbox 1 . slack site . com(192.168.150.80),壹個運行標準FTP命令行客戶端的Linux工作站,發起到testbox2.slacksite.com(192.168.150.90),壹個運行ProFTPd 1.2的Linux工作站紅色文本是調試信息,它顯示了發送到服務器的實際FTP命令和生成的響應信息。服務器的輸出信息用黑色表示,用戶的輸入信息用粗體表示。
當我們仔細考慮這段對話時,我們會發現壹些有趣的事情。我們可以看到,當提交PORT命令時,它指定了客戶端的壹個端口(192.168.438+050.80),而不是服務器的。當我們使用被動FTP時,我們會看到相反的現象。讓我們來關註壹下PORT命令的格式。正如您在下面的示例中看到的,它是由逗號分隔的六個數字組成的序列。前四位代表IP地址,後兩位構成數據連接的端口號。將第五個數字乘以256,再加上第六個數字,就得到實際的端口號。以下示例中的端口號為((14*256)+178) = 3762。我們可以使用netstat來驗證這個端口信息。
testbox 1:{/home/p-t/slacker/public _ html } % FTP-d testbox 2
連接到testbox2.slacksite.com。
220 testbox2.slacksite.com FTP服務器準備就緒。
姓名(測試箱2:懶鬼):懶鬼
-& gt;用戶懶鬼
懶鬼需要331密碼。
密碼:TmpPass
-& gt;超越XXXX
230用戶懶鬼登錄。
-& gt;方式
215 UNIX類型:L8
遠程系統類型是UNIX。
使用二進制模式傳輸文件。
ftp & gt限位開關(Limit Switch)
ftp: setsockopt(忽略):權限被拒絕
-& gt;端口192,168,150,80,14,178
200端口命令成功。
-& gt;目錄
150打開文件列表的ASCII模式數據連接。
drwx - 3懶鬼用戶104 07 27 01:45 public _ html
226傳送完畢。
ftp & gt放棄
-& gt;放棄
221再見。