网络环境:
两个独立的内网环境,前端都有路由和防火墙的管控。要在这两个独立的内网使用ftp通过互联网进行通信。
首先,ftp server 服务端口默认修改为:2100 数据端口修改为:21000
将这两个内网服务器端口通过路由映射到公网端口。
ftp server 使用的vsftpd的被动模式。
被动模式:
命令连接: 客户端大于1024端口 --> 服务器端21端口
数据连接: 客户端大于1024端口 --> 服务器端被动端口
我这里 FTP默认端口2100 数据端口设置为21000 客户端通过ftp命令连接出现如下情况。
客户端命令如下:
[root@localhost ~]# ftp (公网IP) 2100
Connected to [公网IP] (公网IP).
220 (vsFTPd 2.2.2)
Name ([公网IP]:root): ftp用户名
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (10,0,10,5,82,8).
ftp: connect: Connection timed out # 这里无法查看数据,也就是数据端口无法连接,通过上面的连接查看,直接发送到10.0.10.5 2100 这样显示是无法连接内网IP的。
ftp>
通过以上事件,得知问题出在无法连接数据端口上。研究了很久,windows下通过ftp工具能够正常连接。但是cmd下ftp命令和linux下ftp命令均出现这种情况。
最后得知Linux 下 lftp同样可以进行ftp连接。于是就进行了尝试,结果如下:
可以看到这次,无论是命令连接还是数据连接socket都是正确的。
查看文件同样也OK了。 这算是踩了一个Linux ftp客户端使用的坑。