解决ssh卡在"expecting SSH2_MSG_KEX_ECDH_REPLY" 的问题

最近在开发主机不能git clone开发服务器的项目,总是卡住。由于使用的是git(over ssh)协议。 所以ssh -v 查看日志,发现卡在

debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: compression: none
debug3: send packet: type 30
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY

后来抓包发现, 有报文遭遇MTU黑洞了,某个路由器的MTU设置较小,而本机又没有支持MTU DISCOVERY导致。

tcpdump_of_ssh_stuck

这个问题比较好fix, 两个方案:

  sudo ifconfig eth0 mtu 1280

或者修改/etc/network/interfaces,将mtu 1280加入配置,启动生效,例如:

  auto enp5s0
  iface enp5s0 inet static
  address 192.168.1.182
  netmask 255.255.255.0
  gateway 192.168.1.1
  dns-nameservers 192.168.1.1
  mtu 1280
  echo 2>/proc/sys/net/ipv4/tcp_mtu_probing

或者将net.ipv4.tcp_mtu_probing = 2加入/etc/sysctl.conf,可以man 7 tcp搜索tcp_mtu_probing查看说明

这个问题比较典型,通常会在客户端和服务器中间有VPN或者某些奇葩的路由器时遇到;还有一种场景是有部分移动终端(手机)也是没有开启tcp_mtu_probing的,这时候也没有办法调整,只有在应用程序业务实现的时候尽量注意一下,比如尽量发送小报文。