我有一台服务器,该服务器有大约 100 个来自加拿大和美国各地客户端服务器的活跃 SSH 隧道连接。我们使用运行自定义 Ubuntu 版本的同一设备,并将其加载到连接到该服务器的每个客户端服务器上。最近,我尝试设置其中一些客户端服务器,当我尝试从这些客户端服务器连接到主服务器时,我收到连接超时。
以下是我采取的一些重要调试步骤及其结果:
- 尽管客户端服务器可以 ping 该服务器,但在尝试连接主服务器时却出现超时。
- 尝试通过 telnet 进入端口 22 时,连接超时,没有收到 SSH 确认
- 我可以从该客户端服务器通过 SSH 连接到主服务器以外的任何其他机器
- 其他机器可以通过 SSH 进入主服务器,即使与客户端服务器使用相同的 IP 地址
- 每个客户端服务器都具有与其他客户端服务器完全相同的操作系统版本
- 目前部署了大约 100 个来自其他使用相同配置的客户端服务器的活动连接,但只有这些新连接遇到了问题
- 我已将 SSH 连接尝试的最大次数 (MaxStartups) 以及 TCP 套接字连接的最大次数 (net.core.somaxconn) 分别增加到 2000 和 65535,但这并没有改善情况
我陷入困境,需要弄清楚为什么会发生这种情况。任何帮助都将不胜感激。谢谢!
答案1
经过大量的调查和谷歌搜索,我终于找到了根本原因,并最终找到了解决办法。排除网络和 DNS 问题后,我只剩下协议问题了。由于 Ping 可以工作,而 telnet 到端口 1 却不行,所以我知道这不是端口问题。在用 UDP 和 TCP 测试流量后,结果发现 TCP 是唯一出现问题的协议。
我跑去tcpdump
检查正在交换的数据包,立即注意到只有初始 SYN 数据包从客户端发送到服务器,并且没有返回 ACK。不幸的是,尚未找到根本原因。
经过netstat -s
多次尝试 ssh 连接,唯一不合适的值是“由于时间戳,被动连接被拒绝”。我发现这个文章(日语)与此问题相关,并建议与 NAT 环境中的 tcp_tw_recycle 有关系。最终的结论是禁用 tcp_tw_recycle,结果是打开的 TCP 连接数增加了一倍,我们能够解决这个问题。这个 ServerFault回答详细讨论其后果。
希望这个答案对其他最终处理此极端情况的人有用。此外,有人对此解决方案有任何其他建议/警告吗?