WireGuard

WireGuard是一項加密VPN協議和自由及開源程序。旨在獲得比IPsec和OpenVPN更好的性能，後兩者都是常見的隧道協議。WireGuard協議的流量經由UDP傳輸。

2020年3月，該軟體的Linux版本達到了穩定的生產版本，並被納入Linux 5.6內核，並在一些Linux發行版中向後移植到早期的Linux內核。Linux內核組件在GNU通用公共許可證（GPL）版本2下獲得許可；其他實現則在GPLv2或其他自由/開源許可證下獲得許可。

## 協議

WireGuard使用以下協議：

- Curve25519用於密鑰交換
- ChaCha20用於對稱加密
- Poly1305用於消息認證碼
- SipHash24用於哈希表鍵
- BLAKE2s用於加密哈希函數
- HKDF用於密鑰派生函數
- 僅基於UDP用於傳輸
- Base64編碼的私鑰、公鑰和預共享密鑰

2019年5月，INRIA的研究人員使用CryptoVerif證明輔助工具發布了WireGuard協議的機器驗證證明。

### 可選的預共享對稱密鑰模式

WireGuard支持預共享對稱密鑰（Pre-shared key）模式，該模式提供了一層額外的對稱加密，以減輕未來量子計算的進步帶來的風險。對稱加密的安全性來自於密鑰本身的隨機性和長度，量子威脅僅提供平方根級別的加速，比如經典計算最多需要$O(N)$次計算以觸及目標，使用Grover演算法的量子計算仍需要$O(\sqrt N)$次計算。所以量子計算對「對稱加密」的威脅相對小得多。這消除了流量被存儲後，未來可能被量子計算機解密的風險，因為量子計算機最終可能破解Curve25519（Wireguard中必選的基於非對稱密鑰的密鑰交換方法）。預共享密鑰「從密鑰管理的角度來看通常很麻煩，而且可能更容易被盜」，但在短期內，如果對稱密鑰被洩露，Curve25519密鑰仍能提供足夠的保護。

### 網路

WireGuard僅使用UDP，這是因為TCP-over-TCP存在潛在問題。在基於TCP的連接上隧道化TCP被稱為「TCP-over-TCP」，這樣做會導致傳輸性能急劇下降（該問題被稱為「TCP熔斷」，TCP Meltdown）：基礎層遇到問題的時候會嘗試進行補償，而（被基礎層承載著的）上層TCP報文則會因此過度補償（overcompensates），這種過度補償會導致延遲增加並使傳輸性能下降。

其默認伺服器埠為UDP之51820。

WireGuard完全支持IPv6，無論是在隧道內部還是外部。它僅支持第3層的IPv4和IPv6，並且可以封裝v4-in-v6，反之亦然。

#### MTU開銷

WireGuard的開銷細分如下：

- 20位元組的IPv4報頭或40位元組的IPv6報頭
- 8位元組的UDP報頭
- 4位元組的類型
- 4位元組的密鑰索引
- 8位元組的隨機數
- N字節的加密數據
- 16位元組的身份驗證標籤

#### MTU操作注意事項

假設傳輸WireGuard數據包的底層網路保持1500位元組的MTU，則將所有相關對等方的WireGuard接口配置為1420位元組的MTU是傳輸IPv6+IPv4流量的理想選擇。但是，當僅承載傳統的IPv4流量時，WireGuard接口的MTU可以設置為更高的1440位元組。

從操作角度和網路配置一致性來看，選擇為WireGuard接口配置1420MTU是有利的。這種方法確保了一致性，並促進了將來為WireGuard對等方和接口啟用IPv6的更平穩過渡。

#### 注意事項

在某些情況下，例如，一個對等方位於MTU為1500位元組的網路之後，而另一個對等方位於LTE等無線網絡之後，運營商通常會選擇遠低於1420位元組的MTU。在這種情況下，主機的底層IP網路堆棧將對UDP封裝的數據包進行分片並發送，但隧道內的包將保持一致，並且不需要分片，因為路徑 MTU 發現將檢測對等方之間的MTU（在本例中為1420位元組）並在對等方之間發送固定大小的數據包。

### 可擴展性

WireGuard旨在由第三方程序和腳本進行擴展。這已被用於增強WireGuard的各種功能，包括更友好的管理界面（包括更輕鬆的密鑰設置）、日誌記錄、動態防火牆更新、動態IP分配，以及LDAP集成。

從最小的核心代碼庫中排除此類複雜功能可以提高其穩定性和安全性。為了確保安全性，WireGuard限制了實現加密控制項的選項，限制了密鑰交換過程的選擇，並將演算法 映射到現代密碼基元的一小部分。如果在任何原語中發現缺陷，可以發布解決該問題的新版本。

## 反響

ArsTechnica的一篇評論發現，WireGuard易於設置和使用，使用了強大的加密演算法，並且代碼庫最小，攻擊面小。

WireGuard已獲得開放技術基金會的資助，並接受了Mullvad、Private Internet Access、IVPN、NLnet基金會和OVPN的捐贈。

俄勒岡州參議員Ron Wyden已建議美國國家標準與技術研究院評估WireGuard作為現有技術的替代方案。

## 可用性

### 實現

WireGuard協議的實現包括：

- Donenfeld使用C語言和Go語言編寫的初始實現。
- Cloudflare的BoringTun，一個使用Rust語言編寫的使用者空間實現。
- Matt Dunwoodie為OpenBSD編寫的使用C語言的實現。
- Ryota Ozaki為NetBSD編寫的使用C語言的wg(4)實現。
- FreeBSD的實現是用C語言編寫的，並且與OpenBSD的實現共享大部分數據路徑。
- 自2021年8月起，名為「wireguard-nt」的原生Windows內核實現。
- 支持Fritz!OS 7.39及更高版本的AVMFritz!Box調製解調-路由器。從7.50版本開始允許站點到站點的WireGuard連接。

## 歷史

代碼庫的早期快照存在於2016年6月30日。WireGuard的四個早期採用者是VPN服務提供商Mullvad，AzireVPN，IVPN和cryptostorm。該協議標誌的靈感源於Jason Donenfeld在參觀德爾斐的博物館時見到的一塊希臘神話中的巨蟒石刻。

2019年12月9日，Linux網路堆棧的主要維護者DavidMiller接受了WireGuard補丁到「net-next」維護者樹中，以便包含在即將發布的內核中。

2020年1月28日，Linus Torvalds合併了David Miller的net-next樹，WireGuard進入了mainline Linux內核樹。

2020年3月20日，Debian開發人員在其Debian 11版本（測試版）的內核配置中啟用了WireGuard的模塊構建選項。

2020年3月29日，WireGuard被納入Linux 5.6版本樹。Windows版本的軟體仍處於測試階段。

2020年3月30日，Android開發人員在其通用內核映像中添加了對WireGuard的原生內核支持。

2020年4月22日，NetworkManager開發人員BeniaminoGalvani在GNOME中合併了對WireGuard的GUI支持。

2020年5月12日，Matt Dunwoodie提出了在OpenBSD中對WireGuard的原生內核支持的補丁。

2020年6月22日，在MattDunwoodie和Jason A. Donenfeld的努力下，WireGuard支持被導入OpenBSD。

2020年11月23日，Jason A. Donenfeld發布了Windows軟體包的更新，改進了安裝、穩定性、ARM支持和企業功能。

2020年11月29日，WireGuard支持被導入FreeBSD13內核。

2021年1月19日，在pfSense社區版 (CE)2.5.0開發快照中添加了對WireGuard的預覽支持。

2021年3月，在FreeBSDWireGuard中緊急代碼清理無法快速完成之後，內核模式WireGuard支持從仍在測試中的FreeBSD13.0中刪除。基於FreeBSD的pfSense社區版 (CE)2.5.0和pfSense Plus 21.02也刪除了基於內核的WireGuard。

2021年5月，WireGuard支持作為pfSense社區成員Christian McDonald編寫的實驗包重新引入pfSense CE和pfSense Plus開發快照中。pfSense的WireGuard軟體包包含了最初由Netgate贊助的Jason A. Donenfeld正在進行的內核模式WireGuard開發工作。

2021年6月，pfSense CE 2.5.2和pfSense Plus 21.05的官方軟體包存儲庫都包含了WireGuard軟體包。

2023年，WireGuard從德國的主權科技基金獲得了超過200,000歐元的支持。

## 基本資料

- 作者：Jason A. Donenfeld
- 開發者：Edge Security LLC.
- 程式語言：C語言（Linux、FreeBSD內核模塊、NetBSD、OpenBSD內核模塊、Windows內核驅動）、Go（使用者空間實現）
- 作業系統：Linux、macOS、Android、iOS、Windows、其他
- 類型：虛擬私人網路