WireGuard 异地组网实战:一台 VPS 把家里、公司、手机串成加密局域网

前面写过一篇《内网穿透 VS WireGua…

前面写过一篇《内网穿透 VS WireGuard》的对比文,很多朋友看完留言说:道理都懂了,到底怎么搭?今天这篇就把 WireGuard 异地组网从零到跑通完整走一遍。目标是:用一台有公网 IP 的 VPS 当中转,把家里、公司、手机、笔记本这几台设备组进同一个加密局域网,彼此能像在同一个交换机下一样直接互访。

先说清楚一个概念:WireGuard 没有传统的”服务端/客户端”之分,所有节点在协议层面都是对等的 peer。但在异地组网里,通常会有一台设备拥有固定公网 IP,大家都能主动连到它,这台就被我们当成”中心节点”(也叫 hub)。其余设备只需要知道中心节点的公网地址,就能互相打洞通信。所以整个搭建过程,本质就是:装内核模块、生成密钥、写配置、启动、放行防火墙。

一、拓扑与网段规划

动手前先把网段定死,这一步最容易被忽略,却是后期排错的关键。假设我们的规划如下:

  • 中心节点(VPS):公网 IP 为 1.2.3.4,WireGuard 内网地址 10.0.0.1/24,监听 UDP 51820
  • 家里服务器:内网地址 10.0.0.2/32
  • 公司台式机:内网地址 10.0.0.3/32
  • 手机/笔记本:内网地址 10.0.0.4/32、10.0.0.5/32

这里有个细节:中心节点用 /24 网段,是为了让它成为这个虚拟网段的”网关”,方便做路由转发;而普通 peer 一律用 /32,表示”我这台设备就占这一个地址”,避免路由歧义。这个约定在很多教程里没讲清楚,导致新手配完互 ping 不通。

二、安装与生成密钥

Debian/Ubuntu 系直接一条命令装好,WireGuard 已经进了主线内核(5.6+),大多数现代发行版无需额外编译模块:

apt update && apt install -y wireguard

装完在每个节点上生成一对密钥。公钥可以随便发,私钥必须留在本机、严格保密。以中心节点为例:

cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey   # 抄下来,后面写进配置
cat publickey    # 抄下来,发给其他 peer

umask 077 这一步很关键,保证生成的私钥文件只有 root 能读,权限 600。每个节点都执行一遍,把各自的公钥集中记到一张表里,后面配置会反复用到。

三、中心节点(VPS)配置

创建配置文件 /etc/wireguard/wg0.conf,内容如下:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <中心节点私钥>
# 开启转发,让 peer 之间能互通
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer] # 家里服务器
PublicKey = <家里服务器公钥>
AllowedIPs = 10.0.0.2/32

[Peer] # 公司台式机
PublicKey = <公司台式机公钥>
AllowedIPs = 10.0.0.3/32

[Peer] # 手机
PublicKey = <手机公钥>
AllowedIPs = 10.0.0.4/32

几个要点:PostUp 里的 MASQUERADE 是 SNAT,作用是把 peer 发来的流量伪装成 VPS 自己的地址,让家里的设备能”借道” VPS 访问公网,同时也让各 peer 之间能互访。AllowedIPs 写成 /32 表示”这个 peer 只负责它自己的那个地址”,这是路由表精确匹配的关键。

别忘了放行防火墙端口。如果是 ufw:

ufw allow 51820/udp

如果 VPS 用的云厂商安全组,也要去控制台把 UDP 51820 加进入站规则,这步漏了会一直握手失败。

四、家里服务器(peer)配置

家里这台通常没有公网 IP,是被动连接方,配置更简单:

[Interface]
Address = 10.0.0.2/32
PrivateKey = <家里服务器私钥>

[Peer] # 中心节点 VPS
PublicKey = <中心节点公钥>
Endpoint = 1.2.3.4:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

这里两个字段要说透:Endpoint 让家里这台设备知道”去哪找中心节点”,主动发起连接;PersistentKeepalive = 25 表示每 25 秒发一个 keepalive 包,专门解决 NAT 后面的设备”长时间不通信,映射被网关回收”的问题。家里设备几乎都在 NAT 后面,这个字段基本是必填的,否则过一会儿就连不上了。

AllowedIPs = 10.0.0.0/24 的意思是:凡是发往 10.0.0.x 这个网段的流量,都走 WireGuard 隧道。想同时借道 VPS 上公网(把 VPS 当出口),可以再加一个 0.0.0.0/0,这里先不展开,避免和主路由冲突。

五、启动、自启与验证

所有节点配好后,逐台启动:

systemctl enable --now wg-quick@wg0
systemctl status wg-quick@wg0

启动后用 wg 查看隧道状态:

wg show
# 输出示例(中心节点)
interface: wg0
  public key: xxxxx
  private key: (hidden)
  listening port: 51820

peer: <家里服务器公钥>
  endpoint: 203.0.113.5:49152
  allowed ips: 10.0.0.2/32
  latest handshake: 1 minute, 20 seconds ago
  transfer: 1.2 MiB received, 3.4 MiB sent

看到 latest handshake 有时间戳、transfer 有流量,就说明隧道通了。接下来跨节点互 ping:

# 在中心节点 ping 家里服务器
ping -c 3 10.0.0.2

# 在公司台式机 ping 家里服务器(真正体现"异地互通")
ping -c 3 10.0.0.2

能通,组网就成功了。之后无论是 SSH、挂载共享盘、访问家里的 Web 服务,直接用 10.0.0.x 内网地址就行,等于把天南地北的几台机器拉进了同一个交换机。

六、排错速查

  • 一直握手失败(handshake 不更新):先查云安全组和 ufw 是否放行 UDP 51820;再查公钥/私钥是否抄错、Endpoint 端口是否写对。
  • 能握手但 ping 不通:九成是 AllowedIPs 没写对,或中心节点忘了开 ip_forward。用 sysctl net.ipv4.ip_forward 确认输出是 1。
  • 能连但过一会儿掉线:NAT 后面的 peer 漏了 PersistentKeepalive。
  • 大文件传输速度骤降:试试把 MTU 调小,比如两端都加 MTU = 1420,规避 PMTU 黑洞。
  • 想改配置:编辑 wg0.conf 后执行 wg syncconf wg0 <(wg-quick strip wg0),不用重启隧道即可热更新 peer。

WireGuard 的魅力在于极简:一套密钥、一个配置文件、几行命令,就能把跨地域的机器安全地串起来,全程没有中心化控制面板的依赖,数据只在你自己的节点间流转。配合之前写过的 Tailscale/Headscale 那篇,你现在既有了”开箱即用”的方案,也掌握了”完全自建”的底牌。家里、公司、手机三地互通,随时都能远程回趟家。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注