WireGuard:新一代核心級虛擬網路神器

什麼是WireGuard

 是一個易於設定、快速且安全的開源 VPN,它利用了最新的加密技術。目的是提供更快、更簡單、更精簡的通用VPN,它可以輕鬆地在樹莓派這類低端設備到高階伺服器上部署。

IPsec 和OpenVPN 等大多數其他解決方案是幾十年前開發的。安全研究人員和核心開發人員Jason Donenfeld 意識到它們速度慢且難以正確配置和管理。

這讓他創建了一個新的開源VPN 協定和解決方案,它更加快速、安全、易於部署和管理。

WireGuard 最初是為Linux 開發的,但現在可用於Windows、macOS、BSD、iOS 和Android。它仍在活躍開發中。

為什麼WireGuard 如此受歡迎?

除了可以跨平台之外,WireGuard 的最大優點之一就是易於部署。設定和部署WireGuard 就像設定和使用SSH 一樣容易。

看看 WireGuard 設定指南。安裝WireGuard、產生公鑰和私鑰(像SSH 一樣),設定防火牆規則並啟動服務。現在將它和 OpenVPN 設定指南進行比較——有太多要做的了。

WireGuard 的另一個好處是它有一個僅4000 行程式碼的精簡程式碼庫。將它與 OpenVPN(另一個流行的開源VPN)的100,000 行程式碼相比。顯然,調試WireGuard 更加容易。

不要因其簡單而小看它。 WireGuard 支援所有最新的加密技術,例如 Noise 協定框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF 和安全受信任結構。

由於WireGuard 運行在核心空間,因此可以高速提供安全的網路。

主流虛擬網特點

目前市場主流的虛擬網有IPSEC 虛擬網、SSL虛擬網、PPTP 虛擬網、L2TP 虛擬網等,它們在安全性、效能等方面都存在明顯的缺點,具體見下表1所示。

WireGuard:新一代核心級虛擬網路神器

WireGuard 介紹

WireGuard 虛擬網是最新開發的內核級虛擬網,被Linux創始人Linus Torvalds極力推薦,並於2020年3月正式合併進了Linux 5.6內核,之後,GG也將WireGuard 虛擬網添加到安卓12的Linux內核中,它的優點是安全性高、性能高、複雜度所示。

WireGuard:新一代核心級虛擬網路神器

相較於OpenVPN 、 IPSec 的數十萬行程式碼,WireGuard 只有短短的四千行。

Linux 創辦人Linus Torvalds在郵件中稱其為一件藝術品:work of art,信箱原文:https://lists.openwall.net/netdev/2018/08/02/124

Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn't perfect, but I've skimmed it, and compared to the horrors that are OpenVPN and IPSec, itarts a work of itarts.

WireGuard 安全性

  • Curve25519 目前最高水準的秘鑰交換演算法。
  • ChaCha20 對稱加解密演算法,比AES 更快更有效率。
  • Poly1305 是一種MAC (Message Authentication Code) 標準,用於驗證資料的完整性和訊息的真實性。
  • BLAKE2 更安全的HASH 演算法(類似的有SHA1, SHA256, MD5)
  • SipHash24 另一種HASH 演算法。
  • HKDF 一種秘鑰衍生演算法

WireGuard 虛擬網特性

WireGuard 虛擬網由於是100%核心處理,省去了用戶進程和核心互動的開銷,因此效能優越,具體表現為吞吐量高,是SSL虛擬網/Open虛擬網的2~4倍,見圖1所示,同時,時延低,是SSL虛擬網/Open虛擬網的30%~4012,見圖。

WireGuard:新一代核心級虛擬網路神器
WireGuard:新一代核心級虛擬網路神器

吞吐量大、時延越小意味著在相同頻寬的網路環境中並發虛擬網路用戶數大,系統負載小,長期運作穩定,這是100~10000用戶數虛擬網、零信任、SD-WAN選用時要考慮的關鍵因素之一。

判斷虛擬網服務是否為100%內核處理,可以透過在SHELL下執行netstat –nap指令,檢視虛擬網路伺服器監聽埠所對應的程序,如果最後一列有程式名,就表示是使用者態程式監聽,如果最後一列是「-」沒有程式名,就表示是以下核心在資料表下參考

WireGuard:新一代核心級虛擬網路神器

WireGuard 虛擬網模組介紹

WireGuard 虛擬網是公鑰/私鑰加密體制,加密參數由自己的私鑰和對方的公鑰組成,即通訊雙方需要事前交換公鑰,當客戶端數量大時,密鑰的生成、修改、銷毀和交換,以及客戶端配置文件的獲取成為了一種管理負擔,與之相對應,IKEv2 虛擬網元可交換虛擬網,如果可以使用這一步。

WireGuard 安裝

  • 官方安裝手冊:https://www.wireguard.com/install/
  • docker安裝:https://hub.docker.com/r/linuxserver/wireguard

centos7安裝wireguard來源

 curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo 

centos7安裝wireguard

 yum install -y wireguard-dkms wireguard-tools 

如果覺得速度慢,可以先去wireguard來源下載rpm包:

 wget https://copr-be.cloud.fedoraproject.org/results/jdoss/wireguard/epel-7-x86_64/02151984-wireguard-dkms/wireguard-dkms-1.0.20210424-1.el7.noarch. 

centos8安裝wireguard

 
yum install epel-release yum config-manager --set-enabled powerTools yum copr enable jdoss/wireguard yum install wireguard-dkms wireguard-tools
 

WireGuard 配置

wireguard配置說明

  • 服務端設定檔中的[Interface]是儲存自己的服務端私匙,而用戶端設定檔中的[Interface] 也會儲存自己的用戶端私匙。
  • 服務端設定檔中的[Peer]是儲存用戶端的公匙,而用戶端設定檔中的[Peer]是儲存服務端的公匙。
  • 服務端與客戶端都是互相保存自己的私匙在[Interface] 中,互相保存對方公匙在[Peer]中。

wireguard 服務端配置

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat << EOF > /etc/wireguard/wg0.conf

[Interface] #位址只需要寫入準備分配到本機虛擬位址,服務端和用戶端位址都是唯一不可衝突的Address = 178.10.10.1/24 SaveConfig = true #服務端防火牆只需要開啟一個udp埠的偽裝,並且對應到外網PostUp = wall- --zone=public --add-masquerade PostDown = firewall-cmd --zone=public --remove-port 50107/udp && firewall-cmd --zone=public --remove-masquerade #埠監聽上方防火牆開啟的KeyListenPort = 50107 150107 150107 150107號埠為kADzYhPw3F1XCAolbpHQKyPjZE1VQQeyncL60wbFQlM= [Peer] #PublicKey為客戶端的公鑰PublicKey = xUh7M1dhWZijlQfZv1bqPAvI8dwCfsdm8RD #服務端allowip不能寫服務端外網ip段和本機內網ip段,只需要寫本機想透過vpn網路網路要存取到哪個網段,我這裡服務端只寫了虛擬位址段,因為我沒有服務端直接存取客戶端內網ip段的需求AllowedIPs = 178.10.10.2/32 EOF.

第一次啟動服務用restart

 systemctl restart wg-quick@wg0.service 

後續更改配置後重啟用reload

 systemctl reload wg-quick@wg0.service 

兩端能正常通訊才設定服務開機自啟動

 systemctl enable wg-quick@wg0.service 

wireguard客戶端配置

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat << EOF > /etc/wireguard/wg0.conf

[Interface] #PrivateKey為客戶端私鑰PrivateKey = CERouQpIqthDNhcSKqS2I/lexMH9z/pImXajg7QLs3E= #位址只需要寫入準備分配到本機虛擬位址,服務端和客戶端位址都是唯一不可衝突的Address = 位址只需要寫入#請確定在哪個網路介面進行wireguard通訊,這裡是eth0 PostUp = iptables -I INPUT -i %i -j ACCEPT; iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %ijet -ii; PostDown = iptables -D INPUT -i %i -j ACCEPT;iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTRelING -o %i -j ACCEPT; iptables -t nat -D POSTRJK 當然 -1971BL ACCE] yVco0xaLnYtcR1eMjBfRnZ6mmUvmpOSeasS250nLkE4= #endpoint是服務端外網ip+連接埠Endpoint = xxx.xx.x.xx:50107 #allowip不能寫服務端外網ip段和本機內網ip段,只需要寫本機想透過vpn組網要存取到哪個網段,我這裡只寫了虛擬地址段和服務端的內網ip段,因為我有客戶端訪問服務端內網ip段的需求AllowedIPs = 178.10.10.0/20.20.24. = 10 EOF
 

第一次啟動服務用restart

 systemctl restart wg-quick@wg0.service 

後續更改配置後重啟用reload

 systemctl reload wg-quick@wg0.service 

兩端能正常通訊才設定服務開機自啟動

 systemctl enable wg-quick@wg0.service 

wireguard mac端配置

#安裝brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" #安裝homebrew-bottle來源echo 'export HOMEBREW_BOTTLE_mDOMAINr. ~/.zshrc #安裝wireguard brew install wiregraurd-tools

WireGuard 日常使用

用法:

Usage: wg-quick [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] # 儲存配置,這種指令列方式更可控,最好不要直接編輯/etc/wireguard/wg0.conf中的設定檔touch /etc/wireguard/wk conf wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave wave pave wave wave wave wave wave p-T作為例如> /etc/wireguard/wg0.conf #如果peer在nat後面的可能需要刪除相關Endpoint信息,因為那是不能被主動訪問的# 啟動/停止wg-quick up wg0 #自動選擇配置文件'/etc/wireguard/wg0.conf wg-wg0. down wg0 # 刪除peer wg set wg0 peer $(cat cpublickey1) remove

WireGuard 使用場景

前面只是點到點的基本場景,是最簡單的使用場景,下面我們再探討下其他使用場景

場景1:PC-to-LAN

 
# 允許客戶端存取伺服器端所有區域網路(即PC-to-LAN,一般採用此模式) # 基於基本場景也需執行以下設定:## on server: # 新增vpn網路段路由至伺服器端企業路由器# 172.30.0.0/11454545672.30.0.0/24574572.30.0. # 將server端網段新增至本機路由表ip route add 10.1.0.0/16 via 172.30.0.1 ... # 允許server端網路存取client端(無需ip link down + up;這裡0.0.0.0/0代表所有存取client端(無需ip link down + VM wotg persistent-keepalive 25 allowed-ips 172.30.0.1/32,0.0.0.0/0 endpoint 192.168.11.29:51820

場景2:LAN-to-LAN

# 將兩邊的區域網路連接成一個整體的區域網路(即LAN-to-LAN) # 基於基本場景還需執行以下設定:## on server: # 新增vpn網路段路由到伺服器端企業路由器# 172.30.0.0/1444664 47444 月網路區組新增client端網路段路由至伺服器端企業路由器# 192.168.2.0/24 via [本機的區域網路ip] # ... # 新增client端網路區路由至本機路由表ip route add 192.168.0.0/16 17725.5672. link down + up) wg set wg0 peer VbR3Kxgxxxxxxxxxxxxxxxxxzq3H4ebdgTng= allowed-ips 172.30.0.2/32,192.168.0.0/24## on cliTP 172.30.0.0/24 via [本機的區域網路ip] # 新增server端網路區路由到客戶端企業路由器# 10.1.0.0/16 via [本機的區域網路ip] # ... # 新增server端網路區路由到本機表 105055555555555555595年路由器端。 172.30.0.1 ... # 允許server端存取client端網路(無需ip link down + up;0.0.0.0/0代表所有網路) wg set wg0 peer dLssxxxxxxxxxxxxxxxxx98NQKOivi3MN/VM= persististent-keepa.xxxxxxxxxxxx
 

WireGuard 之所以受歡迎是有充分理由的。諸如 Mullvad VPN 之類的一些流行的關注隱私的VPN 已經在使用WireGuard,並且在不久的將來,採用率可能還會增長。更多相關的介紹、與配置使用、場景應用,有興趣的可以參考官方使用文件。

評分

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *