- 客户端:OpenSSH_5.1p1 Debian-5ubuntu1(Ubuntu 9.04)
- 服务器:OpenSSH_5.1p1 Debian-5(Proxmox 2.6.24-7-pve)
我使用 SSH 在服务器上远程执行命令(Nagios 的 check_by_ssh 模块)。但是尝试执行命令时,SSH 有时会挂起。我可以通过 SSH 登录到服务器,但无法执行简单的“ls”。而且它似乎阻止了来自同一 IP 地址的所有客户端。身份验证不是问题,可能是通过 SSH 密钥或密码进行的。
ssh -l root -p 2222 server.domain.tld 'ls'
这是客户端调试信息
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug3: Ignored env ORBIT_SOCKETDIR
*** skipping approx 40 env var ignored
debug1: Sending command: ls
debug2: channel 0: request exec confirm 1
它挂在那里。然后在随机时间之后,它再次工作(不执行任何操作)。终止服务器上的所有 sshd 进程似乎也有效。它从 Putty 中工作。我看到有些人由于 ISP 反向 DNS 问题而遇到这样的麻烦,但这里似乎不是这种情况。
它可以工作几个小时,然后半小时左右不工作。
如何解释这种行为?
编辑:似乎使用 -t 或 -T 选项,ssh 不会挂起,但我无法在 nagios 的 check_by_ssh 中传递其中一个选项
答案1
我遇到了同样的问题,今天终于发现了问题的原因(至少对我来说)。这可能对你也有帮助。
当 ssh 设置会话时,IP 标头中的 DSCP 标志字段设置为 0x0。如果建立交互式会话,则设置为 0x10 (16),如果建立非交互式会话,则设置为 0x8 (8)。ssh 客户端使用 setsockopt() 系统调用设置 DSCP 字段(我在源代码中验证了这一点)
我所在公司的 VPN 配置存在错误,导致 DSCP 为 0x8 的数据包被丢弃,从而导致所有非交互式 ssh 流量也被丢弃。为了验证是 DSCP 字段导致了丢弃,我在 ssh 服务器上使用 iptables 强制将 DSCP 字段设置为 0x16,并测试了我的非交互式流量(ssh ls,与您尝试的相同),之后它就正常工作了。您也可以尝试同样的方法,看看这是否是您的会话挂起的原因。
要将 ssh 服务器发出的所有 ssh 流量的 DSCP 设置为 0x10,请运行:
$ sudo iptables -t mangle -A OUTPUT -p tcp --sport 22 -j DSCP --set-dscp 0x19
这是在 rhel 6.5 盒子上。
答案2
我从这个博客中得到了解决问题的办法。我也遇到了一个非常有趣的问题
我得到了一个 L2vpn 链接(供应商提供 MPLS L2)来连接我的 HO 和分支机构。所有 ping 连接测试都运行良好。当我使用 debian 服务器从 HO 通过 ssh 连接到客户端的 debian 服务器时,我可以登录到该服务器,但在远程 ssh 登录到分支服务器后,我无法运行 ifconfig、htop 或 ps -ef 命令。当我应用这些命令时,会话冻结。即使我使用 putty 从 windows pc 上检查它,结果也是一样的。有趣的是,当我使用 putty 管理器并通过该应用程序从 win 7 pc 上 ssh 时,它运行良好。阅读此博客后,我从服务提供商处获得了 mpls mtu 信息,并在 HO 的源 debian 服务器接口上尝试使用不同的 mtu 大小进行相同的场景。最后,从 1440 到 1470 的 mtu 大小运行良好,而默认的 mtu 大小 1500 不起作用。结论:两端的 Debian 服务器的 MTU 大小都是默认值,即 1500,但中间服务提供商的 MPLS L2vpn MTU 大小不匹配。谢谢
答案3
您可能遇到了服务器端网络上的 SSH 速率限制器。这是一种防火墙技术,用于阻止在短时间内有太多新连接请求的 IP 地址。然后,源 IP 将被阻止一段定义的时间。
答案4
遇到 MTU 问题时我也遇到过同样的情况。使用 ciscos ipsec client-to-site,然后在此基础上使用 openvpn。基本上任何大小为 1500 字节的数据包都会冻结会话。