在生产服务器上,我有一个自动化任务,每分钟通过网络向远程生产服务器发送一次相同的 SSH 命令和数据量。唯一可能改变的是对象中的几个值。这个过程已经在程序中运行多年,没有出现问题。没有任何本地更改,我们开始出现随机的ECONNRESET
和Connection lost before handshake
错误实例。一开始每天只有几个,后来增加到每小时多个。目标服务器管理员说他们的日志没有提供有用的信息……只是说Received disconnect from <origin_ip> port 21549:11
或pam_unix(sshd:session): session closed for user <username>
。
由于连接最初是成功的(socket connected
),ssh -vvv
或者我的 ssh 工具中的等效功能在发送所有数据之前连接中断时无法收集其他数据。有时套接字连接后不到 12 秒就会断开连接。
我运行mtr <destinatioin_ip>
检查跟踪,发现在 9 个跳转中,只有最后一跳(目的地)有数据包丢失。通常情况下,丢失率在 12% 到 20% 之间。从不低于 6%。但考虑到它使用的是 ping/ICMP,有时会受到限制,我认为它不能可靠地确认 ssh 连接存在问题。因此,我运行mtr -T -P 22 <destination_ip>
检查 SSH/TCP,它经常显示前 8 个跳转的丢失率为 0%,仅在目的地第 9 个跳转处丢失了多达 29% 的数据包。但不太常见的是,它有时在前 8 个跳转中都显示高达 50% 的数据包丢失,并且从未到达第 9 个跳转。令人困惑。
在进行上述测试或让自动化程序自行重试时,最终目标服务器将阻止我的所有 SSH 连接。此时ssh -vvv <destination_ip>
将挂起,然后显示连接超时:
ssh -vvv <user@destination_ip>
OpenSSH_7.6p1 Ubuntu-4ubuntu0.7, OpenSSL 1.0.2n 7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "<destination_ip>" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to <destination_ip> [<destination_ip>] port 22.
debug1: connect to address <destination_ip> port 22: Connection timed out
ssh: connect to host <destination_ip> port 22: Connection timed out
为了解决这个问题connection timed out
,目标服务器管理员说他重新启动了 ssh 服务器。此时我可以再次连接,但随机断开连接的情况会继续,直到最终再次被完全阻止。
pfSense 是与 Ubiquiti 交换机一起用于源服务器网络的防火墙。源防火墙显示没有被阻止的 SSH 连接,并且与目标服务器同时建立的 SSH 连接从未超过 2-3 个。
以上内容是否足以说明问题至少不是我的服务器,而可能是目标服务器(跳数 9)?如果原因出在本地,我还应该在本地查看其他内容以进行隔离吗?
我完全控制本地生产服务器。问题是,如果没有足够的证据证明问题不是本地问题,我就很难让远程团队上报,让他们做进一步的研究。
故事结束。问题已确定。没有讨论限制 ping。如果他们不承担责任,请升级。