今天從公網的服務器連接本地內網的FTP server copy文件時,系統老是提示227 Entering Passive Mode (xxx,xxx,,xxx,xxx,x),很是奇怪,於是上網找資料仔細研究了一下,原來FTP有兩種工作模式,PORT模式和PASV模式.
在主動模式下,FTP客戶端隨機開啟一個大於1024的本地端口(比如N號端口)向服務器的21號端口發起連接,然后開放N+1號端口進行監聽,並向服務器發出PORT N+1命令。
服務器接收到命令后,會用其本地的FTP數據端口(通常是20)來連接客戶端的N+1號端口進行數據傳輸。
在被動模式下,FTP庫戶端隨機開啟一個大於1024的本地端口(比如N號端口)向服務器的21號端口發起連接,同時會開啟N+1號端口,
然后向服務器發送PASV命令通知服務器自己處於被動模式。服務器收到該命令后,會開放一個大於1024的端口(比如P號端口)進行監聽,
然后用PORT P命令通知客戶端,而自己的數據端口是P。客戶端收到命令后,會通過N+1號端口連接服務器的P號端口,
最后在客戶端N+1號端口和服務器的P號端口之間進行數據傳輸。
用下面的圖例會更清晰說明兩者之間的區別:
*主動模式
命令連接:客戶端 大於1024 端口 → 服務器 21 端口
數據連接:客戶端 大於1024 端口 ← 服務器 20 端口
*被動模式
命令連接:客戶端 大於1024 端口 → 服務器 21 端口
數據連接:客戶端 大於1024 端口 → 服務器 大於1024 端口
總的來說,主動模式是服務器主動連接客戶端的數據端口,被動模式是服務器被動地等待客戶端連接自己的數據端口。
被動模式通常用在處於防火牆之后的FTP客戶端需要訪問外界FTP服務器的場景,因為在這種場景下,防火牆通常被配置為不允許外界訪問防火牆之后主機,而只允許防火牆之后的計算機發起的連接請求。因此在這種場景下不能使用主動模式,而被動模式可以良好的工作。
由於我的本地FTP服務器在內網,只是從外網映射了兩個端口(20,21),即FTP服務器處於防火牆之后,所以應該使用主動模式。
ftp> passive
Passive mode off.
ftp> passive (再次運行命令可打開)
Passive mode on.