8.11. 使用 nmcli 配置 WireGuard 客户端

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。

此流程假设以下设置:

  • Client:

    • Private key: aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    • 隧道 IPv4 地址:192.0.2.2/24
    • 频道 IPv6 地址:2001:db8:1::2/32
  • server:

    • 公钥:UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    • 隧道 IPv4 地址:192.0.2.1/24
    • 频道 IPv6 地址:2001:db8:1::1/32

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 客户端的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

步骤

  1. 添加 NetworkManager WireGuard 连接配置集:

    # nmcli connection add type wireguard con-name client-wg0 ifname wg0 autoconnect no

    此命令创建一个名为 client-wg0 的配置文件,并将虚拟接口 wg0 分配给它。要防止连接在添加后而没有最终配置的情况下自动启动,请禁用 autoconnect 参数。

  2. 可选:配置 NetworkManager,使其不会自动启动 client-wg 连接:

    # nmcli connection modify client-wg0 autoconnect no
  3. 设置客户端的隧道 IPv4 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
  4. 设置客户端的隧道 IPv6 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
  5. 如果要通过隧道路由所有流量,请将服务器的隧道 IP 地址设置为默认网关:

    # nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1

    通过隧道路由所有流量要求您在后续步骤中将此客户端上的 allowed-ips 设置为 0.0.0.0/0;::/0

    请注意,通过隧道路由所有流量可能会影响到其他主机的连接,具体取决于服务器路由和防火墙配置。

  6. 将客户端的私钥添加到连接配置文件中:

    # nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
  7. 为您要允许与此客户端通信的每台服务器添加对等配置。您必须手动添加这些设置,因为 nmcli 工具不支持设置相应的连接属性。

    1. 编辑 /etc/NetworkManager/system-connections/client-wg0.nmconnection 文件,并追加:

      [wireguard-peer.UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=]
      endpoint=server.example.com:51820
      allowed-ips=192.0.2.1;2001:db8:1::1;
      persistent-keepalive=20
      • [wireguard-peer.<public_key_of_the_server>] 条目定义了服务器的对等部分,部分名称有服务器的公钥。
      • endpoint 参数设置服务器的主机名或 IP 地址以及端口。客户端使用此信息来建立连接。
      • allowed-ips 参数设置可向这个客户端发送数据的 IP 地址列表。例如,将参数设置为:

        • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。上例中的值可配置这种情况。
        • 0.0.0.0/0;::/0; 允许任何远程 IPv4 和 IPv6 地址与此客户端进行通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
      • 可选的 persistent-keepalive 参数定义一个 WireGuard 向服务器发送一个实时数据包的 间隔(以秒为单位)。如果您在网络中使用具有网络地址转换(NAT)的客户端,或者防火墙在一段时间不活跃后关闭 UDP 连接,则设置此参数。
    2. 重新载入 client-wg0 连接配置文件:

      # nmcli connection load /etc/NetworkManager/system-connections/client-wg0.nmconnection
  8. 重新激活 client-wg0 连接:

    # nmcli connection up client-wg0

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

    请注意,如果您已经通过 VPN 隧道发送流量,则输出只有 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page
  • nm-settings (5) 手册页中的 WireGuard 设置 部分