我有一台 Ubuntu 12.04 笔记本电脑,它需要很长时间才能连接到各种服务器(位于不同的数据中心),以至于我是否真的能连接上,这有点像抽奖。如果我连接到服务器之间,它会立即完成,而且我已经设置了
UseDNS no
AddressFamily inet
在我要连接的服务器上(并重新启动以确保万无一失)。我还输入了要连接的电缆连接的反向 DNS+IP。如果我通过 telnet 从笔记本电脑连接:
telnet my.server 22
然后连接也是即时的,所以这似乎不是防火墙介入的问题。无论我使用 IP、主机中的短名称还是 FQDN 进行连接,我的行为都相同。我使用 50mbps(电缆,同步)连接,所以这似乎不是问题,当我最终获得连接时,它是一个很好的、快速的、稳定的连接。我尝试过监听另一个端口(8000),这没什么区别。从笔记本电脑到机器的 Web 和其他连接也非常好。
如果我增加日志记录,那么在挂起之前我会得到以下信息:
$ ssh -vvv flip
OpenSSH_5.9p1 Debian-5ubuntu1.1, OpenSSL 1.0.1 14 Mar 2012
debug1: Reading configuration data /home/anton/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to flip [xxx.xxx.xxx.xxx] port 22.
debug1: Connection established.
debug3: Incorrect RSA1 identifier
debug3: Could not load "/home/anton/.ssh/id_rsa" as a RSA1 public key
debug1: identity file /home/anton/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: identity file /home/anton/.ssh/id_rsa-cert type -1
debug1: identity file /home/anton/.ssh/id_dsa type -1
debug1: identity file /home/anton/.ssh/id_dsa-cert type -1
debug1: identity file /home/anton/.ssh/id_ecdsa type -1
debug1: identity file /home/anton/.ssh/id_ecdsa-cert type -1
它挂在服务器上以下两行之间:
Nov 6 13:51:57 srv sshd[18472]: Connection from XXX.XXX.XXX.XXX port 51099
Nov 6 13:53:03 srv sshd[18472]: debug1: Client protocol version 2.0; client software version OpenSSH_5.9p1 Debian-5ubuntu1.1
但至少比昨天快了!
这里有人有什么想法吗?
答案1
这些症状是您在 PMTU 发现中断的情况下可能看到的。由于所有数据包都很小,因此客户端可以连接并且可以无问题地交换版本信息。
但是一旦密钥交换开始,就会发送更大的数据包。如果某个中间路由器默默丢弃了更大的数据包,而没有发送标准要求的 ICMP 错误消息,则发送方永远不会知道数据必须以较小的段发送。因此,连接会在第一个大数据包上停滞。
如果这确实是问题所在,那么降低 MSS 或 MTU 可以解决问题。第一步可能是修改连接两端使用的路由表条目以包含advmss 1220
。或者,如果您不想修改默认路由,您可以简单地添加具有相同网关的更具体的路由。
您提到问题自行消失,这对于 MTU 问题来说也并非不可能,因为当 BGP 决定通过不经过有问题的路由器的另一条路径发送数据包时,问题就会消失,或者由于负责有问题的路由器的管理员注意到并修复了该问题,问题就会消失。