几年前,我就遇到了一个十分诡异的问题,当时就发现所有经过ICS(Internet Connection Sharing,Windows提供的共享网络连接的功能)的FTP连接都无法正常工作,都会在建立连接的过程当中卡在客户端发送FEAT命令之后,存在问题的连接过程大致如下:
已连接
服务器> 220 Welcome!
客户端> AUTH TLS
服务器> 502 SSL/TLS authentication not allowed
客户端> AUTH SSL
服务器> 502 SSL/TLS authentication not allowed
客户端> USER USERNAME
服务器> 331 Password required for USERNAME
客户端> PASS
服务器> 230 Logged on
客户端> FEAT
服务器> 211-Features:
服务器> MDTM
服务器> REST STREAM
服务器> SIZE
服务器> MLST type;size;modify*;
服务器> MLSD
服务器> UTF8
服务器> CLNT
服务器> MFMT
服务器> 211 End
连接断开
也就是说,当客户端每次发送FEAT命令,服务器返回211-Features后,连接就会断开。问题出现时,在服务器上除了连接断开的信息外,看不到任何错误提示,而在客户端上则显示连接超时。
一开始我以为问题出在FileZilla Server/Client上,因为我们的FTP服务器和客户端用的都是FileZilla的产品,更换成一些可以禁用FEAT命令的客户端之后,可以解决这个问题,网上提供的解决方案也都是让用户禁用FEAT命令。但是这个方法并不治本。
最近又在配置FTP服务器,相同的问题再一次出现,于是我决定这次一定要找到治本的方案。搜索一番发现,引起问题的是Windows的ALG服务(Application Layer Gateway Service),这个服务的描述为“为 Internet 连接共享提供第三方协议插件的支持”,通过观察注册表可以发现,这个服务应该主要是为了解决FTP等服务在穿过ICS(本质是NAT)时遇到的一些问题,但是实际上这个东西不仅没解决问题反而还引起了更多问题。
直接将ALG禁用,FEAT命令引起中断的问题便不会再出现了。
本作品使用基于以下许可授权:Creative Commons Attribution-NonCommercial 4.0 International License.
感谢你,太棒了!