用 NetworkManager 配置 wireguard 虚拟私有网络,


虚拟私有网络Virtual Private Networks应用广泛。如今有各种方案可供使用,用户可通过这些方案访问任意类型的资源,同时保持其机密性与隐私性。

最近,wireguard 因为其简单性、速度与安全性成为最广泛使用的虚拟私有网络协议之一。wireguard 最早应用于 Linux 内核,但目前可以用在其他平台,例如 iOS、Android 等。

wireguard 使用 UDP 作为其传输协议,并在 Critokey Routing(CKR)的基础上建立对等节点之间的通信。每个对等节点(无论是服务器或客户端)都有一对密钥key(公钥与私钥),公钥与许可 IP 间建立通信连接。有关 wireguard 更多信息请访问其 wireguard.com/" _fcksavedurl="https://www.wireguard.com/" class="ext" rel="external nofollow" target="_blank">主页。

本文描述了如何在两个对等节点(PeerA 与 PeerB)间设置 wireguard。两个节点均运行 Fedora Linux 系统,使用 NetworkManager 进行持久性配置。

wireguard-%E8%AE%BE%E7%BD%AE%E4%B8%8E%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE" class="mume-header">wireguard 设置与网络配置

在 PeerA 与 PeerB 之间建立持久性虚拟私有网络连接只需三步:

安装

在两个对等节点(PeerA 与 PeerB)上安装 wireguard-tools 软件包:

  1. $ sudo -i
  2. # dnf -y install wireguard-tools

这个包可以从 Fedora Linux 更新库中找到。它在 /etc/wireguard/ 中创建一个配置目录。在这里你将创建密钥和接口配置文件。

生成密钥对

现在,使用 wg 工具在每个节点上生成公钥与私钥:

  1. # cd /etc/wireguard
  2. # wg genkey | tee privatekey | wg pubkey > publickey

wireguard-%E6%8E%A5%E5%8F%A3" class="mume-header">在 PeerA 上配置 wireguard 接口

wireguard 接口命名规则为 wg0wg1 等等。完成下述步骤为 wireguard 接口创建配置:

  • PeerA 节点上配置想要的 IP 地址与掩码。
  • 该节点监听的 UDP 端口。
  • PeerA 的私钥。
  1. # cat << EOF > /etc/wireguard/wg0.conf
  2. [Interface]
  3. Address = 172.16.1.254/24
  4. SaveConfig = true
  5. ListenPort = 60001
  6. PrivateKey = mAoO2RxlqRvCZZoHhUDiW3+zAazcZoELrYbgl+TpPEc=
  7.  
  8. [Peer]
  9. PublicKey = IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=
  10. AllowedIPs = 172.16.1.2/32
  11. EOF

允许 UDP 流量通过节点监听的端口:

  1. # firewall-cmd --add-port=60001/udp --permanent --zone=public
  2. # firewall-cmd --reload
  3. success

最后,将接口配置文件导入 NetworkManager。这样,wireguard 接口在重启后将持续存在。

  1. # nmcli con import type wireguard file /etc/wireguard/wg0.conf
  2. Connection 'wg0' (21d939af-9e55-4df2-bacf-a13a4a488377) successfully added.

验证 wg0的状态:

  1. # wg
  2. interface: wg0
  3. public key: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=
  4. private key: (hidden)
  5. listening port: 60001
  6.  
  7. peer: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=
  8. allowed ips: 172.16.1.2/32
  9.  
  10. # nmcli -p device show wg0
  11.  
  12. ===============================================================================
  13. Device details (wg0)
  14. ===============================================================================
  15. GENERAL.DEVICE: wg0
  16. -------------------------------------------------------------------------------
  17. GENERAL.TYPE: wireguard
  18. -------------------------------------------------------------------------------
  19. GENERAL.HWADDR: (unknown)
  20. -------------------------------------------------------------------------------
  21. GENERAL.MTU: 1420
  22. -------------------------------------------------------------------------------
  23. GENERAL.STATE: 100 (connected)
  24. -------------------------------------------------------------------------------
  25. GENERAL.CONNECTION: wg0
  26. -------------------------------------------------------------------------------
  27. GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC>
  28. -------------------------------------------------------------------------------
  29. IP4.ADDRESS[1]: 172.16.1.254/24
  30. IP4.GATEWAY: --
  31. IP4.ROUTE[1]: dst = 172.16.1.0/24, nh = 0.0.0.0, mt =>
  32. -------------------------------------------------------------------------------
  33. IP6.GATEWAY: --
  34. -------------------------------------------------------------------------------

上述输出显示接口 wg0 已连接。现在,它可以和虚拟私有网络 IP 地址为 172.16.1.2 的对等节点通信。

wireguard-%E6%8E%A5%E5%8F%A3" class="mume-header">在 PeerB 上配置 wireguard 接口

现在可以在第二个对等节点上创建 wg0 接口的配置文件了。确保你已经完成以下步骤:

  • PeerB 节点上设置 IP 地址与掩码。
  • PeerB 的私钥。
  • PeerA 的公钥。
  • PeerA 的 IP 地址或主机名、监听 wireguard 流量的 UDP 端口。
  1. # cat << EOF > /etc/wireguard/wg0.conf
  2. [Interface]
  3. Address = 172.16.1.2
  4. SaveConfig = true
  5. PrivateKey = UBiF85o7937fBK84c2qLFQwEr6eDhLSJsb5SAq1lF3c=
  6.  
  7. [Peer]
  8. PublicKey = FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=
  9. AllowedIPs = 172.16.1.254/32
  10. Endpoint = peera.example.com:60001
  11. EOF

最后一步是将接口配置文件导入 NetworkManager。如上所述,这一步是重启后保持 wireguard 接口持续存在的关键。

  1. # nmcli con import type wireguard file /etc/wireguard/wg0.conf
  2. Connection 'wg0' (39bdaba7-8d91-4334-bc8f-85fa978777d8) successfully added.

验证 wg0 的状态:

  1. # wg
  2. interface: wg0
  3. public key: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=
  4. private key: (hidden)
  5. listening port: 47749
  6.  
  7. peer: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=
  8. endpoint: 192.168.124.230:60001
  9. allowed ips: 172.16.1.254/32
  10.  
  11. # nmcli -p device show wg0
  12.  
  13. ===============================================================================
  14. Device details (wg0)
  15. ===============================================================================
  16. GENERAL.DEVICE: wg0
  17. -------------------------------------------------------------------------------
  18. GENERAL.TYPE: wireguard
  19. -------------------------------------------------------------------------------
  20. GENERAL.HWADDR: (unknown)
  21. -------------------------------------------------------------------------------
  22. GENERAL.MTU: 1420
  23. -------------------------------------------------------------------------------
  24. GENERAL.STATE: 100 (connected)
  25. -------------------------------------------------------------------------------
  26. GENERAL.CONNECTION: wg0
  27. -------------------------------------------------------------------------------
  28. GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC>
  29. -------------------------------------------------------------------------------
  30. IP4.ADDRESS[1]: 172.16.1.2/32
  31. IP4.GATEWAY: --
  32. -------------------------------------------------------------------------------
  33. IP6.GATEWAY: --
  34. -------------------------------------------------------------------------------

上述输出显示接口 wg0 已连接。现在,它可以和虚拟私有网络 IP 地址为 172.16.1.254 的对等节点通信。

验证节点间通信

完成上述步骤后,两个对等节点可以通过虚拟私有网络连接相互通信,以下是 ICMP 测试结果:

  1. [root@peerb ~]# ping 172.16.1.254 -c 4
  2. PING 172.16.1.254 (172.16.1.254) 56(84) bytes of data.
  3. 64 bytes from 172.16.1.254: icmp_seq=1 ttl=64 time=0.566 ms
  4. 64 bytes from 172.16.1.254: icmp_seq=2 ttl=64 time=1.33 ms
  5. 64 bytes from 172.16.1.254: icmp_seq=3 ttl=64 time=1.67 ms
  6. 64 bytes from 172.16.1.254: icmp_seq=4 ttl=64 time=1.47 ms

在这种情况下,如果你在 PeerA 端口 60001 上捕获 UDP 通信,则将看到依赖 wireguard 协议的通信过程和加密的数据:

捕获依赖 wireguard 协议的节点间 UDP 流量

总结

虚拟私有网络很常见。在用于部署虚拟私有网络的各种协议和工具中,wireguard 是一种简单、轻巧和安全的选择。它可以在对等节点之间基于 CryptoKey 路由建立安全的点对点连接,过程非常简单。此外,NetworkManager 支持 wireguard 接口,允许重启后进行持久配置。

相关内容