共同作者:tmlxs 和adr13n
WireGuard 是一個適用於IPv4 和IPv6 的網路隧道(VPN),採用UDP 協定。如今,大部分程式碼都駐留在Linux 核心中,但跨平台的實作正在進行中。 WireGuard 採用類似SSH 的認證機制,VPN 伺服器和每個用戶端都有自己的非對稱金鑰對。授權新客戶端只需將其公鑰新增至伺服器設定檔。需要注意的是,WireGuard 可以配置為使用預共用金鑰,作為現有非對稱金鑰的附加安全層。這是可選的,但可以提高對量子攻擊的抵抗力。
WireGuard 的優勢
WireGuard 的優勢在於其簡單性和可審計性:其程式碼量約為4 KLoC,而大多數替代方案的程式碼量超過100 KLoC,難以審計。它使用現代加密原語(Curve25519、HKDF、ChaCha20、Poly1305、BLAKE2s、SipHash24)並具有高效的實現,使其成為OpenVPN 和IPsec 的優秀替代品。 WireGuard 會以虛擬網路介面(例如,wg0)運作。這意味著可以使用標準的ip(8)
工具來管理該介面。
WireGuard 也是目前速度最快的VPN(請參閱基準測試),在吞吐量測試中超過了OpenVPN。它隱密且安靜,因為它不會對未認證的訊息發送回复,使其難以被網路掃描器發現。此外,它提供完美的前向保密。
需要注意的是,WireGuard 仍處於實驗階段,因此尚未準備好投入生產使用。
WireGuard 的基本概念
WireGuard 引入了端點(Endpoints)、對等體(Peers)和允許的IP(AllowedIPs)的概念。對等體是一個遠端主機,透過其公鑰進行標識。每個對等體都有一個允許的IP 清單。從伺服器的角度來看,允許的IP 是對等體可以使用的來源IP 位址。對客戶端而言,它們充當了一種路由表,確定資料包應為哪個對等體加密。如果對等體發送的封包來源IP 不在伺服器的允許IP 清單中,則該封包將被伺服器直接丟棄。端點是對等體的IP 位址(或主機名稱)和連接埠的組合。它會自動更新為來自對等體的正確身份驗證封包的最新來源IP 位址和連接埠。這意味著,例如,在行動網路之間跳轉的對等體(其外部IP 位址發生變化)仍然能夠接收傳入流量,因為每當其向伺服器發送身份驗證訊息時,端點都會更新。這是因為對等體透過其公鑰進行標識。
WireGuard 的安裝與設置
安裝
WireGuard 的安裝流程相當簡單。請檢查您的發行版是否提供了相應的包,連結如下: WireGuard 安裝指南。如果沒有,您需要按照說明從原始程式碼編譯。
安裝過程需要在伺服器和所有希望連接的客戶端上進行。
伺服器設定
首先,請確保啟用IP 轉發,透過在/etc/sysctl.conf
中加入以下內容:
bash
net.ipv4.ip_forward=1
運行以下命令以應用上述設定:
bash
$ sudo sysctl -p
同時,請確保WireGuard 使用的連接埠在防火牆上開放(本教學使用預設連接埠UDP/51820)。現在將設定WireGuard。需要選擇一個用於隧道中的主機範圍。在本部落格中,我們選擇使用192.168.3.0/24
,其中192.168.3.1
分配給伺服器, 192.168.3.2
分配給客戶端。
以下是以root 身分執行的命令,以產生伺服器的設定檔(將保存在/etc/wireguard/wg0.conf
中):
『`bash
[Interface] Address = 192.168.3.1/24 ListenPort = 51820 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o IFACE -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o IFACE -j MASQUERADE PrivateKey = $(wg genkey) SaveConfig = true
[Peer] PublicKey = CLIENT_PUBLIC_KEY AllowedIPs = CLIENT_VPN_IP/32 _EOF ```
確保以您面向網際網路的介面名稱(如eth0)取代IFACE。可以按照下面的部分說明,填寫[Peer] 區塊中的客戶端資訊。該區塊中的以下內容需要替換:
-
CLIENT_PUBLIC_KEY
是客戶端的公鑰。 -
CLIENT_VPN_IP
是分配給客戶端的隧道範圍內的IP。
PostUp
和PostDown
指令由Bash 在介面啟動或關閉後執行,分別啟用和停用NAT 和轉送。
最後,使用以下命令啟動WireGuard:
bash
$ sudo wg-quick up wg0
可以使用以下命令關閉VPN 服務:
bash
$ sudo wg-quick down wg0
請注意, wg-quick(8)
只是wg(8)
的Bash 包裝器,可能會直接整合到ip(8)
。設定檔中的SaveConfig = true
條目告訴WireGuard 在新增客戶端時自動更新設定文件,如下所述。
介面啟動後,可以使用以下命令查看連線的對等體:
bash
$ sudo wg show
執行上述命令時,將顯示伺服器的公鑰。您也可以透過將產生的設定檔中的私鑰貼到命令wg pubkey
中並按CTRL+d 來取得它。此公鑰將在下面設定客戶端時使用。
客戶端設定
客戶端也需要安裝WireGuard。安裝方式與上述安裝部分所述的相同。完成後,您可以繼續。
工具resolvconf
用於在啟動WireGuard 隧道時動態更改DNS 伺服器。如果您的發行版沒有resolvconf
,請安裝它或將下面的resolvconf
呼叫更改為適合您特定配置的內容。
現在以root 身分執行以下命令設定客戶端設定檔:
『`bash
[Interface] Address = 192.168.3.2/24 PostUp = echo nameserver DNS_SERVER | resolvconf -a tun.%i -m 0 -x PostDown = resolvconf -d tun.%i PrivateKey = $(wg genkey)
[Peer] PublicKey = SERVER_PUB_KEY AllowedIPs = 0.0.0.0/0 Endpoint = PUBLIC_VPN_IP:51820 _EOF ```
其中:
- DNS_SERVER
是您希望在通過VPN 隧道時所使用的DNS 伺服器的IP(例如,使用Google 的DNS 可填入8.8.8.8
)。
- SERVER_PUB_KEY
是前一部分產生的伺服器公鑰。
- PUBLIC_VPN_IP
是用戶端將連線的VPN 公用IP。
與伺服器相同,公鑰可以透過將設定檔中建立的私鑰貼到指令wg pubkey
中並按CTRL+d 來取得。
啟用/停用VPN 隧道
在客戶端,可以使用wg-quick(8)
啟用VPN:
bash
$ sudo wg-quick up wg0
若要禁用VPN:
bash
$ sudo wg-quick down wg0
可以使用以下命令取得連線資訊:
bash
$ sudo wg show
在伺服器上新增客戶端
每個新客戶端必須執行上述客戶端設定。然後,只需在伺服器上新增客戶端:
bash
$ sudo wg set wg0 peer CLIENT_PUB_KEY allowed-ips CLIENT_VPN_IP/32
由於設定條目SaveConfig = true
,新新增的用戶端將在下次關閉WireGuard 時儲存在設定檔中( wg-quick down wg0
)。 CLIENT_PUB_KEY
需要替換為客戶端的公鑰, CLIENT_VPN_IP
是分配給客戶端的隧道範圍內的IP(與客戶端設定檔中的Address
相同)。
深入了解
在這裡,我們設定了一個VPN,將所有流量通過隧道路由(在客戶端配置中使用了0.0.0.0/0, ::/0
的AllowedIPs
),但這可以減少到特定範圍(從而僅允許特定IP通過隧道路由)。此外,還可以設定多個配置。
WireGuard 的簡單性和高效性使其成為現代VPN 的理想選擇。如果您正在尋找快速連接的VPN 產品,WireGuard 絕對值得推薦。