摘要: 手上有三台VPS,分别在香港、洛杉矶和日本,想让它们像同一路由器下的设备一样互相访问?WireGuard是目前最轻量、最高效的解决方案。本文不扯理论,只讲实操——从单节点部署到多节点组网,再到流量分流策略,全程复制粘贴即可。
一、为什么选WireGuard
OpenVPN成熟但臃肿,IPSec配置复杂得像解谜游戏,ZeroTier和Tailscale方便却依赖第三方中继。WireGuard的优势在于:内核级实现,性能开销极低;配置极简,一个INI风格的配置文件搞定;支持漫游,节点IP变化后自动重连;代码量仅约4000行,审计面小,安全性经得住推敲。
对于已有VPS资源的用户,自建WireGuard网络零额外成本,且完全可控。
二、网络拓扑规划
假设你有三个节点:
- 香港节点(hub):公网IP 1.1.1.1,内网IP 10.200.200.1,角色为中心枢纽
- 洛杉矶节点:公网IP 2.2.2.2,内网IP 10.200.200.2
- 日本节点:公网IP 3.3.3.3,内网IP 10.200.200.3
所有节点通过WireGuard隧道互联,内网IP固定,跨节点服务访问走隧道,对外出网流量可选择性分流。
三、安装WireGuard
各主流发行版均已内置或提供官方源:
# Ubuntu/Debian
sudo apt update
sudo apt install -y wireguard wireguard-tools
# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y wireguard-tools
# 验证安装
wg --version
四、生成密钥对
每个节点需要一对私钥和公钥:
# 生成私钥
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod 600 /etc/wireguard/private.key
# 从私钥派生公钥
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
在三个节点上分别执行,记录下各自的公钥。
五、配置中心枢纽节点(香港)
创建配置文件 /etc/wireguard/wg0.conf:
[Interface]
PrivateKey = 香港节点的私钥
Address = 10.200.200.1/24
ListenPort = 51820
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]
PublicKey = 洛杉矶节点的公钥
AllowedIPs = 10.200.200.2/32
Endpoint = 2.2.2.2:51820
PersistentKeepalive = 25
# 日本节点
[Peer]
PublicKey = 日本节点的公钥
AllowedIPs = 10.200.200.3/32
Endpoint = 3.3.3.3:51820
PersistentKeepalive = 25
启用IP转发:
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
启动接口:
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0
六、配置普通节点(洛杉矶)
[Interface]
PrivateKey = 洛杉矶节点的私钥
Address = 10.200.200.2/24
ListenPort = 51820
[Peer]
PublicKey = 香港节点的公钥
AllowedIPs = 10.200.200.0/24
Endpoint = 1.1.1.1:51820
PersistentKeepalive = 25
启动命令同上。
七、配置普通节点(日本)
[Interface]
PrivateKey = 日本节点的私钥
Address = 10.200.200.3/24
ListenPort = 51820
[Peer]
PublicKey = 香港节点的公钥
AllowedIPs = 10.200.200.0/24
Endpoint = 1.1.1.1:51820
PersistentKeepalive = 25
八、验证组网
在任意节点执行:
sudo wg show
应看到所有Peer的握手状态和流量统计。测试连通性:
# 从洛杉矶ping日本
ping 10.200.200.3
# 从日本访问洛杉矶的Web服务
curl http://10.200.200.2:8080
如果ping不通,检查防火墙是否放行UDP 51820端口,以及AllowedIPs是否配置正确。
九、进阶:流量分流策略
场景一:仅内网互通,出网流量不走隧道
上述配置已满足。各节点对外访问仍走自身默认网关,只有目标为10.200.200.0/24的流量进入WireGuard隧道。
场景二:指定节点作为出口网关
假设你想让洛杉矶节点的所有出网流量先绕到香港,利用香港的优质线路:
在洛杉矶节点的[Peer]中修改:
AllowedIPs = 0.0.0.0/0, ::/0
同时确保香港节点的PostUp规则正确配置MASQUERADE(已在第五步包含)。
场景三:分流国内/海外流量
在洛杉矶节点安装wireguard-tools自带的wg-quick不支持复杂分流,需要配合策略路由或第三方工具。更简单的方案是用iptables标记+ip rule:
# 创建自定义路由表
echo "200 wg" | sudo tee -a /etc/iproute2/rt_tables
# 标记来自特定用户的流量
sudo iptables -t mangle -A OUTPUT -m owner --uid-owner 1000 -j MARK --set-mark 0x1
# 标记流量走wg表
sudo ip rule add fwmark 0x1 table wg
sudo ip route add default dev wg0 table wg
这样只有特定用户(如运行代理服务的用户)的流量走隧道,其他流量不受影响。
十、防火墙与端口安全
WireGuard本身不响应未认证的数据包,具备"隐形"特性——端口扫描工具无法探测到WireGuard服务是否存在。但仍建议配合防火墙使用:
sudo ufw allow 51820/udp
sudo ufw enable
如果某节点位于NAT后(如家庭宽带、部分云厂商私有网络),无需配置ListenPort,只需在[Peer]中指定对端公网地址,PersistentKeepalive会维持NAT会话。
十一、维护与排障
查看实时状态
sudo wg show wg0
输出包括每个Peer的公钥、端点、允许IP、最新握手时间、接收/发送流量。
抓包分析
sudo tcpdump -i wg0 -n
查看隧道内的实际流量。
日志排障
sudo dmesg | grep wireguard
sudo journalctl -u wg-quick@wg0
常见问题:密钥不匹配(Handshake did not complete)、端点不可达(No endpoint)、AllowedIPs过于宽泛导致路由环路。
十二、写在最后
WireGuard的极简设计让它成为个人和小团队组网的首选工具。三条配置、五分钟部署,就能让分散在全球的VPS组成一个逻辑内网。但极简也意味着它不做高级功能——没有动态路由协议、没有内置ACL、没有流量审计。当你的网络规模扩大到几十台节点、需要细粒度访问控制时,可能需要转向更重的方案如Headscale(自托管Tailscale控制服务器)或传统IPSec/IKEv2。
在此之前,享受WireGuard带来的纯粹和高效吧。
