生产环境SFTP服务器连通的网络问题调查
背景
我们系统的生产环境地址是对公网不公开的,但为了和公网的其他系统交互,需要网络的同事建立网络策略。
问题1
一个公网系统开通了访问我系统sftp服务器的网络策略,已联通。但,一天,突然对端系统无法通过sftp方式访问我系统。
程序的报错为:
SFTP链接异常...............------------
Connect:Session.connect: System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。 ---> System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
问题1调查经过
- 单从程序报错来看,像是我方sftp服务器阻止了远程的连接。
- 接下来,确认对端系统的代码中配置的sftp用户名、密码没有错误。
- 使用命令 telnet sftp服务器IP sftp端口,确认网络是通的。此命令不论是linux、windows都可以使用。如果网络通,会进入telnet连接页面。如果不通,会提示“.... 连接失败”。
3. 抓包确认
windows系统,使用Wireshark工具;Linux系统使用tcpdump命令(需要root权限执行)
在执行sftp连接前,对端服务器和我方机器先执行抓包命令(工具),然后,执行sftp连接。
最后,确认网络没有问题。
4. 对端服务器切换另一台服务器后,访问我方sftp服务器,连接成功。证明我方sftp服务器没有问题。问题出在对端的第一台服务器上。
5. 对端的服务器管理员检查后,发出他们服务器在出口有安全的策略,禁止了一些远程协议。而此安全策略有时会误判。对端的服务器修改出口的安全策略后,问题解决。
问题2
网络策略已开通,对端系统也可以登录SFTP服务器。某一天,对端系统反馈他们无法登录了。
问题2调查经过
我方和对端都检查了网络策略没有发生过变化,sftp连接数也没有超限。于是,要求对端检查代码中配置中的用户/密码或其他配置是否修改完。
对端最终检查出,由于修改其他问题时,不小心修改了sftp依赖包的版本,导致问题发生。
恢复sftp依赖包的版本后,问题解决。
总结:SFTP无法连接时的调查方向
- 用户名、密码是否正确输入
- 双方的网络是否打通
- 双方的网络策略、安全策略是否发生过变更
- sftp的连接数是否超限
- sftp依赖包的版本是否发生过变化