虚拟私有网络VirtualPrivateNetworks应用广泛。如今有各种方案可供使用,用户可通过这些方案访问任意类型的资源,同时保持其机密性与隐私性。
最近,WireGuard因为其简单性、速度与安全性成为最广泛使用的虚拟私有网络协议之一。WireGuard最早应用于Linux内核,但目前可以用在其他平台,例如iOS、Android等。
WireGuard使用UDP作为其传输协议,并在CritokeyRouting(CKR)的基础上建立对等节点之间的通信。每个对等节点(无论是服务器或客户端)都有一对密钥key(公钥与私钥),公钥与许可IP间建立通信连接。有关WireGuard更多信息请访问其主页。
本文描述了如何在两个对等节点(PeerA与PeerB)间设置WireGuard。两个节点均运行FedoraLinux系统,使用NetworkManager进行持久性配置。
WireGuard设置与网络配置
在PeerA与PeerB之间建立持久性虚拟私有网络连接只需三步:
- 安装所需软件包。
- 生成密钥对keypair。
- 配置WireGuard接口。
安装
在两个对等节点(PeerA与PeerB)上安装wireguard-tools软件包:
$sudo-i#dnf-yinstallwireguard-tools
这个包可以从FedoraLinux更新库中找到。它在/etc/wireguard/中创建一个配置目录。在这里你将创建密钥和接口配置文件。
生成密钥对
现在,使用wg工具在每个节点上生成公钥与私钥:
#cd/etc/wireguard#wggenkey|teeprivatekey|wgpubkey>publickey
在PeerA上配置WireGuard接口
WireGuard接口命名规则为wg0、wg1等等。完成下述步骤为WireGuard接口创建配置:
- PeerA节点上配置想要的IP地址与掩码。
- 该节点监听的UDP端口。
- PeerA的私钥。
#cat/etc/wireguard/wg0.conf[Interface]Address=172.16.1.254/24SaveConfig=trueListenPort=60001PrivateKey=mAoO2RxlqRvCZZoHhUDiW3+zAazcZoELrYbgl+TpPEc=[Peer]PublicKey=IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=AllowedIPs=172.16.1.2/32EOF
允许UDP流量通过节点监听的端口:
#firewall-cmd--add-port=60001/udp--permanent--zone=public#firewall-cmd--reloadsuccess
最后,将接口配置文件导入NetworkManager。这样,WireGuard接口在重启后将持续存在。
#nmcliconimporttypewireguardfile/etc/wireguard/wg0.confConnection'wg0'(21d939af-9e55-4df2-bacf-a13a4a488377)successfullyadded.
验证wg0的状态:
#wginterface:wg0publickey:FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=privatekey:(hidden)listeningport:60001peer:IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=allowedips:172.16.1.2/32#nmcli-pdeviceshowwg0===============================================================================Devicedetails(wg0)===============================================================================GENERAL.DEVICE:wg0-------------------------------------------------------------------------------GENERAL.TYPE:wireguard-------------------------------------------------------------------------------GENERAL.HWADDR:(unknown)-------------------------------------------------------------------------------GENERAL.MTU:1420-------------------------------------------------------------------------------GENERAL.STATE:100(connected)-------------------------------------------------------------------------------GENERAL.CONNECTION:wg0-------------------------------------------------------------------------------GENERAL.CON-PATH:/org/freedesktop/NetworkManager/ActiveC>-------------------------------------------------------------------------------IP4.ADDRESS[1]:172.16.1.254/24IP4.GATEWAY:--IP4.ROUTE[1]:dst=172.16.1.0/24,nh=0.0.0.0,mt=>-------------------------------------------------------------------------------IP6.GATEWAY:---------------------------------------------------------------------------------
上述输出显示接口wg0已连接。现在,它可以和虚拟私有网络IP地址为172.16.1.2的对等节点通信。
在PeerB上配置WireGuard接口
现在可以在第二个对等节点上创建wg0接口的配置文件了。确保你已经完成以下步骤:
- PeerB节点上设置IP地址与掩码。
- PeerB的私钥。
- PeerA的公钥。
- PeerA的IP地址或主机名、监听WireGuard流量的UDP端口。
#cat/etc/wireguard/wg0.conf[Interface]Address=172.16.1.2SaveConfig=truePrivateKey=UBiF85o7937fBK84c2qLFQwEr6eDhLSJsb5SAq1lF3c=[Peer]PublicKey=FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=AllowedIPs=172.16.1.254/32Endpoint=peera.example.com:60001EOF
最后一步是将接口配置文件导入NetworkManager。如上所述,这一步是重启后保持WireGuard接口持续存在的关键。
#nmcliconimporttypewireguardfile/etc/wireguard/wg0.confConnection'wg0'(39bdaba7-8d91-4334-bc8f-85fa978777d8)successfullyadded.
验证wg0的状态:
#wginterface:wg0publickey:IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=privatekey:(hidden)listeningport:47749peer:FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=endpoint:192.168.124.230:60001allowedips:172.16.1.254/32#nmcli-pdeviceshowwg0===============================================================================Devicedetails(wg0)===============================================================================GENERAL.DEVICE:wg0-------------------------------------------------------------------------------GENERAL.TYPE:wireguard-------------------------------------------------------------------------------GENERAL.HWADDR:(unknown)-------------------------------------------------------------------------------GENERAL.MTU:1420-------------------------------------------------------------------------------GENERAL.STATE:100(connected)-------------------------------------------------------------------------------GENERAL.CONNECTION:wg0-------------------------------------------------------------------------------GENERAL.CON-PATH:/org/freedesktop/NetworkManager/ActiveC>-------------------------------------------------------------------------------IP4.ADDRESS[1]:172.16.1.2/32IP4.GATEWAY:---------------------------------------------------------------------------------IP6.GATEWAY:---------------------------------------------------------------------------------
上述输出显示接口wg0已连接。现在,它可以和虚拟私有网络IP地址为172.16.1.254的对等节点通信。
验证节点间通信
完成上述步骤后,两个对等节点可以通过虚拟私有网络连接相互通信,以下是ICMP测试结果:
[root@peerb~]#ping172.16.1.254-c4PING172.16.1.254(172.16.1.254)56(84)bytesofdata.64bytesfrom172.16.1.254:icmp_seq=1ttl=64time=0.566ms64bytesfrom172.16.1.254:icmp_seq=2ttl=64time=1.33ms64bytesfrom172.16.1.254:icmp_seq=3ttl=64time=1.67ms64bytesfrom172.16.1.254:icmp_seq=4ttl=64time=1.47ms
在这种情况下,如果你在PeerA端口60001上捕获UDP通信,则将看到依赖WireGuard协议的通信过程和加密的数据:
总结
虚拟私有网络很常见。在用于部署虚拟私有网络的各种协议和工具中,WireGuard是一种简单、轻巧和安全的选择。它可以在对等节点之间基于CryptoKey路由建立安全的点对点连接,过程非常简单。此外,NetworkManager支持WireGuard接口,允许重启后进行持久配置。