和xx监狱ftp传输对账文本,投产后对方ftp能登陆但始终不能dir/ls,(
会出现超时卡死 )并且报227 Entering Passive Mode (1,2,3,4,8,174)。
找了很久资料发现,对方ftp server返回的227代码内1,2,3,4->1.2.3.4 ip是其内网ip,与我们实际访问的专线对端ip地址(2.3.4.5)不一致。这导致登陆后ftpserver指定的访问ip我们实际是不能访问的。监狱方使用的是vsftp。尝试沟通让对方配置文件进行修改:
/etc/vsftpd.conf:pasv_address= 2.3.4.5 。然后就成功解决。原理如下:
我们可以看到如上图,ftp被动模式下正常登陆并数据交互的标准流程代码,根据FTP协议的定义,在请求目录信息时,我们需要一个用于文件及目录数据获取的IP地址和端口,FTP服务器将采用227命令来回复已准备好连接的IP地址和端口【前四位是ip,第五位*256+第六位 是端口】,然后我们则根据返回的IP地址和端口进行连接,连接成功后,再等待ftp服务器返回150命令字并开始传送文件/目录数据
冲突在于:默认情况下返回的是内网实际ip,我们实际能请求访问的是转换后的专线入口地址,处于外网的我们当然无法直接访问监狱的内网。
至此生产问题解决,但是在查资料过程中还有额外收获一并记录分享。
1、因为是命令行请求没那么智能,发现有网友提到这种情况下,使用专用ftp客户端登录时,227多次请求无法访问该地址后,会智能尝试替换成为登陆成功时用的主机地址(即我们这里的专线地址)。 所以有时候用客户端登陆却又是没问题的。
2、刚刚我们生产问题解决的方案其实是有隐患的,
/etc/vsftpd.conf:pasv_address= 2.3.4.5 设置后该ftp所有账户全局只能通过分配给我行的专线入口ip才能进行文件数据传输操作,因为227指令会始终推
2.3.4.5 这个分配给我行的专线ip。由于监狱方配置文件修改较为困难且当前项目为我行独有中标,便未进一步推进狱方配置优化。仍在此记录优化方案以便不时之需:
配置思路为将全局配置改为单用户配置,重置前述配置修改:
①在狱方ftp服务器上的VSFTP配置文件(/etc/vsftpd.conf)中加入以下一行,打开用户独立配置功能:
user_config_dir=/etc/vsftpd/userconfig#指定单用户配置文件路径
②在狱方服务器(/etc/vsftpd/userconfig)路径下新建一个和FTP用户名的文件,写入如下内容:
pasv_addr_resolve=yes
pasv_address=2.3.4.5
3、如果ftpserver 是绑定动态域名和端口转发 的, pasv_addr_resolve=yes 一定要设置为yes
4、 listen = YES和listen_ipv6 = YES 配置不当会冲突。
同时开启传入的连接被解释为IPv6地址,因此IPv4 pasv_address未使用 ,一般情况下建议ipv6注释掉
以上很多细节tips均源于网络,这里只是顺带集合整理,具体外链不一一列举。