这两天公司测试环境有个需求要让合作方通过ftp推送数据,一般内网环境是不会对公网开放ftp服务的,但是因为是临时需求就帮着搭了ftp服务,并且做了公网映射。ftp服务搭好之后在内网访问正常,但是在公网访问出现可以登录无法传输数据。报错如下:
root># ftp 111.13.101.208 22220 Connected to 111.13.101.208 (111.13.101.208). 220 (vsFTPd 2.2.2) Name (111.13.101.208:root): user1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,1,180,184,171). ftp: connect: Connection timed out ftp> put 1.txt local: 1.txt remote: 1.txt 227 Entering Passive Mode (192,168,1,180,182,129). ftp: connect: Connection timed out
在网上查了说是ftp被动模式造成的,可以使用passive命令来开启或者关闭被动模式。但由于我这里是通过出口设备映射到公网,所以被动模式更符合需求,使用passive并不能解决问题。另外上面小括号里的(192,168,1,180,182,129)这一串字符搞的我很懵逼,这里明显应该是IP+PORT为什么是这个样子?网上查了下,最后两段是10进制端口转换成16进制拆分开转换成10进制,(lll¬ω¬) 拿上面的举个例子:
182--> 0xb6 #10转16 129-->0x81 #10转16 0xb681==46721 #16转10
关于被动模式的开启方法在服务器端修改了/etc/vsftpd/vsftpd.conf文件:
root># cat /etc/vsftpd/vsftpd.conf | grep -v "^#" anonymous_enable=NO local_enable=YES write_enable=YES local_umask=000 dirmessage_enable=YES xferlog_enable=YES xferlog_std_format=YES ascii_upload_enable=YES ascii_download_enable=YES chroot_local_user=YES listen=YES listen_port=22220 local_root=/home/user1 #想指定用户访问目录时可用此项来设置 pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES userlist_deny=NO
#以上为初始vsftp配置,下面是开启被动模式参数 pasv_enable=YES pasv_min_port=22221 pasv_max_port=22222
设置完成后重启服务,然后再次尝试访问:
ftp> ls 227 Entering Passive Mode (192,168,1,180,56,205). ftp: connect: Connection timed out ftp> ls 227 Entering Passive Mode (192,168,1,180,56,206). ftp: connect: Connection timed out ftp> ls 227 Entering Passive Mode (192,168,1,180,56,205). ftp: connect: Connection timed out ftp> bye 221 Goodbye.
还是出现报错,但是端口好像已经变成服务端设置的参数了。另外在使用内网机器直接通过公网IP访问ftp服务也出现报错,错误为:
425 Security: Bad ip connecting
然后在服务器配置文件中添加了如下参数,并重启服务器:
# vi /etc/vsftpd/vsftpd.conf 添加:pasv_promiscuous=yes #此选项激活时,将关闭PASV模式的安全检查,默认为NO # service vsftpd restart
内网通过公网IP访问ftp可以正常传输数据,而使用外网设备依然报错,后来注意到报错中(192,168,1,180,56,205)这里的地址为内网服务器的IP,外网设备发起连接的地址应该是映射的公网IP(111.13.101.208),很显然在ftp连接建立之后,服务器返回了自己真实的IP给客户端,但是客户端无法通过这个私有IP(192.168.1.180)发起数据传输请求,所以导致timeout。然后在网上找到了这样一个参数:
pasv_address #回传给客户端的IP
# vi /etc/vsftpd/vsftpd.conf 添加:pasv_address=111.13.101.208 #这里返回映射的公网IP给客户端
# service vsftpd restart
然后再进行访问发现数据可以正常传输,问题解决。