WireGuard VPN 故障排查

遇到 WireGuard 问题时,可以先按照下面这份通用清单进行排查。

  • 核对公钥和私钥。配置多个对等节点时,很容易将它们混淆,尤其是密钥内容只是随机数据,没有可用于辨认的标识,而且公钥与私钥的格式基本相同。
  • 核对所有对等节点的 AllowedIPs 列表。
  • 通过 ip route 和 ip addr show dev <wg-interface>,确认路由与 IP 地址是否符合预期。
  • 再次确认需要转发的位置已将 /proc/sys/net/ipv4/ip_forward 设为 1。
  • 如果不通过路由,而是将 VPN 用户接入现有网络,请确认 /proc/sys/net/ipv4/conf/all/proxy_arp 为 1。
  • 确保上述 /proc 参数已写入 /etc/sysctl.conf 或 /etc/sysctl.d 下的文件,以便重启后仍然生效。

watch wg 命令

保持一个终端运行 watch wg,通常很有帮助。以下示例输出来自配置了两个对等节点的系统,其中目前只有一个建立了 VPN 连接:

Every 2.0s: wg                j-wg: Fri Aug 26 17:44:37 2022

interface: wg0
  public key: +T3T3HTMeyrEDvim8FBxbYjbz+/POeOtG3Rlvl9kJmM=
  private key: (hidden)
  listening port: 51000

peer: 2cJdFcNzXv4YUGyDTahtOfrbsrFsCByatPnNzKTs0Qo=
  endpoint: 10.172.196.106:51000
  allowed ips: 10.10.11.2/32
  latest handshake: 3 hours, 27 minutes, 35 seconds ago
  transfer: 3.06 KiB received, 2.80 KiB sent

peer: ZliZ1hlarZqvfxPMyME2ECtXDk611NB7uzLAD4McpgI=
  allowed ips: 10.10.11.3/32

内核调试消息

WireGuard 的日志输出也相当安静。它本质上是内核模块,因此需要显式开启该模块的详细日志。

注意:要使用下面列出的命令,必须禁用 kernel_lockdown(7)。这是因为这些调试接口被认为可能用于篡改内核完整性。

安全启动模式下默认启用 Lockdown。用以下命令检查状态:

$ cat /sys/kernel/security/lockdown
none [integrity] confidentiality

禁用时则是:

$ cat /sys/kernel/security/lockdown
[none] integrity confidentiality

可以在 BIOS 或虚拟化平台中关闭安全启动,从而禁用它。

如果无法这样操作,可以不使用下面的动态模块调试控制,改用内核启动参数 wireguard.dyndbg=+p。其缺点是,每次启用或禁用都需要重启。

20.04 之前尚无 Kernel Lockdown,因此这类系统可以跳过此步骤。

通过以下命令开启模块日志:

$ echo "module wireguard +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

WireGuard 的日志消息将写入内核日志,可以使用以下命令实时查看:

$ sudo dmesg -wT

要关闭日志,运行:

$ echo "module wireguard -p" | sudo tee /sys/kernel/debug/dynamic_debug/control

Destination address required:需要目标地址

如果对某个 IP 执行 ping:

$ ping 10.10.11.2

却收到类似以下的错误:

PING 10.10.11.2 (10.10.11.2) 56(84) bytes of data.
From 10.10.11.1 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Destination address required

原因是:为该目标选择的 WireGuard 接口不知道它的端点。换句话说,接口不知道该将加密流量发往哪里。

常见场景是某个对等节点没有配置 Endpoint,而主机正试图向它发送流量。没有配置 Endpoint 完全有效。以此前介绍过的咖啡店场景为例:

笔记本电脑已连接 VPN,照常交换流量。随后流量停了一阵子,因为使用者又去买了一杯咖啡。没有流量时,WireGuard 会保持静默。假如这时重启家庭路由器上的 WireGuard,重新启动后它就不知道如何联系笔记本了,因为这次启动以来笔记本还没有联系过它。此时,如果家庭路由器尝试向咖啡店中的笔记本发送流量,就会出现上述错误。

等使用者回来,笔记本再次向家庭网络发出流量时,因为笔记本配置了家庭网络的 Endpoint,VPN 就会“醒来”。数据开始交换,握手完成,家庭路由器也重新知道了笔记本对应的 Endpoint,于是可以再次主动向它发送新流量。

另一种可能是某个对等节点位于 NAT 后面,流量不足以让有状态防火墙认为“连接”仍然存活,导致已有的 NAT 映射被删除。这种情况下,可以考虑给对等节点配置 PersistentKeepalive,让 WireGuard 每隔一定秒数发送保活探测。

Required key not available:所需密钥不可用

下面的错误:

$ ping 10.10.11.1
PING 10.10.11.1 (10.10.11.1) 56(84) bytes of data.
From 10.10.11.2 icmp_seq=1 Destination Host Unreachable
ping: sendmsg: Required key not available

可能发生在这样的情况下:路由把流量导向 WireGuard 接口,但该接口的 AllowedIPs 配置中没有列出目标地址。

如果已经开启 WireGuard 内核调试,dmesg 输出中还会出现类似消息:

wireguard: home0: No peer has allowed IPs matching 10.10.11.1

原文:Troubleshooting WireGuard VPN。作者/维护方:Ubuntu Server 文档维护者。本文为中文翻译,代码及命令保留原文。

原站版权声明:Copyright © 2026。原文最后更新:2026 年 6 月 26 日。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容