遇到 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 日。











暂无评论内容