WireGuard加密隧道组网实战:密钥配置、全隧道分流与排错指南


一、为什么推荐 WireGuard 而非传统 VPN

WireGuard 是近年最受关注的现代 VPN 方案:核心逻辑跑在内核,配置极简(一对公钥/私钥即可),加密用 ChaCha20-Poly1305,性能远胜 OpenVPN/IPSec,代码量小、审计友好。它特别适合三类场景:服务器之间的安全内网互通、个人远程接入家/办公网络、以及跨境低延迟代理(配合 Nginx/系统路由)。相比 OpenVPN 的证书体系,WireGuard 的"密钥对即身份"模型理解成本低得多。

二、安装与内核要求

WireGuard 在内核 5.6+ 已内置,老内核可用 DKMS 模块安装:

# Debian/Ubuntu
sudo apt update && sudo apt install -y wireguard

# RHEL/Rocky/AlmaLinux
sudo dnf install -y epel-release
sudo dnf install -y wireguard-tools

# 验证是否可用
wg --version
sudo modprobe wireguard   # 加载内核模块

三、生成密钥对与搭建服务端

每台机器一对密钥:wg genkey 生成私钥,私钥派生出公钥。在服务端执行:

# 生成服务端密钥对
cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
cat server_private.key server_public.key

编辑服务端配置文件 /etc/wireguard/wg0.conf:

[Interface]
Address = 10.0.0.1/24        # VPN 内网地址(服务端)
ListenPort = 51820
PrivateKey = 服务端私钥内容
# 转发客户端流量(做代理/全隧道时需要)
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# 客户端1
PublicKey = 客户端1的公钥
AllowedIPs = 10.0.0.2/32

注意 AllowedIPs 在服务端表示"该客户端拥有哪些内网地址";在客户端则表示"哪些流量走 VPN 隧道"。启用服务:

sudo systemctl enable --now wg-quick@wg0
sudo wg show                 # 查看隧道状态与各 peer 的最新握手时间

四、客户端配置:接入与全隧道/分流

客户端同样生成密钥对,把客户端公钥填入服务端的 [Peer],然后写客户端配置:

# /etc/wireguard/wg0.conf(客户端)
[Interface]
Address = 10.0.0.2/24
PrivateKey = 客户端私钥内容
DNS = 8.8.8.8

[Peer]
PublicKey = 服务端公钥
Endpoint = 你的服务器IP:51820
# 关键:AllowedIPs 决定流量走不走隧道
# 全隧道:AllowedIPs = 0.0.0.0/0(所有流量经 VPN)
# 仅内网/特定网段:AllowedIPs = 10.0.0.0/24
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
sudo wg-quick up wg0
ping 10.0.0.1      # 验证到服务端内网连通

全隧道(0.0.0.0/0)会把所有流量都走 VPN,适合安全代理;分流(只写需要走隧道的网段)则保留本地直连,适合"只访问公司内网、其他流量本地出"的场景。PersistentKeepalive 用于 NAT 环境下维持隧道不因超时断开,家用宽带/手机热点尤其需要。

五、内核转发与防火墙放行

服务端要让客户端访问外网或内网其他机器,必须开启内核 IP 转发并放行端口:

# 开启 IP 转发
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 放行 WireGuard 端口(按防火墙类型选择)
# firewalld
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
# iptables(如果已用 iptables 管理)
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT

若客户端"能握手但上不了网",十有八九是忘了开 ip_forward 或忘了加 MASQUERADE 伪装。用 wg show 确认 latest handshake 正常,再逐层排查 NAT 规则。

六、多客户端与安全加固

每加一台设备,只需在服务端 [Peer] 里新增一个 PublicKey 条目:

[Peer]
PublicKey = 客户端2的公钥
AllowedIPs = 10.0.0.3/32

# 然后重启接口使配置生效
sudo wg-quick down wg0 && sudo wg-quick up wg0

安全加固要点:

  • 默认拒绝:服务端不要配 AllowedIPs = 0.0.0.0/0 的 peer(那会允许对方任意转发),只给每个客户端分配最小网段。
  • 定期轮换密钥:私钥泄露=隧道失守,养成轮换习惯。
  • 限制端口暴露:51820/udp 只对必要的 IP 或经防火墙白名单开放。
  • 结合 fail2ban/防火墙:对暴力探测 UDP 端口的行为做限速。
  • 服务端禁用多余服务:VPN 只用于隧道,不在其上叠加不必要的开放端口。

七、排错速查

wg show 显示 no latest handshake
  -> 端口不通(防火墙/云安全组放行 51820/udp)、Endpoint 写错、或 NAT 环境需 PersistentKeepalive

能握手但 ping 不通对端
  -> 查服务端 ip_forward 是否开启、MASQUERADE 是否生效、AllowedIPs 路由是否正确

客户端全隧道后无法上网
  -> 服务端 NAT 未配置,或客户端 DNS 配置有误,先 ping 服务端内网地址测试

重启后隧道丢失
  -> 确认 wg-quick@wg0 已 enable,且服务端配置里没有语法错误

写在最后

WireGuard 用不到百行配置就实现了"高性能、低延迟、易维护"的 VPN。上手路径:装模块 → 生成密钥对 → 服务端写 [Interface]+[Peer] → 客户端写 [Peer] 并设置 AllowedIPs → 开启转发与防火墙放行 → 用 wg show 验证握手。把"每个客户端最小网段授权"和"轮换密钥"两条安全习惯内化,你就能把服务器、办公网、个人设备安全地连成一张自己的内网。它也是后续搭建异地组网、SSH 跳板等方案的地基。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

logrotate日志轮转实战:Nginx、PHP与应用日志自动切分清理

Git Webhook自动部署实战:post-receive钩子与一键回滚方案

评 论
更换验证码