从零开始:用WireGuard组建跨地域私有内网,让多台VPS像局域网一样互联


摘要: 手上有三台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带来的纯粹和高效吧。



自建邮件服务器避坑实录:为什么我不推荐你用VPS发邮件,以及如果非要发该怎么做

VPS被攻击了怎么办?从发现到恢复的完整应急手册

评 论
更换验证码