今天在一个新环境使用 ssh 登录卡住了, 提示: Read from socket failed: Connection reset by peer
.
打开 verbose 信息后, 发现是卡在 expecting SSH2_MSG_KEX_ECDH_REPLY
:
OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014 |
使用的是 openssh 版本是:
dpkg -l | grep ssh |
Fix
Google 之后发现可能是一个 Bug : Bug #1254085 “ssh fails to connect to VPN host - hangs at 'expec...” : Bugs : openssh package : Ubuntu.
于是验证一下:
网卡默认设置的 MTU 是 1500, 这是 LAN 用的, 正常情况下, 发送的 ICMP 内容大小最大为 1500 - 20 - 8 = 1472
,
IP header 最小长度 20 字节,ICMP header 最小长度 8 字节,而 1472 为 ICMP 数据长度。
因此超过 1472 则会失败(如果设置了不进行 fragmentation), 如下本地 eth1 设置 MTU 的是 1500 :
-> % sudo ping baidu.com -s 1472 -c 3 -M do |
但是我在服务器的实际测试发现, 发送 1472 的消息仍然提示错误, 这可能是到远程服务器传输路径的某个网络设备 MTU 小于 1500(或者防火墙无法处理 IP packet fragmentation ).
因此, 我们可以尝试调低 MTU 验证一下 :
sudo ip link set mtu 1200 dev ethX |
测试后发现可以正常登录 ssh 了...
参考
Jon's Site - Test MTU with ping
linux - SSH access problem: debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY - Server Fault
The mysterious case of broken SSH client (“connection reset by peer”) | Web 0.2
Bug 1268847 – ssh fails to connect to VPN hosts - hangs at "expecting SSH2_MSG_KEX_ECDH_REPLY"
Path MTU 概述 | 孙勇峰的部落格
TCP-MSS, PMTU 详解- MTU工具解析与常见问题汇总-下篇-新西兰资深网工的日常-51CTO博客