WireGuard 配置参数详解
WireGuard wg0.conf 配置文件全参数详解:Interface 段的 Address/ListenPort/PrivateKey/MTU/DNS/PreUp/PostUp 与 Peer 段的 PublicKey/PresharedKey/AllowedIPs/Endpoint/PersistentKeepalive,含参数总览、生产配置模板与 FAQ
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] 两段:
| 参数 | 所属段 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Address | Interface | wg-quick 专用 | 无 | 隧道网卡 IP(可 CIRD/多个) |
ListenPort | Interface | 否 | 随机 | UDP 监听端口(客户端侧一般省略) |
PrivateKey | Interface | 是 | 无 | 本端私钥(Curve25519) |
MTU | Interface | wg-quick 专用 | 自动 1420 | 接口 MTU |
DNS | Interface | wg-quick 专用 | 无 | 接口 up 期间使用的 DNS |
Table | Interface | wg-quick 专用 | auto | 路由表(auto/off/数字) |
PreUp/PostUp/PreDown/PostDown | Interface | wg-quick 专用 | 无 | 接口 up/down 各阶段执行的脚本 |
SaveConfig | Interface | 否 | false | 接口 down 时把运行态写回文件 |
PublicKey | Peer | 是 | 无 | 对端公钥 |
PresharedKey | Peer | 否 | 无 | 额外预共享密钥(防重放/增强) |
AllowedIPs | Peer | 是 | 无 | 允许经该 peer 路由的网段,多条逗号分隔 |
Endpoint | Peer | 否(服务器侧) | 无 | 对端可达的 IP:端口 |
PersistentKeepalive | Peer | 否 | 无(默认关闭) | 对 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表示允许该客户端使用隧道 IP10.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,仅调试时临时开启。
八、参考链接
- WireGuard 配置说明(官方):https://www.wireguard.com/quickstart/
wg-quick手册:man wg-quickwg手册:man wg- LinuxServer/内核 WireGuard 文档:https://www.wireguard.com/