今天遇到一個問題:公司開發的系統,在客戶機房上線後,因為FTP服務器不能直接掛接在外網上,必須通過在路由器上進行NAT映射方式。
假設我們的路由器外網IP為1.2.3.4,FTP的內網IP為192.168.1.100,FTP的端口號為10000。采用FileZilla Server作為FTP服務器。
此時,需要在路由器上開放10000端口,映射到FTP的IP和端口上。
FileZilla Server設置為PASV模式,端口設置為10000-10000,指定IP為1.2.3.4。
在外網,用FileZilla Client登錄,因Client默認為PASV模式,發現可以Log on,但無法實現數據傳輸。修改為PORT模式後,就可以正常進行傳輸了。
通過在手機上的一個APP進行FTP連接,因為默認為PASV模式,同樣可以Log on,但無法實現數據傳輸。修改為PORT模式後,發現還是不能正常傳輸數據。
以前沒有仔細研究過類似問題,正好借此機會深入了解下PASV和PORT到底有啥區別。假設C為Client,S為Server。
PASV:當C向S連接後,S會發信息給客戶端C,這個信息是(S在本地打開了一個端口M,你現在來連接我吧)。當C收到這個信息後,就可以向S的M端口進行連接,連接成功後,數據連接也建立了。
PORT:當C向S連接後,C會發送一條命令告訴S(我在本地打開了一個端口N在等著你進行數據連接)。當S收到這個命令後 就會向客戶端打開的那個端口N進行連接,這種數據連接就生成了。
理解了原理之後,我們在看看實際配置的情況。顯然,在FileZilla Server上,只指定10000是不行的,需要給定一個連續的端口范圍,比如10000-10005,然後在路由器上對上述端口范圍也要進行映射。
嘗試此種方案後,問題順利解決。
為何不采用PORT模式呢?PORT模式最大的問題是,如果FTP Client同樣位於NAT之後,顯然從S到C的信道也是不通的。
為避免這種局限性,采用PASV是合理的選擇。