今天遇到一个问题:公司开发的系统,在客户机房上线后,因为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是合理的选择。