WireGuard 多节点组网教程
运维部署交流
1
帖子
1
发布者
101
浏览
1
关注中
-
WireGuard 多节点组网教程
网络拓扑概述
本教程介绍如何使用WireGuard构建一个4节点的安全网络架构,实现多个网段间的互联互通。
网络拓扑图
┌─────────────────────────────┐ ┌─────────────────────────────┐ │ 节点A │◄──►│ 节点B │ │ OpenWrt路由器 │ │ OpenWrt路由器 │ │ │ │ │ │ 本地网段: 192.168.1.0/24 │ │ 本地网段: 192.168.2.0/24 │ │ WG IP: 10.0.0.1/32 │ │ WG IP: 10.0.0.2/32 │ │ 监听端口: 51820 │ │ 监听端口: 51821 │ │ 外部地址: nodeA.example.com │ │ 外部地址: nodeB.example.com │ └──────────────┬──────────────┘ └──────────────┬──────────────┘ │ │ │ ┌─────────────────────────────┐│ └───────────►│ 节点C │◄┘ │ 公网服务器 (中心节点) │ │ │ │ WG IP: 10.0.0.3/32 │ │ 监听端口: 51822 │ │ 外部地址: nodeC.example.com │ └──────────────┬──────────────┘ │ ┌─────────────────────────────┐ │ 节点D │ │ 内网服务器 │ │ │ │ 本地网段: 192.168.3.0/24 │ │ WG IP: 10.0.0.4/32 │ │ 无监听端口 (主动连接) │ └─────────────────────────────┘连接关系
- 节点A
节点B: 直连,实现两个局域网间的高速通信 - 节点B
节点C: 直连,提供优化的访问路径 - 节点A
节点C: 直连,确保网络连通性 - 节点C
节点D: 连接,节点D通过节点C访问其他网段
节点配置规划
节点基本信息
节点 类型 WireGuard IP 本地网段 监听端口 外部地址 角色 节点A OpenWrt路由器 10.0.0.1/32 192.168.1.0/24 51820 nodeA.example.com 边缘节点 节点B OpenWrt路由器 10.0.0.2/32 192.168.2.0/24 51821 nodeB.example.com 边缘节点 节点C 公网服务器 10.0.0.3/32 - 51822 nodeC.example.com 中心节点 节点D 内网服务器 10.0.0.4/32 192.168.3.0/24 - - 内网节点 密钥生成
每个节点需要生成自己的密钥对:
# 生成私钥 wg genkey > private.key # 生成公钥 wg pubkey < private.key > public.key # 生成预共享密钥(可选,用于增强安全性) wg genpsk > preshared.key公钥信息示例
节点 公钥 节点A [节点A的公钥] 节点B [节点B的公钥] 节点C [节点C的公钥] 节点D [节点D的公钥] 路由配置
网段访问路径
源网段 目标网段 路径 优化状态 192.168.1.0/24 192.168.2.0/24 节点A → 节点B (直连)
优化192.168.2.0/24 192.168.1.0/24 节点B → 节点A (直连)
优化192.168.1.0/24 192.168.3.0/24 节点A → 节点C → 节点D
正常192.168.2.0/24 192.168.3.0/24 节点B → 节点C → 节点D
正常192.168.3.0/24 192.168.1.0/24 节点D → 节点C → 节点A
正常192.168.3.0/24 192.168.2.0/24 节点D → 节点C → 节点B
正常AllowedIPs 配置原则
节点A 配置
- 到节点C:
10.0.0.3/32, 10.0.0.4/32, 192.168.3.0/24 - 到节点B:
10.0.0.2/32, 192.168.2.0/24 - 预共享密钥: 可选择与节点B使用
节点B 配置
- 到节点A:
10.0.0.1/32, 192.168.1.0/24 - 到节点C:
10.0.0.3/32, 10.0.0.4/32, 192.168.3.0/24 - 预共享密钥: 可选择与节点A使用
节点C 配置
- 到节点A:
10.0.0.1/32, 192.168.1.0/24 - 到节点B:
10.0.0.2/32, 192.168.2.0/24 - 到节点D:
10.0.0.4/32, 192.168.3.0/24
节点D 配置
- 到节点C:
10.0.0.0/24, 192.168.1.0/24, 192.168.2.0/24
网络参数配置
通用参数
- MTU: 1300 (所有节点统一,避免分片)
- PersistentKeepalive: 25秒 (保持NAT穿透)
- WireGuard骨干网: 10.0.0.0/24
安全配置建议
- 预共享密钥: 建议在关键连接上使用预共享密钥增强安全性
- 定期更换密钥: 建议定期更换WireGuard密钥
- 防火墙规则: 严格控制WireGuard端口访问
配置文件示例
节点A (OpenWrt) 配置
# /etc/config/network 配置 config interface 'wg0' option proto 'wireguard' option private_key '[节点A私钥]' option listen_port '51820' list addresses '10.0.0.1/32' config wireguard_wg0 option public_key '[节点B公钥]' option endpoint 'nodeB.example.com:51821' option preshared_key '[预共享密钥]' list allowed_ips '10.0.0.2/32' list allowed_ips '192.168.2.0/24' option persistent_keepalive '25' config wireguard_wg0 option public_key '[节点C公钥]' option endpoint 'nodeC.example.com:51822' list allowed_ips '10.0.0.3/32' list allowed_ips '10.0.0.4/32' list allowed_ips '192.168.3.0/24' option persistent_keepalive '25'节点C (Linux服务器) 配置
[Interface] PrivateKey = [节点C私钥] Address = 10.0.0.3/32 ListenPort = 51822 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 [Peer] # 节点A PublicKey = [节点A公钥] Endpoint = nodeA.example.com:51820 AllowedIPs = 10.0.0.1/32, 192.168.1.0/24 PersistentKeepalive = 25 [Peer] # 节点B PublicKey = [节点B公钥] Endpoint = nodeB.example.com:51821 AllowedIPs = 10.0.0.2/32, 192.168.2.0/24 PersistentKeepalive = 25 [Peer] # 节点D PublicKey = [节点D公钥] AllowedIPs = 10.0.0.4/32, 192.168.3.0/24 PersistentKeepalive = 25节点D (内网服务器) 配置
[Interface] PrivateKey = [节点D私钥] Address = 10.0.0.4/32 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 [Peer] # 节点C (中心节点) PublicKey = [节点C公钥] Endpoint = nodeC.example.com:51822 AllowedIPs = 10.0.0.0/24, 192.168.1.0/24, 192.168.2.0/24 PersistentKeepalive = 25防火墙和NAT配置
各节点NAT规则
OpenWrt节点 (节点A、B)
# 允许WireGuard转发 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT # 本地网段NAT iptables -t nat -A POSTROUTING -s 192.168.x.0/24 -o wan -j MASQUERADELinux服务器节点 (节点C、D)
# 启用IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 防火墙规则 iptables -A FORWARD -i wg0 -j ACCEPT iptables -A FORWARD -o wg0 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 开放WireGuard端口 iptables -A INPUT -p udp --dport 51822 -j ACCEPT端口开放要求
节点 端口 协议 说明 节点A 51820 UDP WireGuard监听端口 节点B 51821 UDP WireGuard监听端口 节点C 51822 UDP WireGuard监听端口 节点D - - 无需开放端口 部署步骤
1. 准备工作
- 确保所有节点已安装WireGuard
- 为每个节点生成密钥对
- 规划IP地址分配
- 确认网络连通性
2. 部署顺序
- 节点C (中心节点) - 首先配置并启动
- 节点D (连接到节点C)
- 节点A (连接到节点B和节点C)
- 节点B (连接到节点A和节点C)
3. 启动服务
OpenWrt节点
# 重启网络服务 /etc/init.d/network restart # 检查接口状态 ifconfig wg0Linux节点
# 启动WireGuard sudo wg-quick up wg0 # 设置开机自启 sudo systemctl enable wg-quick@wg0验证和测试
基本验证命令
# 检查WireGuard状态 sudo wg show # 检查路由表 ip route show | grep wg # 测试连通性 ping -c 3 10.0.0.3 # 测试到中心节点 ping -c 3 192.168.2.1 # 测试跨网段连通性 # 检查握手状态 sudo wg show wg0 latest-handshakes # 查看流量统计 sudo wg show wg0 transfer连通性测试脚本
#!/bin/bash # 连通性测试脚本 echo "测试WireGuard骨干网连通性..." for ip in 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4; do if ping -c 1 -W 3 $ip > /dev/null 2>&1; then echo "✅ $ip 连通" else echo "❌ $ip 不通" fi done echo "\n测试跨网段连通性..." for subnet in 192.168.1.1 192.168.2.1 192.168.3.1; do if ping -c 1 -W 3 $subnet > /dev/null 2>&1; then echo "✅ $subnet 连通" else echo "❌ $subnet 不通" fi done网络架构优势
- 高效路由: 边缘节点直连,减少中转延迟
- 负载分散: 避免中心节点成为瓶颈
- 路径冗余: 多条路径确保网络可靠性
- 安全加固: 支持预共享密钥增强安全性
- 易于扩展: 中心节点架构便于添加新节点
- 灵活配置: 支持不同类型设备和操作系统
故障排除
常见问题及解决方案
1. 连接建立失败
- 检查防火墙端口是否开放
- 验证endpoint地址和端口配置
- 确认公钥配置正确
2. 路由不通
- 检查AllowedIPs配置
- 验证系统路由表
- 确认IP转发已启用
3. 性能问题
- 调整MTU设置
- 检查网络路径和延迟
- 优化路由配置
4. 握手失败
- 确认时间同步
- 检查网络连通性
- 验证密钥配置
监控要点
- WireGuard服务运行状态
- 握手时间和频率
- 网络延迟和丢包率
- 流量统计和带宽使用
- 系统资源使用情况
日志分析
# 查看系统日志 journalctl -u wg-quick@wg0 -f # 查看内核日志 dmesg | grep wireguard # OpenWrt日志 logread | grep wireguard安全建议
- 定期更换密钥: 建议每6个月更换一次WireGuard密钥
- 使用预共享密钥: 在关键连接上启用预共享密钥
- 限制访问: 通过防火墙限制WireGuard端口访问
- 监控连接: 定期检查异常连接和流量
- 备份配置: 定期备份配置文件和密钥
- 更新软件: 保持WireGuard软件版本最新
扩展配置
添加新节点
- 为新节点生成密钥对
- 在中心节点添加新的Peer配置
- 配置新节点连接到中心节点
- 更新相关节点的AllowedIPs配置
- 测试连通性
高可用配置
- 部署多个中心节点
- 配置节点间的冗余连接
- 实现自动故障切换
- 使用负载均衡
- 节点A