在路由器上配置 WireGuard 点对站点 VPN

下图展示了一个家庭网络,其中有若干设备,以及一台可以安装 WireGuard 的路由器。

                       public internet              ┌─── wg0 10.10.11.1/24
10.10.11.2/24                                       │        VPN network
        home0│            xxxxxx       ppp0 ┌───────┴┐
           ┌─┴──┐         xx   xxxxx  ──────┤ router │
           │    ├─wlan0  xx       xx        └───┬────┘    home network, .home domain
           │    │       xx        x             │.1       10.10.10.0/24
           │    │        xxx    xxx             └───┬─────────┬─────────┐
           └────┘          xxxxxx                   │         │         │
Laptop in                                         ┌─┴─┐     ┌─┴─┐     ┌─┴─┐
Coffee shop                                       │   │     │   │     │   │
                                                  │pi4│     │NAS│     │...│
                                                  │   │     │   │     │   │
                                                  └───┘     └───┘     └───┘

当然,只有能在路由器上安装软件时,这种配置才可行。运营商提供的路由器通常不允许这样做。不过,一些运营商允许将设备设为桥接模式,这时就可以使用自己的设备,例如计算机、Raspberry Pi 或其他设备,承担路由功能。

由于路由器已经是家庭网络的默认网关,可以为 VPN 用户创建一个全新的网络。路由器能直接从互联网访问,因此也不需要创建任何(D)NAT 规则。

本指南使用以下地址、网络和术语:

  • 咖啡店里的笔记本电脑:普通用户通过咖啡店提供的 Wi-Fi 接入家庭网络,它是 VPN 配置中的一个对等端。
  • home0:笔记本上的 WireGuard 接口。这个名字表示它用于连接家庭网络。
  • 路由器:家庭网络中现有的路由器。它的公网接口 ppp0 拥有可路由但动态变化的 IPv4 地址,不是 CGNAT;内网接口地址为 10.10.10.1/24,是家庭网络的默认网关。
  • 家庭网络:现有网络,本例为 10.10.10.0/24,其中有用户希望通过 WireGuard VPN 远程访问的设备。
  • 10.10.11.0/24:WireGuard VPN 网络,是专门为 VPN 用户新建的网络。
  • 路由器上的 wg0:将在路由器上启用的 WireGuard 接口,地址为 10.10.11.1/24,也是 10.10.11.0/24 VPN 网络的网关。

在这种拓扑下,假如 NAS 要向 10.10.11.2/24 发送流量,由于它没有到 10.10.11.0/24 的专用路由,就会将流量发给默认网关。网关在该网络上有 wg0 接口,因此知道如何把流量发往 10.10.11.2/24。

配置

首先,为两端创建密钥:笔记本需要一对,家庭路由器也需要一对。

umask 077
wg genkey > laptop-private.key
wg pubkey < laptop-private.key > laptop-public.key
wg genkey > router-private.key
wg pubkey < router-private.key > router-public.key

接下来创建路由器 wg0 接口的配置文件 /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = <contents-of-router-private.key>
ListenPort = 51000
Address = 10.10.11.1/24

[Peer]
PublicKey = <contents-of-laptop-public.key>
AllowedIPs = 10.10.11.2

这里没有为笔记本对等端配置 Endpoint,因为无法预先知道它会使用什么 IP 地址,而且它的地址不会始终相同。笔记本可能从咖啡店的免费 Wi-Fi、机场休息室,或者朋友家发起连接。

不设置端点也意味着家庭网络一侧无法主动建立 VPN 连接。它只能等待并响应 VPN 握手请求,在收到请求时获知对方端点,然后继续使用这个端点,直到它发生变化,例如对方从另一个地点重新连接,或者连接超时。

重要:配置文件包含秘密信息 PrivateKey,必须相应限制权限:

sudo chmod 0600 /etc/wireguard/wg0.conf
sudo chown root: /etc/wireguard/wg0.conf

启用配置后,会创建地址为 10.10.11.1/24 的 wg0 接口,监听 51000/udp,并添加一条通过该接口访问 10.10.11.0/24 的路由。

[Peer] 部分通过公钥识别对等端,并列出哪些地址可以从该对等端连接。AllowedIPs 有两个作用:

  • 发送数据包时,它充当路由表,表明应使用这个对等端的公钥加密相关流量。
  • 接收数据包时,它类似访问控制列表。流量解密之后,只有匹配该列表才会被允许。

ListenPort 指定 WireGuard 监听流量的 UDP 端口,路由器防火墙必须放行该端口。WireGuard 没有默认或标准端口,可以选择适合自己的值。

现在为另一端,也就是笔记本,创建类似配置。这里的接口名是 home0,因此配置文件为 /etc/wireguard/home0.conf:

[Interface]
PrivateKey = <contents-of-laptop-private.key>
ListenPort = 51000
Address = 10.10.11.2/24

[Peer]
PublicKey = <contents-of-router-public.key>
Endpoint = <home-ppp0-IP-or-hostname>:51000
AllowedIPs = 10.10.11.0/24,10.10.10.0/24

重要:这个文件同样包含 PrivateKey,需要相应调整权限:

sudo chmod 0600 /etc/wireguard/home0.conf
sudo chown root: /etc/wireguard/home0.conf

这里为笔记本分配了 10.10.11.2/24。也可以使用 10.10.11.0/24 网络中的任何有效地址,只要不与现有地址冲突,并且已被路由器对应对等端的 AllowedIPs 允许。

注意:地址分配是手动进行的,没有使用 DHCP 之类的机制。请做好记录。

笔记本配置中的 [Peer] 包含:

  • PublicKey:用于标识对等端,发给该端的流量会使用此公钥加密。
  • Endpoint:告诉 WireGuard 将加密流量实际发往何处。本例由笔记本发起连接,因此它必须知道家庭路由器的公网 IP。如果运营商分配了固定 IP,就不需要额外处理;如果是每次重新连接都可能变化的动态 IP,则需要配置某种动态 DNS 服务。互联网上有许多免费服务,但它们的配置超出本指南范围。
  • AllowedIPs:列出目标网络。包含 VPN 网络 10.10.11.0/24,便于 ping 家庭路由器的 wg0 和同一 VPN 内的其他设备;还包含实际的家庭网络 10.10.10.0/24。

如果 AllowedIPs 只填写 0.0.0.0/0,VPN 就会成为默认网关,所有流量都会发往这个对等端。此类配置详见 默认网关。

测试连接

配置文件就绪后,可以启用 WireGuard 接口。在家庭路由器上运行:

sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.10.11.1/24 dev wg0
[#] ip link set mtu 1378 up dev wg0

确认 wg0 已启用,地址为 10.10.11.1/24:

ip a show dev wg0
9: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1378 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.10.11.1/24 scope global wg0
       valid_lft forever preferred_lft forever

再查看通过 wg0 接口访问 VPN 网络的路由:

ip route | grep wg0
10.10.11.0/24 dev wg0 proto kernel scope link src 10.10.11.1

wg show 此时应显示一些状态信息,但还没有已连接的对等端:

sudo wg show
interface: wg0
  public key: <router public key>
  private key: (hidden)
  listening port: 51000

peer: <laptop public key>
  allowed ips: 10.10.11.2/32

尤其要确认列出的公钥与自己创建、预期使用的公钥一致。

启动另一端之前,可以持续运行上述状态命令,以便观察变化:

sudo watch wg show

然后在笔记本上启动接口:

sudo wg-quick up home0
[#] ip link add home0 type wireguard
[#] wg setconf home0 /dev/fd/63
[#] ip -4 address add 10.10.11.2/24 dev home0
[#] ip link set mtu 1420 up dev home0
[#] ip -4 route add 10.10.10.0/24 dev home0

同样检查接口 IP 和新增路由:

ip a show dev home0
24: home0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.10.11.2/24 scope global home0
       valid_lft forever preferred_lft forever
ip route | grep home0
10.10.10.0/24 dev home0 scope link
10.10.11.0/24 dev home0 proto kernel scope link src 10.10.11.2

到这一步,家庭路由器上的 wg show 输出可能仍未变化。因为尚未向家庭网络发送任何流量,VPN 还没有被触发。默认情况下,WireGuard 在网络上非常“安静”。

产生流量后,VPN 就会“醒来”。试着 ping 家庭路由器的内部地址几次:

ping -c 3 10.10.10.1
PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
64 bytes from 10.10.10.1: icmp_seq=1 ttl=64 time=603 ms
64 bytes from 10.10.10.1: icmp_seq=2 ttl=64 time=300 ms
64 bytes from 10.10.10.1: icmp_seq=3 ttl=64 time=304 ms

注意第一次 ping 更慢,因为 VPN 正在唤醒并建立连接。之后隧道已建立,延迟便降低了。

同时,家庭路由器上的 wg show 会变成类似下面的内容:

sudo wg show
interface: wg0
  public key: <router public key>
  private key: (hidden)
  listening port: 51000

peer: <laptop public key>
  endpoint: <laptop public IP>:51000
  allowed ips: 10.10.11.2/32
  latest handshake: 1 minute, 8 seconds ago
  transfer: 564 B received, 476 B sent

原文:WireGuard VPN peer-to-site (on router)。作者/维护者:Canonical Ubuntu Server 文档贡献者。本文为原文的中文译文;代码保留原文内容。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容