WireGuard 是如何基於 Linux 的核心來實現?

或許有一天,「零信任」會為我們解決許多網路上的安全性問題,但就目前而言,如果你想要確保你的網域不會有任何監聽者,你就必須要使用 VPN(Virtual Private Network)。而若要在商業環境使用 VPN 的話,可能會有一個小問題那就是,「有許多都是不可信任的」,這樣的話,你可以怎麼做?除了你自己是可以信任的之外,你還有一個選擇是 Linux 內建的 VPN WireGuard

為什麼是 WireGuard 而不是 OpenVPN 或 IKEv2?因為 WireGuard 更容易施行並同時保有安全性,亦可提供更快的速度。

既然 WireGuard 這麼好,為什麼卻花了這麼長的時間才進入 Linux 的核心?首先,WireGuard 的概念,是在 2015 年時才被 Jason Donenfeld 所提出。而在這個圈子裡,即便你有很好的想法,並且也實現了,但這也不代表會被人們所接受,儘管就連最早的 Linux 核心作者 Linus Torvalds 都出來親自讚賞。

Jason Donenfeld 以取代舊的安全隧道協議開發 WireGuard,甚至不諱言的提到舊有的協議成為了在發展新技術上的阻礙,若以程式碼來判斷,OpenVPN 的程式碼有約 70,000 行、OpenSSL 則有 600,000 行,然而 WireGuard 的程式碼只有短短的 4000 行,光是這點,在安全性的維護上就顯得容易許多了。

另外還有一個導致 WireGuard 花這麼久的時間才進入 Linux 的原因是,Jason Donenfeld 不喜歡 Linux 內建的加密子系統,他認為 API 的介面過於複雜且有一定的難度。因此他建議使用全新的加密子系統來補足,也就是他自己的程式庫(Zine Library),但畢竟 Linux 現有的加密系統也是開發人員花了數年的時間而完成的,要在一夕之間使用其他系統,當然會不太順利,此外,許多人都認為 Jason Donenfeld 是在浪費時間重新發明金鑰。

Jason Donenfeld 致力於與社區合作,且願意與人們討論該如何強化系統,雖然這樣的做法並沒有顯著降低人們對他的爭議,但仍然有位自始至終支持 Jason Donenfeld 的著名開發人員 Linus Torvalds,在不斷地調整、修正之後,Zine 程式庫一點一滴地導入至 Linux 5.5 的加密系統之中,也正式為 WireGuard 奠定了在 Linux 中發展的基礎。

WireGuard 於 2020 年三月合併至 Linux 5.6 的內核中,它同時也是 Linux 5.4 的向後移植,也就是說,現在已經可以在現行的 Linux 版本中運行 WireGuard 了。

根據維基百科所述,WireGuard 利用 Curve25519 來進行金鑰的交換,將 ChaCha20 用於加密、Poly1305 用於資料驗證、BLAKE2 則用於雜湊演算法,支援 IPv4 及 IPv6 的第三層,是現今最新、最快的 VPN 隧道協議。

雖然 WireGuard 使用了許多加密工具,但它仍然易於部署和使用,是因為它提供了一個虛擬的介面 wg0,你可以使用標準的 Linux 網路工具程式(像是 firewalld 或 ifconfig(8))來配置設定。

然而,網路安全並不單單只是資料的傳輸,WireGuard 並不會動態分配 IP 位址,所以當你每一次使用它,你都會獲得相同的 IP 位址,雖然這會導致易於被追蹤,但這也是意味著 WireGuard 必須紀錄並儲存你的 IP 位置及時間戳記,OpenVPN 及 IKEv2 都可以透過動態分配 IP 位址來避免這些安全性問題。要解決這個問題,則可以使用 CyberGhost、IVPN 或 Mullvad,他們提供了解決此問題的方法,如果你的 WFH(Working From Home)使用者是在自己的伺服器上執行,並且也是在安全的網路中連線,那麼就不太需要關心這些問題。

原文連結:https://www.theregister.com/2021/12/08/wireguard_linux/