我有一台服务器,在加拿大和美国的客户端服务器上有100个左右的SSH隧道连接。 我们使用运行Ubuntu自定义构build的相同设备,并在连接到服务器的每个客户端服务器上加载该设备。 最近,我试图设置一些这些客户端服务器,并且在尝试从这些客户端服务器连接到主服务器时收到连接超时。
以下是我采取的一些重要的debugging步骤和结果:
我被卡住了,需要弄清楚为什么会发生这种情况。 任何帮助,将不胜感激。 谢谢!
经过大量调查和谷歌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?