在 WSL2(Ubuntu 22.04) 中,通过 ssh 连接远端服务器时,连接会无响应。执行调试命令:
ssh -vvv user@host
可以看到输出停在:
expecting SSH2_MSG_KEX_ECDH_REPLY
客户端不再继续,服务器侧也没有任何日志。更换网络或在 Windows 原生终端中连接正常,说明并非服务器或账号问题。
搜索该现象后,定位到 Unix StackExchange 上的一篇帖子,指出这是 SSH 在 密钥交换阶段(KEX) 发送的握手包过大,在某些网络(WSL2 NAT、防火墙、VPN、校园/公司网络)中触发 Path MTU 黑洞,导致服务器无法收到 KEX_ECDH_INIT,因此不会返回 SSH2_MSG_KEX_ECDH_REPLY。
按照帖子中的建议,手动指定较短的密钥交换算法测试:
ssh -o KexAlgorithms=ecdh-sha2-nistp521 user@host
连接立即成功,确认问题与网络路径和握手包大小有关。
为避免每次手动指定参数,将配置写入用户级 SSH 配置文件:
~/.ssh/config
内容如下:
Host my-server
HostName real.server.ip.or.domain
User myuser
KexAlgorithms ecdh-sha2-nistp521
此后使用 ssh my-server 即可正常连接,问题稳定解决。