如何调试偶尔出现的出站连接超时?

如何调试偶尔出现的出站连接超时?

我无法通过 SSH 连接到远程主机。我已将问题缩小到本地主机仅有的因为其他客户端每次都会建立名义上的(快速而稳定的)连接。

remotehost.example.net尝试通过SSH进行连接localhost将会超时,但大约 10 次尝试中有 1 次会成功(它会在这里挂起然后超时):

515 chris@localhost ~ $ ssh -vvv remotehost-root
OpenSSH_6.4, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /home/chris/.ssh/config
debug1: /home/chris/.ssh/config line 43: Applying options for remotehost-root
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Connecting to remotehost.example.net [123.123.123.123] port 12345.
^C

localhost是最新的 Arch 系统:

517 chris@localhost ~ $ uname -a
Linux localhost 3.12.1-1-ARCH #1 SMP PREEMPT Thu Nov 21 08:18:42 CET 2013 x86_64 GNU/Linux

我使用 SSH 配置文件来设置别名,remotehost如下所示:

521 chris@localhost .ssh $ cat ~/.ssh/config
...
host remotehost-root
  HostName remotehost.example.net
  User root
  Port 12345
  IdentityFile ~/.ssh/remotehost-root.id_rsa
...

这是最近出现的问题,但不幸的是我不记得对任何相关内容做过更改。我不确定要检查什么。

也许值得注意的是,这会影响全部SSH 连接(例如通过 ssh 和 git SFTP)而不仅仅是命令行 SSH 工具。

remotehost.example.net通过任何其他协议(例如HTTPHTTPSBitTorrent等)进行访问我都没有遇到任何问题。

唯一有效/未注释的行/etc/ssh/ssh_config是:

ServerAliveInterval 120

我还能在哪里找到?我还可以使用哪些其他调试工具(我能想到的就是运行ssh -vvv)?

我尝试tcpdump在尝试连接时在远程主机上运行,​​但不知道如何从 shell 中过滤数据包跑步 tcpdump因此无限循环地向自己发送垃圾邮件,导致无法进行任何有用的诊断。


更新 1:值得注意的是,我已经能够在第二个 SSH 主机以及 IRC 服务器上复制此行为,从而证明(在我看来)这完全是我本地主机上某些配置中的问题。


更新2:还值得注意的是,虽然我的本地主机在处理这些出站连接时遇到问题,但其他客户端(包括我的 LAN 上的一个客户端和另一个客户端)在与同一远程主机或任何其他主机的连接上都没有任何问题。这再次让我相信这仅仅是本地主机中的一些配置问题(但也许我错了?)。


更新 3:我已经从 localhost 中删除了 openssh 包(和配置)并重新安装,但无济于事。

答案1

如果您的本地机器 CPU 负载过高,则可能会发生超时,几年前我有时也遇到过这个问题。当时我的备份过程确实消耗了我的 IO + CPU。

由于我连接的服务器是 GPRS,因此设计速度很慢,所以我并没有立即想到本地主机是一个问题。

此外,正如您所说,您可以使用的连接数可能会有所限制。

我个人会用 wireshark 之类的工具来检查数据包。

答案2

1) 您是否启用了 GSSAPIAuthentication?尝试在 /etc/ssh/sshd_config 中将其设置为“no”

2) 您是否检查过这是否是 DNS 查找问题?尝试将目标主机及其 IP 地址添加到 /etc/hosts,然后重试 ssh 连接

3)要执行 tcpdump,您可以使用以下命令:

tcpdump -n "port 22 and dst <ip address of destination host>"

4) 您能发布 -vvv 调试的完整输出吗?还是就是那样?您能显示超时后显示的内容吗?

在任何挂起的情况下,您也可以简单地执行此操作netstat -an | grep <ip of remote host>,如果“状态”字段为“SYN_SENT”,那么您就知道它在某种程度上被阻止了。

答案3

您是否尝试过更改客户端的 IP 地址?可能是 LAN 防火墙阻止或限制了来自该特定地址的部分 SSH 流量?

相关内容