用 NetworkManager 配置 wireguard 虛擬私有網絡
虛擬私有網絡應用廣泛。如今有各種方案可供使用,用戶可通過這些方案訪問任意類型的資源,同時保持其機密性與隱私性。
最近,wireguard 因為其簡單性、速度與安全性成為最廣泛使用的虛擬私有網絡協議之一。wireguard 最早應用于 Linux 內核,但目前可以用在其他平臺,例如 iOS、Android 等。
wireguard 使用 UDP 作為其傳輸協議,并在 Critokey Routing(CKR)的基礎上建立對等節(jié)點之間的通信。每個對等節(jié)點(無論是服務器或客戶端)都有一對密鑰(公鑰與私鑰),公鑰與許可 IP 間建立通信連接。有關 wireguard 更多信息請訪問其 wireguard.com/" _fcksavedurl="https://www.wireguard.com/" class="ext" rel="external nofollow" target="_blank">主頁。
本文描述了如何在兩個對等節(jié)點(PeerA 與 PeerB)間設置 wireguard。兩個節(jié)點均運行 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 之間建立持久性虛擬私有網絡連接只需三步:
- 安裝所需軟件包。
- 生成密鑰對。
- 配置 wireguard 接口。
安裝
在兩個對等節(jié)點(PeerA 與 PeerB)上安裝 wireguard-tools
軟件包:
$ sudo -i
# dnf -y install wireguard-tools
這個包可以從 Fedora Linux 更新庫中找到。它在 /etc/wireguard/
中創(chuàng)建一個配置目錄。在這里你將創(chuàng)建密鑰和接口配置文件。
生成密鑰對
現在,使用 wg
工具在每個節(jié)點上生成公鑰與私鑰:
# cd /etc/wireguard
# wg genkey | tee privatekey | wg pubkey > publickey
wireguard-%E6%8E%A5%E5%8F%A3" class="mume-header">在 PeerA 上配置 wireguard 接口
wireguard 接口命名規(guī)則為 wg0
、wg1
等等。完成下述步驟為 wireguard 接口創(chuàng)建配置:
- PeerA 節(jié)點上配置想要的 IP 地址與掩碼。
- 該節(jié)點監(jiān)聽的 UDP 端口。
- PeerA 的私鑰。
# cat << EOF > /etc/wireguard/wg0.conf
[Interface]
Address = 172.16.1.254/24
SaveConfig = true
ListenPort = 60001
PrivateKey = mAoO2RxlqRvCZZoHhUDiW3+zAazcZoELrYbgl+TpPEc=
[Peer]
PublicKey = IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=
AllowedIPs = 172.16.1.2/32
EOF
允許 UDP 流量通過節(jié)點監(jiān)聽的端口:
# firewall-cmd --add-port=60001/udp --permanent --zone=public
# firewall-cmd --reload
success
最后,將接口配置文件導入 NetworkManager。這樣,wireguard 接口在重啟后將持續(xù)存在。
# nmcli con import type wireguard file /etc/wireguard/wg0.conf
Connection 'wg0' (21d939af-9e55-4df2-bacf-a13a4a488377) successfully added.
驗證 wg0
的狀態(tài):
# wg
interface: wg0
public key: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=
private key: (hidden)
listening port: 60001
peer: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=
allowed ips: 172.16.1.2/32
# nmcli -p device show wg0
===============================================================================
Device details (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/24
IP4.GATEWAY: --
IP4.ROUTE[1]: dst = 172.16.1.0/24, nh = 0.0.0.0, mt =>
-------------------------------------------------------------------------------
IP6.GATEWAY: --
-------------------------------------------------------------------------------
上述輸出顯示接口 wg0
已連接?,F在,它可以和虛擬私有網絡 IP 地址為 172.16.1.2 的對等節(jié)點通信。
wireguard-%E6%8E%A5%E5%8F%A3" class="mume-header">在 PeerB 上配置 wireguard 接口
現在可以在第二個對等節(jié)點上創(chuàng)建 wg0
接口的配置文件了。確保你已經完成以下步驟:
- PeerB 節(jié)點上設置 IP 地址與掩碼。
- PeerB 的私鑰。
- PeerA 的公鑰。
- PeerA 的 IP 地址或主機名、監(jiān)聽 wireguard 流量的 UDP 端口。
# cat << EOF > /etc/wireguard/wg0.conf
[Interface]
Address = 172.16.1.2
SaveConfig = true
PrivateKey = UBiF85o7937fBK84c2qLFQwEr6eDhLSJsb5SAq1lF3c=
[Peer]
PublicKey = FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=
AllowedIPs = 172.16.1.254/32
Endpoint = peera.example.com:60001
EOF
最后一步是將接口配置文件導入 NetworkManager。如上所述,這一步是重啟后保持 wireguard 接口持續(xù)存在的關鍵。
# nmcli con import type wireguard file /etc/wireguard/wg0.conf
Connection 'wg0' (39bdaba7-8d91-4334-bc8f-85fa978777d8) successfully added.
驗證 wg0
的狀態(tài):
# wg
interface: wg0
public key: IOePXA9igeRqzCSzw4dhpl4+6l/NiQvkDSAnj5LtShw=
private key: (hidden)
listening port: 47749
peer: FEPcisOjLaZsJbYSxb0CI5pvbXwIB3BCjMUPxuaLrH8=
endpoint: 192.168.124.230:60001
allowed ips: 172.16.1.254/32
# nmcli -p device show wg0
===============================================================================
Device details (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/32
IP4.GATEWAY: --
-------------------------------------------------------------------------------
IP6.GATEWAY: --
-------------------------------------------------------------------------------
上述輸出顯示接口 wg0
已連接。現在,它可以和虛擬私有網絡 IP 地址為 172.16.1.254 的對等節(jié)點通信。
驗證節(jié)點間通信
完成上述步驟后,兩個對等節(jié)點可以通過虛擬私有網絡連接相互通信,以下是 ICMP 測試結果:
[root@peerb ~]# ping 172.16.1.254 -c 4
PING 172.16.1.254 (172.16.1.254) 56(84) bytes of data.
64 bytes from 172.16.1.254: icmp_seq=1 ttl=64 time=0.566 ms
64 bytes from 172.16.1.254: icmp_seq=2 ttl=64 time=1.33 ms
64 bytes from 172.16.1.254: icmp_seq=3 ttl=64 time=1.67 ms
64 bytes from 172.16.1.254: icmp_seq=4 ttl=64 time=1.47 ms
在這種情況下,如果你在 PeerA 端口 60001 上捕獲 UDP 通信,則將看到依賴 wireguard 協議的通信過程和加密的數據:
捕獲依賴 wireguard 協議的節(jié)點間 UDP 流量
總結
虛擬私有網絡很常見。在用于部署虛擬私有網絡的各種協議和工具中,wireguard 是一種簡單、輕巧和安全的選擇。它可以在對等節(jié)點之間基于 CryptoKey 路由建立安全的點對點連接,過程非常簡單。此外,NetworkManager 支持 wireguard 接口,允許重啟后進行持久配置。