VPN 不再是大鬍子系統管理員的奇特工具的時代已經到來。 用戶有不同的任務,但事實是VPN已經成為每個人的必需品。
當前 VPN 解決方案的問題在於,它們難以正確配置、維護成本高昂,並且充滿了質量可疑的遺留代碼。
幾年前,加拿大信息安全專家 Jason A. Donenfeld 認為受夠了,並開始研究
WireGuard 聲稱相對於其他 VPN 解決方案的優勢:
- Простой в использовании。
- 採用現代密碼學:Noise協議框架、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF等。
- 緊湊可讀的代碼,更容易調查漏洞。
- 高性能。
- 清晰且精心製作
規格 .
銀彈找到了嗎? 是時候埋葬 OpenVPN 和 IPSec 了嗎? 我決定解決這個問題,但同時我也這麼做了
工作原理
其工作原理可描述如下:
- 創建 WireGuard 接口,並為其分配私鑰和 IP 地址。 加載其他對等點的設置:它們的公鑰、IP 地址等。
- 所有到達 WireGuard 接口的 IP 數據包都封裝在 UDP 中
安全交付 其他海盜。 - 客戶端在設置中設置服務器的公共IP地址。 當來自客戶端的經過正確驗證的數據時,服務器會自動了解客戶端的外部地址。
- 服務器可以在不中斷工作的情況下更改公共IP地址。 同時,它會向連接的客戶端發送通知,他們將動態更新其配置。
- 使用了路由的概念
加密密鑰路由 。 WireGuard 根據對等方的公鑰接收和發送數據包。 當服務器解密經過正確驗證的數據包時,會檢查其 src 字段。 如果與配置相符allowed-ips
經過身份驗證的對等方,然後 WireGuard 接口接收數據包。 當發送一個傳出數據包時,會發生相應的過程:獲取數據包的 dst 字段,並根據它選擇相應的對等點,使用自己的密鑰對數據包進行簽名,使用對等點的密鑰進行加密並發送到遠程端點。
WireGuard的整個核心邏輯不到4千行代碼,而OpenVPN和IPSec則有數十萬行代碼。 為了支持現代加密算法,建議在 Linux 內核中包含一個新的加密 API。
Производительность
最大的性能優勢(與 OpenVPN 和 IPSec 相比)在 Linux 系統上將非常明顯,因為 WireGuard 是作為內核模塊實現的。 此外,還支持 macOS、Android、iOS、FreeBSD 和 OpenBSD,但它們在用戶空間中運行 WireGuard,從而產生所有隨之而來的性能影響。 預計在不久的將來會添加 Windows 支持。
基準測試結果
我的使用體驗
我不是 VPN 設置專家。 有一次我用手柄設置了 OpenVPN,非常沉悶,IPSec 甚至沒有嘗試。 要做的決定太多,很容易搬起石頭砸自己的腳。 因此,我一直使用現成的腳本來配置服務器。
因此,從我的角度來看,WireGuard 通常是用戶的理想選擇。 所有低級決策均在規範中做出,因此準備典型 VPN 基礎設施的過程只需幾分鐘。 Nafakapit在配置上幾乎是不可能的。
安裝過程
加密密鑰由實用程序生成 wg
:
SERVER_PRIVKEY=$( wg genkey )
SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey )
CLIENT_PRIVKEY=$( wg genkey )
CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )
接下來,您需要創建服務器配置 /etc/wireguard/wg0.conf
包含以下內容:
[Interface]
Address = 10.9.0.1/24
PrivateKey = $SERVER_PRIVKEY
[Peer]
PublicKey = $CLIENT_PUBKEY
AllowedIPs = 10.9.0.2/32
並用腳本建立隧道 wg-quick
:
sudo wg-quick up /etc/wireguard/wg0.conf
在帶有 systemd 的系統上,您可以使用它 sudo systemctl start [email protected]
.
在客戶端機器上,創建一個配置 /etc/wireguard/wg0.conf
:
[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 10.9.0.2/24
[Peer]
PublicKey = $SERVER_PUBKEY
AllowedIPs = 0.0.0.0/0
Endpoint = 1.2.3.4:51820 # Внешний IP сервера
PersistentKeepalive = 25
以同樣的方式升高隧道:
sudo wg-quick up /etc/wireguard/wg0.conf
剩下的就是在服務器上配置 NAT,以便客戶端可以訪問 Internet,就完成了!
代碼庫的這種易用性和緊湊性是通過消除密鑰分發功能來實現的。 沒有復雜的證書系統和所有這些企業恐怖,短加密密鑰的分發方式大致類似於 SSH 密鑰。 但這帶來了一個問題:WireGuard 在某些現有網絡中實施起來並不容易。
在缺點中,值得注意的是 WireGuard 無法通過 HTTP 代理工作,因為只有 UDP 協議作為傳輸。 問題來了,是否有可能混淆協議? 當然,這不是VPN的直接任務,但是對於OpenVPN來說,例如有辦法將自己偽裝成HTTPS,這有助於極權國家的居民充分使用互聯網。
發現
總而言之,這是一個非常有趣且有前途的項目,您已經可以在個人服務器上使用它。 利潤是多少? Linux 系統上的高性能、易於設置和維護、緊湊且可讀的代碼庫。 不過,現在急於將復雜的基礎設施轉移到 WireGuard 還為時過早,值得等待納入 Linux 內核。
為了節省我(和你)的時間,我開發了
來源: www.habr.com