WireGuard 组网实战:一台 VPS + 家里宽带,搭个跨网内网

场景

家里 NAS 没公网 IP,人在外面想访问;笔记本经常在外面跑,也想进家里内网。手头有一台有公网 IP 的 VPS。

方案:VPS 当 hub,家里机器和笔记本都作为 peer 连上 VPS,三者进同一个 10.8.0.0/24 内网。之后 NAS 上的服务(比如 10.8.0.2:5000)在任何地方都能直接访问,跟在家里一样。

为什么选 WireGuard 不选 OpenVPN?配置就几行,内核级速度快,断线重连几乎无感。2026 年了,新组网没理由再折腾 OpenVPN 的证书体系。

Hub 端(VPS)配置

# /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <VPS 的私钥>

# 家里 NAS
[Peer]
PublicKey = <NAS 的公钥>
AllowedIPs = 10.8.0.2/32

# 笔记本
[Peer]
PublicKey = <笔记本的公钥>
AllowedIPs = 10.8.0.3/32

关键第一处:hub 端 AllowedIPs 写对端的内网地址(10.8.0.2/32),这是告诉 hub"去往 10.8.0.2 的包从这个 peer 走"——相当于静态路由。写错了包就不知道往哪发。

记得放行防火墙:ufw allow 51820/udp。

家里 NAS 端配置

[Interface]
Address = 10.8.0.2/24
PrivateKey = <NAS 的私钥>

[Peer]
PublicKey = <VPS 的公钥>
Endpoint = <VPS 公网 IP>:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25

关键第二处:AllowedIPs = 10.8.0.0/24——NAS 端要的是整个内网段,这样访问笔记本(10.8.0.3)的流量也会走隧道。

关键第三处:PersistentKeepalive = 25。家里宽带在 NAT 后面,运营商 NAT 会话超时(一般几分钟)后,从外往里的包就进不来了。每 25 秒发个心跳包保住 NAT 映射,这是 NAT 后面设备不断线的命根子。VPS 有公网 IP 的 hub 端不需要加。

验证

三台都 wg-quick up wg0 之后:

# 在笔记本上
ping 10.8.0.2   # 通 NAS
ping 10.8.0.1   # 通 VPS

# 看握手状态
wg show

latest handshake 在几十秒以内的就是活的。如果 NAS 那行 handshake 很久没更新,八成是 PersistentKeepalive 没加,NAT 会话掉了。

一句话总结

hub 写对端地址做路由,NAT 后面的端加心跳保活,内网段互访就通了。这套配置我跑了两年,稳得不想换。