用 $3 的 VPS 为整个团队搭建 WireGuard 中心节点

一套中心辐射式 VPN:每台设备独立密钥、分流并支持 IPv6,只需二十行配置和一个 systemd 单元。

C网CheapServ 网络团队作者 7 分钟阅读
一个中心节点通过光之隧道与多台小型设备相连
本页目录7
  1. 设计思路
  2. 十条命令搭好中心节点
  3. 添加设备
  4. 私有 DNS(可选)
  5. 访问中心节点背后的服务器
  6. VPS-1 能承载多大负载
  7. 日常运维

过去,团队 VPN 就意味着一份许可证、一套证书颁发机构,外加一周的接入工作。WireGuard 用一个 UDP 端口和每台设备一对密钥,取代了这一切。本文将在我们售卖的最便宜的套餐 VPS-1 上搭建一套中心辐射式(hub-and-spoke)VPN:每台设备使用独立密钥;采用分流(split tunnelling)配置,只让私有流量走隧道;隧道内同时启用 IPv6,因为没有理由不这么做。

设计思路

这台 VPS 就是中心节点(hub)。每台笔记本电脑、手机和办公室服务器都是一个分支节点(spoke),各自拥有自己的密钥对和隧道地址。分支节点之间通过中心节点互相通信,也可以访问您部署在中心节点背后的任何私有服务。公网流量仍然走各台设备原本的网络连接,所以不会有人的视频通话被绕远路。

  • 隧道网络:10.66.0.0/24 和 fd66::/64。
  • 中心节点:10.66.0.1,监听 UDP 51820 端口。
  • 分支节点:从 10.66.0.10 起依次递增,每台设备一个,绝不共用。

十条命令搭好中心节点

apt install -y wireguard
umask 077 && wg genkey | tee /etc/wireguard/hub.key | wg pubkey > /etc/wireguard/hub.pub
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.66.0.1/24, fd66::1/64
ListenPort = 51820
PrivateKey = $(cat /etc/wireguard/hub.key)
EOF
sysctl -w net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1
echo -e "net.ipv4.ip_forward=1\nnet.ipv6.conf.all.forwarding=1" > /etc/sysctl.d/70-wg.conf
ufw allow 51820/udp comment wireguard
systemctl enable --now wg-quick@wg0

正是转发功能,让分支节点之间能够经由中心节点互相通信。没有 NAT 规则时,中心节点不会把分支节点的流量路由到互联网,这恰恰就是分流的意义所在;如果之后想为公共 Wi-Fi 场景提供全隧道选项,再补一条 NAT 规则即可。

添加设备

只要条件允许,每台设备的密钥对都应在设备本机上生成,这样私钥就不会离开设备。在装有 WireGuard 应用的笔记本电脑上,新建一个空隧道并复制它的公钥;在手机上,应用会在隧道的设置页中显示公钥。然后在中心节点上注册这台设备:

wg set wg0 peer <DEVICE_PUBLIC_KEY> allowed-ips 10.66.0.10/32,fd66::10/128
wg-quick save wg0

再把下面这段内容粘贴到设备的隧道配置中:

[Interface]
PrivateKey = <generated on the device>
Address = 10.66.0.10/32, fd66::10/128
DNS = 10.66.0.1

[Peer]
PublicKey = <contents of /etc/wireguard/hub.pub>
Endpoint = hub.example.com:51820
AllowedIPs = 10.66.0.0/24, fd66::/64
PersistentKeepalive = 25

设备上的 AllowedIPs 就是分流开关:它只列出隧道网络,因此只有这部分流量会经由 WireGuard 路由。PersistentKeepalive 用来让手机和家用路由器上的 NAT 映射保持有效。对于手机,可以在中心节点上用 qrencode -t ansiutf8 < device.conf 根据配置生成二维码,再扫码导入;我们下单页面上的 WireGuard 一键应用,会在开通服务时为五台设备做同样的事。

私有 DNS(可选)

只有中心节点能够解析域名,DNS = 10.66.0.1 这一行才会生效。最简单的办法,是部署 unbound 作为本地递归解析器,并为您的私有主机配置几条静态记录:

apt install -y unbound
cat > /etc/unbound/unbound.conf.d/hub.conf <<'EOF'
server:
  interface: 10.66.0.1
  interface: fd66::1
  access-control: 10.66.0.0/24 allow
  access-control: fd66::/64 allow
  local-zone: "team.internal." static
  local-data: "git.team.internal. A 10.66.0.20"
  local-data: "wiki.team.internal. A 10.66.0.21"
EOF
systemctl restart unbound

这样一来,每个分支节点上都能访问 git.team.internal,而公网域名的查询则由中心节点递归解析,不再交给咖啡馆的 DNS。

访问中心节点背后的服务器

CheapServ 的其他服务器同样可以作为分支节点加入,拥有各自的密钥和地址,并且只能通过隧道访问。常见的做法,是把管理界面、数据库和仪表盘绑定到服务器的隧道地址上,并在公网防火墙上彻底关闭这些端口。只监听 10.66.0.20 的数据库根本不在互联网上,无论扫描机器人怎么折腾都没用。

VPS-1 能承载多大负载

WireGuard 采用的 ChaCha20 加密,在现代 CPU 上单核就能跑出数 Gbps 的吞吐量,所以单个 vCPU 并不是瓶颈。真正的限制是端口:VPS-1 配有 1 Gbps 端口和每月 4 TB 的流量,对一个十人团队的管理类 VPN 来说绰绰有余。在我们自己的使用中,一个挂着 30 个对等节点的中心节点,空闲时只占用 1% 的 CPU 和 40 MB 的内存。如果以后要让所有人的上网流量都经过它,需要盯紧的是带宽,而不是 CPU。

日常运维

  • wg show 会列出各个对等节点及其最近一次握手时间;如果某个对等节点已经好几分钟没有握手,说明它要么离线,要么配置有误。
  • 移除一台设备只需执行 wg set wg0 peer <KEY> remove && wg-quick save wg0;没有吊销列表,也没有有效期,这把密钥直接就失效了。
  • 把 /etc/wireguard/ 连同其余配置一起备份;中心节点的私钥是唯一真正重要的机密。
  • 每年轮换一次中心节点的密钥,或者在有笔记本电脑丢失时轮换;之后每台设备都需要换上新的公钥,正好借此机会清理一遍对等节点列表。

如果您压根不想自己维护中心节点,可以选择 Tailscale 附加选项,它通过托管的协调服务器为您提供同样的网状互联;代价是第三方会知道您有哪些对等节点。对于希望把密钥掌握在自己手里的团队来说,在一台 $3 的 VPS 上跑二十行 WireGuard 配置,很难被超越。

C网
CheapServ 网络团队

运营全部六个机房位置的骨干网络、transit 组合与 DDoS 防护。

一分钟内部署您的第一台服务器。

以 BTC、ETH、XMR 或 USDT 充值,$25 起。余额永不过期,未使用的部分可退款。

立即注册