SSH连接只在某些客户端上超时

我有一台服务器,在加拿大和美国的客户端服务器上有100个左右的SSH隧道连接。 我们使用运行Ubuntu自定义构build的相同设备,并在连接到服务器的每个客户端服务器上加载该设备。 最近,我试图设置一些这些客户端服务器,并且在尝试从这些客户端服务器连接到主服务器时收到连接超时。

以下是我采取的一些重要的debugging步骤和结果:

  1. 即使可以ping通服务器,客户端服务器在尝试连接到主服务器时也会收到超时。
  2. 尝试telnet到端口22时,连接超时而不是接收SSH确认
  3. 除了主服务器之外,我可以从客户端服务器的任何其他机器进行SSH连接
  4. 其他机器可以通过SSH连接到主服务器,即使与客户机服务器的IP地址相同
  5. 每个客户端服务器具有与其他客户端服务器完全相同的OS内部版本
  6. 从当前使用相同的configuration部署的其他客户端服务器有大约100个活动连接,但只有这些新的正在遇到问题
  7. 我已经将SSH连接尝试(MaxStartups)的最大数量以及TCP套接字连接(net.core.somaxconn)的最大数量分别增加到2000和65535,这并没有改善情况

我被卡住了,需要弄清楚为什么会发生这种情况。 任何帮助,将不胜感激。 谢谢!

经过大量调查和谷歌search,我find了根本原因,最终find了一个解决办法。 排除networking和DNS问题后,我只剩下协议。 由于Ping工作并且telnet到端口1没有,我知道它不可能是端口问题。 使用UDP和TCPtestingstream量后,事实certificate,TCP是唯一有此问题的协议。

我运行tcpdump来检查正在交换的数据包,我立即注意到只有最初的SYN数据包正在从客户端发送到服务器,并且ACK没有被返回。 不幸的是,还没有find根本原因。

通过在试用多个ssh连接之前和之后运行netstat -s ,唯一closures的值是“因时间戳被拒绝的被动连接”。 我发现这篇与这个问题有关的文章 (日文),并build议在NAT环境中与tcp_tw_recyclebuild立关系。 由此产生的结论是禁用tcp_tw_recycle,其结果是打开的TCP连接数增加了一倍,我们能够解决这个问题。 这个ServerFault 答案详细讨论了它的后果。

希望这个答案对于处理这个边缘案例的其他人来说是有用的。 另外,有没有人有任何额外的build议/警告与此解决scheme?