一、为什么推荐 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 跳板等方案的地基。



