WireGuard 真的很香嗎?香個屁!

該文章隨時會有校正更新,公眾號無法更新,歡迎訂閱博客查看最新內(nèi)容:https://fuckcloudnative.io
前言
最近有一款新型 VPN 工具備受矚目,相信很多人已經(jīng)聽說過了,沒錯就是 WireGuard,傳言它有望取代 IPSec 和 OpenVPN。那么 WireGuard 是否真的有傳說中的那么神奇?今天我就來一一解讀。
這是一篇非常長的文章,我建議你先去沖杯咖啡,然后邊喝咖啡邊看。
首先要聲明:我并沒有詆毀 WireGuard 的意思,WireGuard 很棒很優(yōu)秀,但總是有某些無腦媒體天天說 WireGuard 即將取代 IPSec 和 OpenVPN,這我就不能忍了,今天就來和你們好好掰扯掰扯 WireGuard。
WireGuard 白皮書
本文所有的觀點都是針對 Jason Donenfeld 撰寫的 WireGuard 白皮書,其他的博客和文檔不在我的討論范圍之內(nèi)。白皮書的第一句話是這么說的:
WireGuard 的目標(biāo)是在大多數(shù)場景下取代
IPsec和其他基于用戶空間和 TLS 的 VPN(例如OpenVPN),與其他 VPN 相比,它更簡單、更高效、更容易使用。
可以看到,WireGuard 最大的賣點就是簡單,大多數(shù)新技術(shù)也都是這個營銷套路。當(dāng)然,作為一款 VPN 產(chǎn)品,它還有性能和安全這兩個賣點。
有趣的是,作為 VPN,如果你不簡單、不安全、性能不好,那你可能就沒有機會了。這不止是你 WireGuard 的設(shè)計目標(biāo),其他的 VPN 產(chǎn)品也是這么干的好嗎?
最有趣的部分是“在大多數(shù)場景下”這幾個字,媒體報道時直接將其刪除了,混淆大眾的視聽。

WireGuard 能否取代 IPSec?
不!Cisco 和 Juniper 等大廠不可能使用 WireGuard,除非迫不得已,他們是不會上 WireGuard 的車的。后面我會詳細(xì)解釋為什么即使他們想賣 WireGuard 服務(wù)也賣不出去。
WireGuard 實現(xiàn)了 Road Warrior?
當(dāng)然沒有。Road Warrior 是具有動態(tài)分配 IP 地址的移動客戶端,比如筆記本電腦。你可以直接理解為漫游。WireGuard 目前不能使用動態(tài) IP 來建立連接,要想實現(xiàn)漫游功能,還有很長的路要走。
WireGuard 有一個子項目叫 wg-dynamic[1],它增加了一個用戶空間守護程序來使 WireGuard 支持動態(tài) IP。然而這個項目最后一次更新是在 2019 年,不知道還維護不維護了。。。
大家都知道,IPv6 就是動態(tài)尋址的,如果將來全面進入 IPv6 的世界,WireGuard 還怎么用?從商業(yè)角度來看,這是相當(dāng)令人失望的。
WireGuard 的設(shè)計目標(biāo)之一是保持協(xié)議的精簡,現(xiàn)在看來是精簡過頭了,以至于需要更多的輔助軟件才能使它發(fā)揮強大的功效。
WireGuard 真的好用嗎?
并沒有。我并沒有說 WireGuard 最終不能替代其他 VPN 產(chǎn)品,我只是說目前 WireGuard 還不行,如果它的目標(biāo)和我們理解的一樣,目前它還只是處在 Alpha 階段。
WireGuard 到底想解決什么問題?IPsec 真的很難用嗎?
恐怕不是這樣,如果廠商做了正確的功課,并提供了易于使用的界面(比如,IPFire[2]),就不會難用。
要想建立一個 IPSec 隧道,只需要輸入 5 組信息:你的公網(wǎng)地址、peer 的公網(wǎng)地址、子網(wǎng)、你的預(yù)共享秘鑰和 peer 的預(yù)共享秘鑰。這樣看來,幾分鐘就可以建立一個隧道,而且每個廠商之間都是兼容的。
當(dāng)然,也有一些例外,比如與 OpenBSD 系統(tǒng)之間建立隧道,過程可能會比較痛苦。
協(xié)議復(fù)雜度真的很重要嗎?
作為終端用戶,其實無需考慮協(xié)議的復(fù)雜度。
如果復(fù)雜度真的影響很大,我們肯定早就擺脫 SIP、 H.323 和 FTP 等不能很好地應(yīng)對 NAT 的協(xié)議了,然而并沒有。講道理,IPsec 比 WireGuard 更復(fù)雜是有原因的:**它能做的事情太多了。**比如,使用用戶名/密碼或帶有 EAP 的 SIM 卡進行用戶認(rèn)證;也可以擴展新的加密方式。
而 WireGuard 呢?這些功能都沒有。這就意味著當(dāng)某一天它的固定的那些加密方式被破解或削弱了之后,就徹底崩盤了。
WireGuard 作者說過:
WireGuard 在加密方式上比較偏執(zhí),故意砍掉了加密協(xié)議的敏捷性,不支持?jǐn)U展加密協(xié)議,因為這么做會大大降低軟件的復(fù)雜度。如果底層的加密協(xié)議出現(xiàn)了漏洞,只能更新所有端點來修復(fù)漏洞。
我非常同意他這句話里闡述的觀點,因為協(xié)商使用何種方式來加密會使 IKE 和 TLS 等協(xié)議變得更復(fù)雜。那么,是我們想不開刻意要搞這么復(fù)雜嗎?當(dāng)然不是啊,即使這樣,在握手過程中也會經(jīng)常發(fā)現(xiàn)各種漏洞,不復(fù)雜能行嗎?除此以外,別無他法。
如何更新密碼?
想象一下,你有一個 VPN 服務(wù)器,為 200 多個 Road Warrior 客戶端提供服務(wù),而且這些客戶端分布在世界各地。假設(shè)現(xiàn)在你改了密碼,那么就需要同時更新所有客戶端的密碼才能正常工作,這簡直就是不可能的事情,作為管理員,你可能會需要幾個月的時間來下方更改后的配置。
IPsec 和 OpenVPN 就沒有這些煩惱,它們都有秘鑰協(xié)商功能,可以將新秘鑰逐步更新到所有客戶端,在漫長的更新過程中,仍在使用舊秘鑰的客戶端仍然有效,直到所有客戶端更新完畢后,才會棄用舊秘鑰。整個過程中客戶端不會有任何察覺,也不需要重啟。
加密方式
WireGuard 使用以下加密技術(shù)來保障數(shù)據(jù)的安全:
使用 ChaCha20進行對稱加密,使用Poly1305進行數(shù)據(jù)驗證。利用 Curve25519進行密鑰交換。使用 BLAKE2作為哈希函數(shù)。使用 HKDF進行解密。
而 IPSec 和 OpenVPN 使用的都是標(biāo)準(zhǔn)的 ChaCha20-Poly1305 加密算法。
BLAKE2算法是 BLAKE 算法的升級版,而 BLAKE 是 SHA-3 的入圍者,與 SHA-2 非常相似,所以沒有獲獎。如果哪天 SHA-2 被破解了,BLAKE 也很有可能被破解。
IPSec 和 OpenVPN 使用的加密方式和 WireGuard 是類似的,比如對稱加密使用的是標(biāo)準(zhǔn)的 ChaCha20-Poly1305 算法。唯一沒有用到的就是 BLAKE2,因為它目前沒有列入標(biāo)準(zhǔn)。即使不用 BLAKE2,也沒什么大不了的,因為 VPN 是使用 HMACs 來保障數(shù)據(jù)的完整性,即使使用 MD5 也仍然沒問題。
我的結(jié)論是:實際上所有的 VPN 都可以使用相同的加密技術(shù),WireGuard 在加密或數(shù)據(jù)完整性方面并沒有比其他的 VPN 更安全或更不安全。
然而白皮書上說了,加密不是重點,速度才是。
好吧,那我們就來看看速度是不是真的有那么快。
WireGuard 真的很快嗎?
答案是否定的。
ChaCha20 是一種流加密算法,一次只加密一個比特,使用軟件更容易實現(xiàn)。而像 AES 這樣的分塊加密方式,會將明文分成多個等長的模塊,每次加密 128 位的模塊。這種加密方式在硬件中實現(xiàn)時需要更多的晶體管,所以大型處理器都帶有一個指令集擴展 -- AES-NI[3],它可以提高加密和解密的速度。
今天你能買到的任何一款智能手機都帶有 AES 的硬件加速功能,在這些硬件中使用 AES 會比 ChaCha20 加密解密更快、更節(jié)能。幾乎所有的個人 PC 和服務(wù)器的 CPU 都帶有 AES-NI,加密解密速度就更不用說了。因此,我預(yù)計 AES 在幾乎所有場景下表現(xiàn)都會優(yōu)于 ChaCha20。
然而,WireGuard 的白皮書又說了,ChaCha20-Poly1305 的性能優(yōu)于 AES-NI,但該指令集只適用于大型處理器,對普通 PC 和移動硬件沒有任何幫助,所以并沒有什么卵用。
WireGuard 執(zhí)著于一種加密算法,我覺得不好。而 IPSec 允許你選擇不同的加密算法,這樣就可以根據(jù)不同的使用場景選擇最合適的加密算法,例如,傳輸 10G 或更多的數(shù)據(jù)[4]。
既然 WireGuard 選擇了更現(xiàn)代的加密方式,就會帶來很多問題。比如,由于 Linux 內(nèi)核中缺乏支持這些加密方式的模塊,導(dǎo)致 WireGuard 并沒有使用 Linux 內(nèi)核提供的模塊,要推遲好幾年才能用上 Linux 內(nèi)核提供的模塊。我不知道其他操作系統(tǒng)是什么情況,但可能也沒有什么不同。
理想與現(xiàn)實
假設(shè) WireGuard 真的很完美,大廠就一定會用嗎?
現(xiàn)實情況是,每次當(dāng)客戶要求我?guī)退麄兇罱?VPN 時,給到他們手里的證書都是使用舊的加密方式,通常是 3DES 和 MD5 結(jié)合,或者 AES-256 和 SHA1 結(jié)合。至于秘鑰交換,我們一直在使用 RSA,雖然速度很慢,但足夠安全。
大部分客戶都和政府機構(gòu)或巨頭公司有關(guān),他們在我們這里的訂單表還是幾十年前的,根本就沒有添加過 SHA-512 的選項。所以阻止創(chuàng)新的不一定是技術(shù),而是緩慢的企業(yè)流程。
看到這種情況,我也很痛心?我就不想使用新技術(shù)嗎?當(dāng)然想啊。IPsec 從 2005 年左右就開始支持橢圓曲線加密算法了,Curve25519 算法現(xiàn)在也支持了,也有了 AES 的替代方案(比如 Camellia 和 ChaCha20),但很顯然并不是所有的大廠都愿意去適配,比如思科等。思科是這個領(lǐng)域的市場領(lǐng)導(dǎo)者,他們對推動創(chuàng)新其實并不感興趣。
基準(zhǔn)測試
白皮書中還提到了 WIreGuard 的基準(zhǔn)測試,雖然這不是一篇科學(xué)論文,但我仍然希望以科學(xué)的方法來進行基準(zhǔn)測試。如果測試不能重復(fù),那么它就毫無價值;如果測試沒有考慮實際場景,也毫無價值。
WireGuard 的 Linux 版本使用 GSO(Generic Segmentation Offloading,通用分段卸載)來創(chuàng)建一個 64k 字節(jié)的巨大數(shù)據(jù)包,并一次性對其進行加密或解密,以此來獲得速度優(yōu)勢。這樣一來,初始化和調(diào)用加密操作的開銷就被節(jié)省了。如果你想最大限度地提高吞吐量,這倒是一個好主意。
然而現(xiàn)實不是這樣的,你想向網(wǎng)絡(luò)適配器發(fā)送如此大的數(shù)據(jù)包,就需要將其切割成許多小數(shù)據(jù)包,通常為 1500 字節(jié)。對于 64k 字節(jié)的超大數(shù)據(jù)包來說,會被切割成 45 個數(shù)據(jù)包(每個數(shù)據(jù)包有 1480 字節(jié)的有效載荷和 20 字節(jié)的 IP 頭),這些數(shù)據(jù)包將會阻塞網(wǎng)絡(luò)適配器相當(dāng)長的時間,因為它們想要被一次性發(fā)送出去。像 VoIP 呼叫這樣應(yīng)該優(yōu)先處理的數(shù)據(jù)包也不得不慢慢等著。
因此,WireGuard 宣稱的高吞吐量是通過讓其他應(yīng)用變慢來獲得的,官方團隊已經(jīng)承認(rèn)了這一點。
我們再來看看基準(zhǔn)測試的最終數(shù)據(jù),吞吐量為 1011 MBit/s!
這個數(shù)據(jù)令人印象深刻,我至今仍感到疑惑,在數(shù)據(jù)包大小為 1500 字節(jié)的情況下,一個千兆以太網(wǎng)鏈路的最大理論吞吐量為 966 MBit/s,減去 20 個字節(jié)的 IP 頭、8 個字節(jié)的 UDP 頭和 16 個字節(jié)的 WireGuard 頭,再減去封裝數(shù)據(jù)包中的另一個 IP 頭和另一個 20 個字節(jié)的 TCP 頭,額外的帶寬到底從哪來的?
OK,假設(shè)啟用了巨型幀和 GSO,9000 字節(jié)幀大小時的理論最大值將是 1014 MBit/s。如果使用更大的巨型幀,理論最大值為 1023 MBit/s。然而這在現(xiàn)實中是絕對不實用的,因為開銷太大了,而且只能在服務(wù)器直連的情況下使用。通常 VPN 都是通過互聯(lián)網(wǎng)連接的,完全不支持巨型幀,所以這樣的基準(zhǔn)測試根本不切實際,永遠(yuǎn)不可能在現(xiàn)實世界中使用。
最終幻想
WireGuard 的官方網(wǎng)站寫了很多關(guān)于容器的內(nèi)容,很明顯這應(yīng)該就是 WireGuard 的真實目的。
通過一個簡單迅速的 VPN 來實現(xiàn)容器通信的 CNI,可以通過 Kubernetes 等大型容器編排工具來快速部署,針對吞吐量和大于 9000 字節(jié)的數(shù)據(jù)包進行了優(yōu)化,可以快速分發(fā)容器鏡像,等等。
這一切的種種都好像是為容器而設(shè)計的,不得不承認(rèn),超精簡、超優(yōu)雅、超快速。
但是,它根本不是為數(shù)據(jù)中心以外的世界而設(shè)計的,在外面的世界,你必須要在協(xié)議的設(shè)計和實現(xiàn)上做出妥協(xié)。
總結(jié)
我最終的結(jié)論是:WireGuard 還沒有準(zhǔn)備好。
它是作為一個輕量級和快速的解決方案來起草的,以解決現(xiàn)有解決方案中的一些問題,但不幸的是,它犧牲了許多與用戶相關(guān)的功能,因此無法取代 IPsec 和 OpenVPN。
你至少得有動態(tài)地址分配和推送路由等配置的功能吧?這些功能都是需要進行秘鑰協(xié)商的。
此外,安全性是重中之重,目前我還沒發(fā)現(xiàn) IKE 或者 TLS 有啥明顯的缺陷,它們都支持現(xiàn)代加密方式,而且都經(jīng)過了幾十年的審計。不能僅僅因為某些東西是新的,就覺得它是好的。
加密方式總會過時,押注在一種加密方式身上,當(dāng)這種加密方式不再安全時,你該何去何從?
參考資料
wg-dynamic: https://git.zx2c4.com/wg-dynamic/about/docs/idea.md
[2]IPFire: https://www.ipfire.org
[3]AES-NI: https://zh.wikipedia.org/wiki/AES%E6%8C%87%E4%BB%A4%E9%9B%86
[4]傳輸 10G 或更多的數(shù)據(jù): https://blog.ipfire.org/post/feature-spotlight-galois-counter-mode-ipsec-with-10g
原文鏈接:https://blog.ipfire.org/post/why-not-wireguard


你可能還喜歡
點擊下方圖片即可閱讀

云原生是一種信仰??
掃碼關(guān)注公眾號
后臺回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點擊?"閱讀原文"?獲取更好的閱讀體驗!
??給個「在看」,是對我最大的支持??

