1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        WireGuard 真的很香嗎?香個屁!

        共 5840字,需瀏覽 12分鐘

         ·

        2020-12-27 21:08


        該文章隨時會有校正更新,公眾號無法更新,歡迎訂閱博客查看最新內(nèi)容:https://fuckcloudnative.io

        前言

        最近有一款新型 VPN 工具備受矚目,相信很多人已經(jīng)聽說過了,沒錯就是 WireGuard,傳言它有望取代 IPSecOpenVPN。那么 WireGuard 是否真的有傳說中的那么神奇?今天我就來一一解讀。

        這是一篇非常長的文章,我建議你先去沖杯咖啡,然后邊喝咖啡邊看。

        首先要聲明:我并沒有詆毀 WireGuard 的意思,WireGuard 很棒很優(yōu)秀,但總是有某些無腦媒體天天說 WireGuard 即將取代 IPSecOpenVPN,這我就不能忍了,今天就來和你們好好掰扯掰扯 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?

        不!CiscoJuniper 等大廠不可能使用 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.323FTP 等不能很好地應(yīng)對 NAT 的協(xié)議了,然而并沒有。講道理,IPsec 比 WireGuard 更復(fù)雜是有原因的:**它能做的事情太多了。**比如,使用用戶名/密碼或帶有 EAPSIM 卡進行用戶認(rèn)證;也可以擴展新的加密方式。

        而 WireGuard 呢?這些功能都沒有。這就意味著當(dāng)某一天它的固定的那些加密方式被破解或削弱了之后,就徹底崩盤了。

        WireGuard 作者說過:

        WireGuard 在加密方式上比較偏執(zhí),故意砍掉了加密協(xié)議的敏捷性,不支持?jǐn)U展加密協(xié)議,因為這么做會大大降低軟件的復(fù)雜度。如果底層的加密協(xié)議出現(xiàn)了漏洞,只能更新所有端點來修復(fù)漏洞。

        我非常同意他這句話里闡述的觀點,因為協(xié)商使用何種方式來加密會使 IKETLS 等協(xié)議變得更復(fù)雜。那么,是我們想不開刻意要搞這么復(fù)雜嗎?當(dāng)然不是啊,即使這樣,在握手過程中也會經(jīng)常發(fā)現(xiàn)各種漏洞,不復(fù)雜能行嗎?除此以外,別無他法。

        如何更新密碼?

        想象一下,你有一個 VPN 服務(wù)器,為 200 多個 Road Warrior 客戶端提供服務(wù),而且這些客戶端分布在世界各地。假設(shè)現(xiàn)在你改了密碼,那么就需要同時更新所有客戶端的密碼才能正常工作,這簡直就是不可能的事情,作為管理員,你可能會需要幾個月的時間來下方更改后的配置。

        IPsecOpenVPN 就沒有這些煩惱,它們都有秘鑰協(xié)商功能,可以將新秘鑰逐步更新到所有客戶端,在漫長的更新過程中,仍在使用舊秘鑰的客戶端仍然有效,直到所有客戶端更新完畢后,才會棄用舊秘鑰。整個過程中客戶端不會有任何察覺,也不需要重啟。

        加密方式

        WireGuard 使用以下加密技術(shù)來保障數(shù)據(jù)的安全:

        • 使用 ChaCha20 進行對稱加密,使用 Poly1305 進行數(shù)據(jù)驗證。
        • 利用 Curve25519 進行密鑰交換。
        • 使用 BLAKE2 作為哈希函數(shù)。
        • 使用 HKDF 進行解密。

        而 IPSec 和 OpenVPN 使用的都是標(biāo)準(zhǔn)的 ChaCha20-Poly1305 加密算法。

        BLAKE2算法是 BLAKE 算法的升級版,而 BLAKESHA-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 時,給到他們手里的證書都是使用舊的加密方式,通常是 3DESMD5 結(jié)合,或者 AES-256SHA1 結(jié)合。至于秘鑰交換,我們一直在使用 RSA,雖然速度很慢,但足夠安全。

        大部分客戶都和政府機構(gòu)或巨頭公司有關(guān),他們在我們這里的訂單表還是幾十年前的,根本就沒有添加過 SHA-512 的選項。所以阻止創(chuàng)新的不一定是技術(shù),而是緩慢的企業(yè)流程。

        看到這種情況,我也很痛心?我就不想使用新技術(shù)嗎?當(dāng)然想啊。IPsec 從 2005 年左右就開始支持橢圓曲線加密算法了,Curve25519 算法現(xiàn)在也支持了,也有了 AES 的替代方案(比如 CamelliaChaCha20),但很顯然并不是所有的大廠都愿意去適配,比如思科等。思科是這個領(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)這種加密方式不再安全時,你該何去何從?

        參考資料

        [1]

        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



        你可能還喜歡

        點擊下方圖片即可閱讀

        別看 DNS 污染鬧得歡,現(xiàn)在我用 CoreDNS 將它拉清單

        云原生是一種信仰??



        碼關(guān)注公眾號

        后臺回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!



        點擊?"閱讀原文"?獲取更好的閱讀體驗!

        ??給個「在看」,是對我最大的支持??
        瀏覽 5422
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            狍与女人做爰太舒服 | 裸体芭蕾大尺度xxxx | 日韩精品一区二区三区免费 | 中国黄视频 | 欧美性猛交XXXXXX乱大交交 | 国产精品久久久免费视频 | 涩涩av | 领导解开我的乳罩亲我 | 美女被操91 | 雷电将军与丘丘人繁衍后代动画 |