虽然这不是一个真正的编程问题,但也许任何人都对我的问题有所了解。
这很奇怪。当我通过 ssh 远程连接我们的一台 ubuntu 服务器时,可以毫无问题地建立连接。
我登录并输入一些在控制台上产生输出的内容,例如“ls -al”。然后连接就挂起了。如果我输入“ls”,它会显示输出。如果我输入“dmesg”,会话也会崩溃。
服务器日志中没有任何内容,并且我这边的终端无法识别已关闭的连接,它只是挂起。
现在我想知道这是否与防火墙有关。如果返回的输出太多,它就会崩溃。
或者我们的某个程序员搞砸了什么。我真的不知道该从哪个方向来追踪这个问题。对此有什么想法吗?我只是不明白发生了什么,也不明白这是否与网络问题或系统配置错误有关……我不明白为什么“ls”和“ls -al”或“dmesg”之间有区别。而且登录也会在屏幕上产生大量输出,但它总是有效的。
好的,我刚刚发现了 serverfault.com 并在那里发布了我的问题。这可以删除,因为它与主题无关。无论如何,谢谢!
答案1
您可能遇到的是 PMTU 问题。
许多设备都有一个最大传输单元 (MTU),即它们可以发送的数据包的最大大小。如果设备发现数据包超出此阈值,它会将其拆分成较小的部分,但有些数据包有一个特殊标志,表示不分段 (DF)。这些数据包将被丢弃,并向发送方发送 ICMP 消息,以便发送方可以调整数据包本身的大小。
就您而言,SSH 服务器和您之间似乎存在某种问题,导致这些数据包被丢弃,并且没有通知服务器。如果您有连接的数据包转储,您可能会看到数据包丢失。Linux 上有一个名为 tracepath 的工具,可让您查看通往服务器的所有跳数的 mtu。
要解决此问题,您应该向服务器所在的网络添加如下 iptables 规则:
iptables -A INPUT -d x.x.x.x/24 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
答案2
你可以用它tcpdump
来查看它是否是防火墙。只要确保过滤端口 22,往返于远程主机,如果数据包停止通过,你就知道这是网络问题。
另一件事是清除您的 $HOME/.${SHELL}rc 文件,以确保其中没有任何内容会导致 shell 访问错误。特别是检查您的 TERM 变量。
答案3
您与目标主机之间有防火墙,该防火墙启用了严格的 TCP 序列检查。网络中一个或多个数据包的延迟会导致数据包无序到达。防火墙认为这是某种类型的攻击(符合此条件的攻击包括会话劫持和会话重放,但也有其他攻击)。然后防火墙会破坏会话。后续数据包到达时没有 SYN 来建立会话,因此防火墙也会丢弃它们。
顺便问一下,您和目标之间有什么样的防火墙?