WireGuard 配置参数详解

WireGuard wg0.conf 配置文件全参数详解:Interface 段的 Address/ListenPort/PrivateKey/MTU/DNS/PreUp/PostUp 与 Peer 段的 PublicKey/PresharedKey/AllowedIPs/Endpoint/PersistentKeepalive,含参数总览、生产配置模板与 FAQ

WireGuardWireGuard配置详解网络配置2026/10/09

WireGuard 配置参数详解

目标:逐项解析 /etc/wireguard/wg0.conf 中 [Interface] 与 [Peer] 两段所用的全部核心参数(含 wg-quick 对 wg 原生配置的扩展参数),并给出可落地的生产配置模板与排障 FAQ,已在 WireGuard Tools v1.0.20210914 实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS
  • WireGuard 用户态工具:wireguard-tools 1.0.20210914-1ubuntu2(内含 wg 与 wg-quick)
  • 配置文件:/etc/wireguard/wg0.conf
  • 示例拓扑:服务器 10.99.0.1/24(监听 UDP 51820)↔ 客户端 10.99.0.2/24

二、前置条件

  • 已按《Ubuntu 22.04 安装 WireGuard 指南》安装 wireguard-tools 并生成服务端密钥对;
  • /etc/wireguard/wg0.conf 已存在(文件名与接口名 wg0 对应,wg-quick 依据此规则加载);
  • 修改配置后的生效方式:wg-quick down wg0 && wg-quick up wg0(或 systemd 托管时 systemctl restart wg-quick@wg0)。

三、参数查看与修改方式

  • 查看当前生效的运行态配置(含服务端自动推算的 Peer Endpoint、握手时间等):wg show wg0
  • 查看接口的实际持久化配置(与 setconf 对应):wg showconf wg0
  • 查看/编辑配置文件本体:cat /etc/wireguard/wg0.conf / vim /etc/wireguard/wg0.conf
  • 直接查看所有接口:wg show

实测回显:

$ wg show wg0
interface: wg0
  public key: omjFjOq26vb24495db2kUGSVx1bZHoAnkLbmsTPwmyg=
  private key: (hidden)
  listening port: 51820

peer: AYpcaJY8ZqMEYeTGQz7I+LuXpt98k5q56gr70N4sAw8=
  preshared key: (hidden)
  endpoint: 172.24.0.3:36983
  allowed ips: 10.99.0.2/32
  latest handshake: 6 seconds ago
  transfer: 564 B received, 476 B sent
$ wg showconf wg0
[Interface]
ListenPort = 51820
PrivateKey = uP1UGKv4jhEXcVBOqHSEx9PxOze4QOjM6WaFs7iGIFE=

[Peer]
PublicKey = AYpcaJY8ZqMEYeTGQz7I+LuXpt98k5q56gr70N4sAw8=
PresharedKey = SjzKE6w7Wr6pyCHsxF2ghJV5VekzHifb67Mh6ZFj/50=
AllowedIPs = 10.99.0.2/32
Endpoint = 172.24.0.3:36983

💡 说明:wg showconf 会自动在 Peer 后补充实时的 Endpoint;wg show 还会给出握手时间与流量统计,便于联网排障。

四、参数总览

WireGuard 配置由若干键值项组成,分属于 [Interface] 与 [Peer] 两段:

参数所属段是否必填默认值说明
AddressInterfacewg-quick 专用无隧道网卡 IP(可 CIRD/多个)
ListenPortInterface否随机UDP 监听端口(客户端侧一般省略)
PrivateKeyInterface是无本端私钥(Curve25519)
MTUInterfacewg-quick 专用自动 1420接口 MTU
DNSInterfacewg-quick 专用无接口 up 期间使用的 DNS
TableInterfacewg-quick 专用auto路由表(auto/off/数字)
PreUp/PostUp/PreDown/PostDownInterfacewg-quick 专用无接口 up/down 各阶段执行的脚本
SaveConfigInterface否false接口 down 时把运行态写回文件
PublicKeyPeer是无对端公钥
PresharedKeyPeer否无额外预共享密钥(防重放/增强)
AllowedIPsPeer是无允许经该 peer 路由的网段,多条逗号分隔
EndpointPeer否(服务器侧)无对端可达的 IP:端口
PersistentKeepalivePeer否无(默认关闭)对 NAT/防火墙后对端的保活间隔(秒)

💡 说明:上表把「wg 原生参数」与「wg-quick 扩展参数」合并列出。wg(setconf/addconf/syncconf)只识别原生参数;wg-quick 额外支持 Address、DNS、MTU、Table、Pre/Post* 这些「与链路管理相关」的扩展项。

五、核心参数分类详解

5.1 [Interface] 段

5.1.1 PrivateKey(必填) 本端私钥,由 wg genkey 生成,绝对保密。服务器用完后,客户端需用对应的段落写各自私钥。

[Interface]
PrivateKey = uP1UGKv4jhEXcVBOqHSEx9PxOze4QOjM6WaFs7iGIFE=

5.1.2 Address(隧道网卡地址,wg-quick 专用) 给隧道接口配置的 IP(支持 CIDR 掩码,可写多行)。在服务器示例 10.99.0.1/24 表示接口地址 10.99.0.1、掩码 /24(对应 VPN 网段 10.99.0.0/24)。

[Interface]
Address = 10.99.0.1/24

5.1.3 ListenPort(监听端口) WireGuard 的 UDP 监听端口。服务器侧通常显式指定(默认 51820)便于防火墙放行;客户端(主动发起方)可省略,使用随机端口。

[Interface]
ListenPort = 51820

5.1.4 MTU(wg-quick 专用) 接口 MTU,默认自动计算为 1420(实测 wg-quick up 会打印 mtu 1420)。下面值会导致隧道内大包分片/性能下降,非特殊场景保持默认。

[Interface]
MTU = 1420

5.1.5 DNS(wg-quick 专用) 接口 up 期间本端使用的 DNS。网关模式下常见:客户端指向服务器隧道 IP。

[Interface]
DNS = 10.99.0.1

5.1.6 Table(wg-quick 专用) 决定把隧道路由写入哪张路由表:

  • auto(默认):写入主路由表;
  • 数字:写入指定表号;
  • off:不加任何路由,需要自行 ip route 管理。
[Interface]
Table = auto

5.1.7 PreUp / PostUp / PreDown / PostDown(wg-quick 专用脚本钩子) 接口生命周期各阶段 bash 执行的命令。%i 会被替换为接口名。最常用于网关模式配置防火墙与 MASQUERADE。

[Interface]
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

💡 说明:PostUp 用于接口上线后执行的命令(如开启转发+伪装),PostDown 用于接口拆除时清理。上面两条成对出现;%i 可代替具体接口名 wg0。

5.1.8 SaveConfig 接口 down 时把运行态(含当前 Peer/Endpoint)写回配置文件。

[Interface]
SaveConfig = true

5.2 [Peer] 段

每份对端连接都用一个 [Peer] 段描述。服务器侧有多少台客户端就有多少个 [Peer];客户端侧通常只有一个(指向服务器)。

5.2.1 PublicKey(必填,对端公钥) 对端的公钥。非对称认证核心:WireGuard 按「本端私钥 + 对端公钥」建立安全标识。服务器上写客户端公钥:

[Peer]
PublicKey = AYpcaJY8ZqMEYeTGQz7I+LuXpt98k5q56gr70N4sAw8=

5.2.2 PresharedKey(可选但强烈建议) 预共享密钥,由 wg genpsk 生成,两端需一致。可抵御「未来量子对静态密钥的后续解密」等风险,提升抗重放能力。

[Peer]
PresharedKey = SjzKE6w7Wr6pyCHsxF2ghJV5VekzHifb67Mh6ZFj/50=

⚠️ 注意:PresharedKey 必须在本端与服务端对应的两个 [Peer](实际是两端各持一份)中保持一致,否则握手失败。

5.2.3 AllowedIPs(决定路由与访问控制) WireGuard 中同时承担「路由表过滤 + 对端可访问网段」双重作用:

  • 服务器侧:10.99.0.2/32 表示允许该客户端使用隧道 IP 10.99.0.2,并把到该地址的流量路由给它;
  • 客户端侧全流量:0.0.0.0/0(配合 ::/0)表示所有流量都走隧道,即「全局代理」。
# 服务器对某客户端
AllowedIPs = 10.99.0.2/32
# 客户端走全流量
AllowedIPs = 0.0.0.0/0, ::/0

多条网段用逗号分隔。

5.2.4 Endpoint(对端可达地址,主动发起端必填) 对端的「IP:端口」,WireGuard 据此主动发送握手报文。服务器侧通常不写(由对端连入后自动学习);客户端侧必须写服务器公网地址。

[Peer]
Endpoint = <服务器公网IP>:51820

5.2.5 PersistentKeepalive(NAT/防火墙穿透保活) 间隔秒数向对端发送握手保活,防止 NAT/防火墙超时丢弃映射。默认不发送;客户端在 NAT 后一般设置为 25。

[Peer]
PersistentKeepalive = 25

对应 wg show 中的 persistent keepalive: every 25 seconds。

六、生产配置模板

💡 适用场景:16GB 内存、NVMe SSD、常规办公/远程接入的 VPN 服务器(纯转发,本机不承载重型应用)。WireGuard 为内核态实现,内存/磁盘占用极低;本机的性能瓶颈在加密吞吐,以下均为默认内核态最佳实践。

服务器侧 /etc/wireguard/wg0.conf(10.99.0.1,管理两台客户端):

# ===== 服务器 =====
[Interface]
Address = 10.99.0.1/24
ListenPort = 51820
PrivateKey = uP1UGKv4jhEXcVBOqHSEx9PxOze4QOjM6WaFs7iGIFE=
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# ===== 客户端 A(10.99.0.2) =====
[Peer]
PublicKey = AYpcaJY8ZqMEYeTGQz7I+LuXpt98k5q56gr70N4sAw8=
PresharedKey = SjzKE6w7Wr6pyCHsxF2ghJV5VekzHifb67Mh6ZFj/50=
AllowedIPs = 10.99.0.2/32

# ===== 客户端 B(10.99.0.3) =====
[Peer]
PublicKey = <客户端B公钥>
PresharedKey = <与客户端B一致的PSK>
AllowedIPs = 10.99.0.3/32

客户端侧 /etc/wireguard/wg0.conf(10.99.0.2,全流量走隧道):

[Interface]
Address = 10.99.0.2/24
PrivateKey = <客户端A私钥>
DNS = 10.99.0.1

[Peer]
PublicKey = omjFjOq26vb24495db2kUGSVx1bZHoAnkLbmsTPwmyg=
PresharedKey = SjzKE6w7Wr6pyCHsxF2ghJV5VekzHifb67Mh6ZFj/50=
Endpoint = <服务器公网IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

⚠️ 注意:<服务器公网IP>、<客户端A私钥>、<客户端B公钥>、<PSK> 等尖括号项均为「引用你在上一环节生成的密钥/本机地址」的说明性取值,取值方法如下:公网 IP 用 ip addr/curl ifconfig.me 获取;私钥用 cat /etc/wireguard/clientA_private.key 读取;对端公钥用 wg pubkey < clientB_private.key 推导;PSK 用 cat /etc/wireguard/psk.key 读取。同一对端两端的密钥与 PSK 必须互相匹配。

启用:

wg-quick up wg0
wg show wg0        # 观察 handshake 与 transfer

七、常见问题(FAQ)

Q1:wg-quick up wg0 成功但两端 wg show 一直无 latest handshake? 检查:a) Endpoint 是否填了「本端无法直接触达但客户端可达」的地址;b) 双方防火墙/安全组是否放行 UDP(服务器 51820、客户端一般随机端口);c) 两端 PresharedKey 是否一致、PublicKey 是否写反。PersistentKeepalive 可加 25 加速 NAT 后握手探测。

Q2:AllowedIPs 到底起什么作用,为什么客户端写 0.0.0.0/0? 它是「本端会把哪些网段的流量路由给该 peer,并允许该 peer 使用哪些地址」的路由+访问控制组合。服务器对每客户端写 /32 限定其隧道 IP;客户端写 0.0.0.0/0, ::/0 表示「所有流量都发往服务器(全局代理)」。只访问内网时改为对应网段即可。

Q3:客户端能 ping 通服务器隧道 IP,但访问不了 VPN 内其它机器? 服务器未做转发/伪装。确认:a) net.ipv4.ip_forward=1;b) [Interface] 中 PostUp 的 FORWARD + MASQUERADE 规则存在,且 -o eth0 的网卡名与服务器实际对外网卡一致(可通过 ip -o link show 查)。

Q4:wg showconf wg0 里出现我不曾填写的 Endpoint? Endpoint 会随对端实际连入方向被学习并写入运行态,因此 wg showconf 自动带出对端最近的来源地址,属正常现象,不影响持久化文件(SaveConfig=true 时才会写回)。

Q5:客户端是 NAT 后,服务器却收到大量 handshake did not complete yet 报错? 多为客户端在 NAT 后、未配 PersistentKeepalive。在客户端 [Peer] 加 PersistentKeepalive = 25 并重启接口,保证 NAT 映射一直被刷新,服务器能持续向客户端回握手。

Q6:SaveConfig = true 有什么风险? 接口 down 时会把运行态(含临时学习的 Peer Endpoint)写回配置文件,可能覆盖你的原始注释与手工排版。生产环境建议保持默认 false,仅调试时临时开启。

八、参考链接