场景
家里 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 后面的端加心跳保活,内网段互访就通了。这套配置我跑了两年,稳得不想换。
