Net::FTP与net_cls端口隔离

Time: 五月 28, 2015
Category: cgroup

最近发现一个问题,部署脚本在下载部署包的时候总是报如下错误:

 Can't call method "sockport" on an undefined value at 
 /usr/lib/perl5/5.8.5/Net/FTP.pm line 837. 

这个部署脚本是用perl语言写的,通过ftp的方式来下载数据包。经过调试后发现,原来是开启了net_cls子系统并设置端口隔离造成的。因为Net::FTP模块总是默认以主动模式来接受数据,什么是主动模式呢?

FTP有两种使用模式:主动和被动。主动模式要求客户端和服务器端同时打开并且监听一个端口以创建连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。

Net::FTP在接收数据的时候会使用bind(0)的方式监听一个临时端口,让后把这个端口告诉服务器,服务器会与这个端口创建一个新的连接传输数据。问题在于,这个容器内设置了net_cls.bind_port_range,而端口0并不在这个范围之内,所以导致Net::FTP异常。

Leave a Comment