Day 3183 被动FTP续:使用Bitvise SSH Server建立内网对公网的主动FTP通道

在前面的一篇文章中(Day#3158),曾经提到本地的内网与放在公网上的某服务器相性不合,被动FTP总是不能正常工作,主要表现为长时间的数据传输(无论上传下载)时,过一段时间(大约30秒至1分钟)速度就会急剧下降,到最后数据连接超时关闭。

曾尝试过许多办法尝试解决这个问题,包括对服务器本身的配置和FTP服务器配置的修改,甚至直接关掉服务器的防火墙,但都没有成功,故而认为问题主要出现在本地内网出口上的设备上。据个人所知,出口上有一个所谓的「上网行为管理系统」,负责管理内网用户的上网行为,还有一个线路自动切换的设备(或策略)来判定对公网的连接应该走电信或者联通(网通)的线路,这些都可能是问题所在,但集团网络中心的人不愿为单个问题去修改设置,所以剩下能修改的地方都已Out of control。

如果说专门的FTP客户端(例如FlashFXP)还能通过一定手段重传的话,那么正在用的一款网站内容采集软件则是主要的障碍之一,这款软件的PORT模式运行正常,但PASV模式就问题百出:一旦遇上数据连接断线,那么重新连接后,就会一个劲的报续传失败,最后整篇文章因为这个而发布失败(因为设定了先上传文件再发布文章,总不能在一篇文章里到处都是×和半截图吧)。

经过与FTP服务器FileZilla Server的作者讨论,并dump了数据包进行分析,发现这款软件有一个很诡异的设定:当在PASV模式下续传文件时,软件的运行过程如下:登录并切换目录后,首先发送SIZE查询已上传的文件大小,然后发送APPE指令通知服务器将要续传文件,但接下来程序没有发送任何文件数据,就以正确的方式(TCP FIN)关闭了数据连接(而不是RST等异常关闭),于是服务器响应226 Successfully appended file,软件会再次使用SIZE查询文件大小,很显然大小与「续传」前相同,于是上传「失败」,重复几次达到最大错误次数后,软件即报上传失败。

与软件作者联系人家不承认,ft。

但是软件还得用,怎么办呢,有的人说换一款软件不就好了,那你帮我重写80多条采集规则谢谢,那么就只能在工作相对正常的PORT模式上下功夫。

经过一段时间的搜索及实验,暂时用Bitvise SSH Server这款SSH服务器解决了问题,使用同一公司出品的Bitvise SSH Client打开SOCKS5代理,在使用FlashFXP试验时,PORT和PASV模式都使用正常。

但某采集软件就是个奇葩:不论如何进行设定,PORT模式向服务器汇报的IP总是127.0.0.1(因为Socks5代理绑定到本地),而PASV数据包的错误一如既往,看来并没有通过SSH通道进行加密(如果加密了理应规避PASV FTP的不正常现象)。

最终的解决方案是:绕过原本部署的FileZilla Server,使用Bitvise SSH Server本身的SFTP功能和Bitvise SSH Client的SFTP-to-FTP Bridge,将采集软件连接的FTP指向本机的SFTP-FTP Bridge并强制使用PORT模式,这下清静了。

因为本Blog没什么人看所以详细的步骤略过(其实配置起来也很容易,另外一点就是感觉写多了好麻烦),如果有需要请于下方评论,我再把详细的步骤写出来。

注:所有评论将在审核通过后显示,请不要在评论内容的任何位置出现链接,否则您的评论将被自动移入回收站,且永远不会被复审。

All comments will be available after being manually reviewed, please do not include any links anywhere in your comment, otherwise your comment will be automatically deleted and are not eligible for review.

4 条评论

    1. 因为这个问题已经影响到我的日常工作了。
      具体是什么牌子的行为管理硬件不知道,只记得有次去机房看见装了一台F5负载均衡器,应该和那个没关系吧。

  1. 负载均衡器……有!
    以前被坑过,我是做的http服务,结果以前曾被负载均衡把一条连接拆成两个乱发,结果两边都出错。
    这些优化设备有时候真心很坑。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注