业务背景:业务中需要使用对方的FTP服务器,然后使用脚本自动登录FTP服务器并扫描对应目录,然后下载需要的文件。
问题:之前使用被动模式连接一直正常,突然有一天我方无法获取到正常下载文件;但是使用windows客户端是可以正常上传、下载的。
问题排查:
1、Windows客户端可以正常使用,说明网络是没问题的,ftp server也正常运行;
2、使用ftp命令/开启debug日志,查看每一步的信息;
看到关键信息:
*cmd* 'PASV'
*resp* '227 Entering Passive Mode (172,17,71,15,43,14)'
这里发送被动模式命令后,server返回的是内网地址(172.17.71.15),客户端会以内容地址加端口建立数据传输通道,从而导致数据传输失败。
3、Windows客户端为什么可以正常使用
细看Windows客户端连接过程中的信息,可以看到“状态: 服务器发回了不可路由的地址。使用服务器地址代替。”
-- 其实客户端是对这种情况做了兼容处理的。
4、windows客户端是如何处理的
查看客户端配置,“被动模式”配置项中包含如下配置
5、为什么之前正常,后来异常
对方网络进行了调整,之前FTP服务器是有公网IP的,后来添加了负载均衡设备,FTP服务器只有内网IP。
解决方案:
确定问题是server端被动模式下,给客户端返回的地址是内网IP,解决方法就是让它返回公网IP。修改方式如下:
1、linux下使用vsftp服务端
类似passive_address这样的配置
2、windows端FileZilla服务端
被动传输设置说明:
1.如果服务器本身直接拥有公网IP,可以选软件默认的“Default”。
2.如果服务器是在局域网里面,在一个网关后面,那么就要选择第二项“Use the follwoing IP”,并且在下面的输入栏填写公网的IP地址;否则,客户端用PASV被动模式可能无法连接FTP服务器。因为服务器是在内网中,在客户端使用PASV模式连接服务器的时候,服务器收到连接请求之后需要把自身的IP地址告诉客户端,由于服务器在内网中,它侦测到的IP地址是内网的(如192.168.0.5),它把这个IP地址交给客户端,客户端自然无法连接。在这里设置了指定的IP地址后,服务器就会把这个公网合法的IP地址提交给客户端,这样才能正常建立连接。如果服务器是动态IP的,那么可以选择下面的“Retrieve external IP address from”,利用FileZilla官方网站免费提供的IP查询页面获取当时的公网合法IP,然后服务器把这个公网合法IP地址提交给客户端。当然静态IP也可以用这个,只不过没有必要。