映射内网ftp服务器到公网访问问题解决

时间:2024-02-18 22:16:12

  这两天公司测试环境有个需求要让合作方通过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

然后再进行访问发现数据可以正常传输,问题解决。