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 即可正常连接,问题稳定解决。