2026-03-21 14:49
1. 发起方 → 接收方: 发送握手包(包含临时公钥、时间戳)
2. 接收方 → 发起方: 回复握手响应(包含自己的临时公钥、Cookie)
3. 双方计算共享密钥(基于Curve25519 ECDH)
4. 建立加密隧道(ChaCha20-Poly1305认证加密)
发送端:
1. 应用数据 → WireGuard接口
2. 添加内部头部(接收方公钥索引)
3. ChaCha20加密 + Poly1305认证
4. 添加外部UDP头部
5. 发送到对端
接收端:
1. 验证数据包来源
2. 解密并验证完整性
3. 根据内部头部路由到对应Peer
4. 传递给上层应用
PersistentKeepalive穿透NAT# 接口配置 [Interface]
[Interface]
PrivateKey = <base64私钥>
Address = <IP地址/子网>
ListenPort = <监听端口>
MTU = <最大传输单元>
DNS = <DNS服务器>
# 对等节点配置 [Peer]
[Peer]
PublicKey = <对端公钥>
AllowedIPs = <允许的IP范围>
Endpoint = <对端地址:端口>
PersistentKeepalive = <保活间隔>| 参数 | 必选 | 说明 | 示例 |
|---|---|---|---|
| PrivateKey | 是 | 本机私钥(base64编码) | PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk= |
| Address | 是 | 本机在VPN中的IP地址 | Address = 10.0.0.1/24Address = fd00::1/64 |
| ListenPort | 否 | UDP监听端口(默认随机) | ListenPort = 51820 |
| MTU | 否 | 最大传输单元(默认1420) | MTU = 1280 |
| DNS | 否 | DNS服务器 | DNS = 8.8.8.8, 1.1.1.1 |
| Table | 否 | 路由表(默认auto) | Table = 12345 |
| PreUp/PostUp | 否 | 启动前/后执行的命令 | PostUp = iptables -A FORWARD -i %i -j ACCEPT |
| PreDown/PostDown | 否 | 停止前/后执行的命令 | PreDown = iptables -D FORWARD -i %i -j ACCEPT |
| SaveConfig | 否 | 运行时保存配置 | SaveConfig = true |
| 参数 | 必选 | 说明 | 示例 |
|---|---|---|---|
| PublicKey | 是 | 对端公钥(base64) | PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg= |
| AllowedIPs | 是 | 允许路由的IP范围 | AllowedIPs = 10.0.0.2/32AllowedIPs = 0.0.0.0/0(默认路由) |
| Endpoint | 否 | 对端公网地址:端口 | Endpoint = 203.0.113.2:51820 |
| PersistentKeepalive | 否 | NAT保活间隔(秒) | PersistentKeepalive = 25 |
| PresharedKey | 否 | 预共享密钥(额外加密) | PresharedKey = /UwcSPg38hW/D9Y3tcS1FOV0K1wuURMbS0sesJEP5ak= |
[中心节点]
/ | \
[节点1] [节点2] [节点3]
| | |
[子网1] [子网2] [子网3]
[节点1] ↔ [节点2]
↕ ↕
[节点3] ↔ [节点4]
[超级节点层](公网固定IP)
/ \
[区域节点层](混合网络)
/ \
[边缘节点] [边缘节点]
网络架构:
- 管理网络: 10.0.0.0/24 # WireGuard隧道IP
- 业务网络: 10.1.0.0/16 # 应用通信
- IPv6网络: fd00:wg::/64 # IPv6隧道
节点分配:
- 超级节点: 10.0.0.1-10.0.0.10
- 区域节点: 10.0.0.11-10.0.0.50
- 边缘节点: 10.0.0.51-10.0.0.254# 公网节点配置(作为中继)
[Peer]
# NAT内网节点
PublicKey = <内网节点公钥>
AllowedIPs = 10.0.0.100/32
PersistentKeepalive = 25 # 必须设置,维持NAT映射
# NAT内网节点配置
[Interface]
PrivateKey = <内网节点私钥>
Address = 10.0.0.100/24
[Peer]
# 公网节点
PublicKey = <公网节点公钥>
Endpoint = public-node.example.com:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25# 节点配置多个Peer实现冗余
[Peer]
PublicKey = <超级节点1公钥>
Endpoint = super1.example.com:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25
[Peer]
PublicKey = <超级节点2公钥>
Endpoint = super2.example.com:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25PostUp = ping -c 1 -W 3 10.0.0.1 || wg set %i peer <peer1-pubkey> endpoint <backup-endpoint># playbook-wireguard.yml
- hosts: all
vars:
wg_network: "10.0.0.0/24"
wg_port: 51820
tasks:
- name: 生成WireGuard密钥对
command: "wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey"
- name: 部署WireGuard配置
template:
src: wg.conf.j2
dest: "/etc/wireguard/wg0.conf"[Interface]
PrivateKey = {{ private_key }}
Address = {{ node_ip }}/24
ListenPort = {{ wg_port }}
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
{% for peer in peers %}
[Peer]
PublicKey = {{ peer.public_key }}
AllowedIPs = {{ peer.allowed_ips }}
{% if peer.endpoint %}Endpoint = {{ peer.endpoint }}{% endif %}
{% if peer.persistent_keepalive %}PersistentKeepalive = {{ peer.persistent_keepalive }}{% endif %}
{% endfor %}#!/bin/bash
# monitor-wireguard.sh
# 检查WireGuard状态
wg show
# 检查连接性
for peer in $(wg show wg0 peers); do
ping -c 1 -W 2 ${peer_allowed_ip} && echo "Peer ${peer:0:8}... is UP" || echo "Peer ${peer:0:8}... is DOWN"
done
# 流量统计
wg show wg0 transfer# wg-exporter配置
scrape_configs:
- job_name: 'wireguard'
static_configs:
- targets: ['node1:9586', 'node2:9586']密钥管理:
访问控制:
# 最小权限原则配置AllowedIPs
[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.0.0.100/32 # 只允许访问自身IP防火墙规则:
# 只允许WireGuard端口
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
iptables -A INPUT -i wg0 -m state --state RELATED,ESTABLISHED -j ACCEPTMTU优化:
# 计算最佳MTU
optimal_mtu=$(ping -M do -s 1472 -c 1 8.8.8.8 | grep -o "MTU=[0-9]*" | cut -d= -f2)
wg_mtu=$((optimal_mtu - 80))多队列支持:
PostUp = ethtool -L eth0 combined 4
PostUp = ip link set wg0 mtu 1420CPU绑定:
taskset -cp 2,3 $(pgrep -f "wg-quick")# 查看WireGuard状态
wg show
wg show wg0 dump
# 实时监控
watch -n 1 "wg show wg0"
# 测试连接
ping 10.0.0.1
traceroute -n 10.0.0.1
# 查看路由表
ip route show table all
ip -6 route show
# 调试模式
wg set wg0 peer <公钥> endpoint <地址>:<端口>
wg set wg0 private-key /dev/stderr这个设计可以支持数百到数千节点的WireGuard网络,通过合理的分层和自动化管理,确保网络的高可用性和可维护性。