wireguard ssh 不通问题
January 8, 2025
去年11月份用了三年的腾讯云服务器到期后,又趁着优惠买了两年的腾讯云,依旧是选择上海的服务器,但是带宽从8M下降到4M,考虑到我只用来部署 wireguard,预想中应该不会出什么问题,事实却教我做人,为此浪费了不少时间。
部署 wireguard 当然可以直接在 host 层面,但是手动管理配置文件比较繁琐,尤其在设备数量比较多的情况下,所以好几年前就实际在用 wg-easy 这个项目部署,有个前端页面进行在线设备的展示,以及新设备配置文件的自动生成,使用体验非常好,一句 docker compose up
即可部署完毕。
问题从换了部署服务器后出现了,配置文件没有更改的情况下,客户端到服务端的 ping 值异常的高,正常情况下应该是在 60 ms 左右 (北京-上海),但是在10分钟到数小时不等的时间后,这个延时会上升到 300+ ms,且此时 SSH 登录会卡死在下面这一步。
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
网络知识有限的我,也知道这个时候网络是通的,ssh 认证阶段出了问题。一番搜索找到 reddit 这个帖子,完全一样的问题,原因在于配置文件中 MTU 参数不对,MTU,全称 Maximum Transmission Unit,即最大传输单元,MTU 就是网络中能够传输的最大数据包大小,以字节为单位。MTU 的作用:
- 限制数据包大小: MTU 就像一个“门框”,只有小于等于 MTU 的数据包才能通过。
- 防止数据包过大: 过大的数据包可能会导致网络拥塞、丢包等问题。
- 影响网络性能: MTU 的大小会直接影响网络传输效率。MTU 设置过小,会导致数据包分片过多,增加网络开销;MTU 设置过大,又可能导致数据包无法通过某些网络设备。
华为关于 MTU 的解释,链接
按照帖子的操作测试获得本地网络的 MTU,注意 macOS 的 ping 命令和 Linux 存在差异:macOS 的 -D 标志等同于 Linux 的 -M do,都是设置 “Don’t Fragment” 位。macOS 的 -s 参数不包含 IP 和 ICMP 头部的 28 字节,所以如果要匹配 Linux 的大小,需要减去 28。
...