WireGuard 與 OpenVPN 自架 VPN 怎麼選?
自架 VPN 多數情況應選 WireGuard:速度快、設定檔約 10 行、程式碼約 4,000 行。本文整理 4 種 OpenVPN 仍較適合的情境。
簡短答案
對於自行在 VPS 上執行 VPN 伺服器的個人而言,WireGuard 與 OpenVPN 並不是勢均力敵的比較:請選擇 WireGuard。它的程式碼規模較小、在 Linux kernel 內執行、可在不到 1 秒內建立連線,而且可運作的用戶端設定檔約 10 行。OpenVPN 保留 4 項實際用途;如果這些用途都不適用於你,就不需要使用它。
這 4 項用途包括:離開只允許 TCP port 443 的網路、接入現有的憑證授權中心、使用密碼或第二因素驗證具名使用者,以及在 Layer 2 建立橋接。以下內容將提供支持此建議的證據,並明確說明每項例外從何時開始適用於你。
WireGuard 為何受到自架服務使用者青睞
程式碼基礎足夠精簡,便於閱讀。 WireGuard 專案的通訊協定實作約為 4,000 行程式碼。若計入 OpenVPN 針對所有加密作業所依賴的 OpenSSL 函式庫,程式碼量會達到六位數。程式碼規模很重要,因為每一行都是攻擊面,而您和審查者都不會閱讀 100,000 行程式碼。4,000 行則可以閱讀。
它在核心中執行。 WireGuard 自 5.6 起已納入 Linux 主線,因此 Ubuntu 24.04 和 Debian 13 隨附 WireGuard,無須編譯。封包會在原本所在的位置,也就是核心空間中加密,不必複製到使用者空間程序,再複製回來。請先確認:
sudo modprobe wireguard && echo ok在 KVM VPS 上,該命令會輸出 ok。在與主機共用核心的容器虛擬化環境中,例如 OpenVZ 或 LXC,則會以 Operation not supported 失敗,因為您無法將模組載入不屬於您的核心。
不需要進行協商。 WireGuard 只有一組固定的密碼套件:資料使用 ChaCha20-Poly1305,金鑰使用 Curve25519。不會有可降級的版本,也沒有可能設定錯誤的選項。OpenVPN 會與每個用戶端協商密碼和 TLS(傳輸層安全性)版本。這提供了彈性,但也是設定錯誤的來源。若伺服器保留 data-ciphers AES-256-GCM:AES-128-CBC,用戶端未提供更佳選項時,伺服器會直接退回使用 CBC 密碼套件,而日誌不會將此情況標示為問題。
該連接埠不會回應。 WireGuard 封包若未通過訊息驗證檢查,會直接丟棄且完全不回覆。因此無論是否有程序監聽,nmap -sU -p 51820 都會傳回 open|filtered。TCP 模式的 OpenVPN 伺服器會先完成 TCP 交握,才判定不接受該連線。這足以向掃描器證明該處存在服務。搭配 tls-crypt 的 UDP OpenVPN 幾乎同樣安靜,因此這項理由是反對在 TCP 上執行 OpenVPN,而不是反對 OpenVPN 本身。
漫遊不需額外處理。 WireGuard 對等端是以公開金鑰識別,而不是以位址識別。您的筆記型電腦從家用網路移至行動熱點後,會從新位址傳送一次交握,伺服器便會更新回覆所使用的端點。這不是重新連線,因為原本就沒有持續建立的連線。OpenVPN 也能透過 float 執行類似功能,但用戶端通常會拆除並重新建立完整的 TLS 工作階段。因此,打開上蓋時,OpenVPN 會出現可察覺的暫停,而 WireGuard 不會。
2026 年的速度:差距已縮小
多年來,速度方面的客觀說法是:OpenVPN 會將每個封包複製到 userspace,在 userspace 中加密,再複製回去;WireGuard 則始終未離開 kernel。現在情況已不完全如此,忽略這點的比較已經過時。
OpenVPN 2.7 於 2026 年 2 月發布,支援上游的 ovpn kernel module;該模組已合併至 Linux 6.16。這就是 DCO(data channel offload):control channel 保留在 userspace,而大量資料路徑移至 kernel,這大致上就是 WireGuard 一直採用的方式。在支援 DCO 的新版 kernel 和 OpenVPN 上,兩者的 throughput 屬於相同等級,而非截然不同。請檢查實際環境:
uname -r
openvpn --version | head -n 1
modinfo ovpn 2>/dev/null | head -n 3截至 2026 年 7 月,標準 Ubuntu 24.04 LTS 隨附的是 OpenVPN 2.6,而非 2.7,且 ovpn module 需要 2.7。在此版本中,只有透過較舊的 openvpn-dco-dkms package 才能使用 offload;該 package 會針對目前執行中的 kernel 建置 out-of-tree module,因此每次 kernel upgrade 都必須重新建置。這是 WireGuard 沒有的額外變動因素。
在將 DCO 視為繼續使用 OpenVPN 的理由前,請先閱讀其限制。DCO 僅支援 Layer 3 tunnel,只接受 AEAD cipher(authenticated encryption with associated data:AES-GCM 或 ChaCha20-Poly1305),不支援 compression;在 server 上則只能搭配 topology subnet 使用。這些限制每一項都削弱了 OpenVPN 原本主打的彈性。高速 OpenVPN,是設定成看起來像 WireGuard 的 OpenVPN。
不要相信任何人公布的 throughput 數字,包括本頁內容。VPS 的上限通常取決於 CPU 額度或 network 額度,而不是 protocol。請使用在 tunnel 上執行的 iperf3 測量自己的數據,接著在 tunnel 外再次測量,並比較兩者。
OpenVPN 仍然適用的情境
您需要透過 TCP port 443 對外連線。 WireGuard 僅支援 UDP,這是刻意的設計,也不會推出 TCP 模式。只允許 TCP 443 的飯店網路或企業 Proxy,會放行使用 proto tcp-server 和 port 443 設定的 OpenVPN,因為這類流量看起來像一般的 TLS 工作階段。WireGuard 需要使用 wstunnel 或 udp2raw 等包裝工具才能穿過相同的網路,這會增加一個需要執行及持續修補的程序。請注意衝突:如果該 IP 位址上的 TCP 443 已由 Web 伺服器使用,其中一方就必須更換連接埠。
您已經在執行憑證授權單位。 OpenVPN 使用 X.509 憑證進行驗證,因此可以直接整合到您已經維運的 PKI(公開金鑰基礎架構)中。憑證會自行到期。您只要將憑證加入憑證撤銷清單,伺服器便可透過 crl-verify 讀取該清單。WireGuard 沒有憑證、到期機制或撤銷清單。移除對等端表示編輯伺服器設定並重新載入。只有 10 個對等端時,這樣做沒有問題。但在 400 個對等端且有稽核要求的情況下,憑證模型能實際減輕您的管理負擔。
您需要具名使用者,而不只是金鑰。 OpenVPN 可以透過 auth-user-pass-verify 或 openvpn-plugin-auth-pam.so 等外掛程式,將驗證交給外部系統。這也是整合 LDAP 或一次性密碼第二因素的方式。WireGuard 完全沒有使用者的概念。金鑰不是存在於設定中,就是不存在。如果您的要求是「Sara 必須輸入手機收到的代碼」,WireGuard 本身無法表達這項需求。
您需要 Layer 2,或需要支援古老系統的用戶端。 使用 dev tap 的 OpenVPN 可以橋接乙太網路框架,這對廣播協定及舊式區域網路遊戲很重要。WireGuard 僅支援 Layer 3,未來也不會改變。OpenVPN 也能在永遠不會提供 WireGuard 應用程式的硬體與作業系統上執行。這兩項理由的重要性都在降低,而且 dev tap 與 DCO 不相容,因此使用橋接時必須採用較慢的路徑。
兩種設定實際上會耗費哪些成本
WireGuard 身分只需執行一個命令。括號很重要,因為它會在金鑰建立前設定檔案模式:
(umask 077; wg genkey > private.key)
wg pubkey < private.key > public.keyOpenVPN 的等效設定是由您負責管理的憑證授權單位,且只要 VPN 存在就必須持續管理:
sudo apt install -y easy-rsa
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-req server nopass
./easyrsa sign-req server server這兩份清單都沒有偏頗。CA 可提供到期與撤銷功能,但您必須保護私密金鑰多年、記得續期,遺失金鑰時還必須重新建立環境。如果您沒有使用這些功能,就等於白白承擔成本。完整的 WireGuard 程序,包括轉送、NAT(網路位址轉換),以及會浪費一下午時間的交握失敗,請參閱在 VPS 上自行託管 WireGuard VPN 的指南。
每一項對防火牆的要求
WireGuard 只需要 1 條輸入規則,針對 ListenPort 中的 UDP 連接埠:
sudo ufw allow 51820/udp
sudo ufw status verboseOpenVPN 預設需要 UDP 1194;如果選擇該路徑,也可以使用 TCP 443。接著,兩者都需要啟用 IP forwarding,並設定 source NAT 規則,因為 Linux 會丟棄目的地不是本機的封包。這部分對兩種通訊協定完全相同,也是大多數「通道已連線,但沒有網際網路」問題的來源。如果不熟悉 ufw,請先閱讀 VPS 上 ufw 防火牆的基本概念,並注意大多數供應商會在控制面板中另外提供網路防火牆:如果封包根本沒有抵達伺服器,您在伺服器上新增的規則就不會生效。了解 連接埠的定義,以及 Linux 如何監聽連接埠,可以更快完成這兩項檢查。
如何選擇,單段說明
除非你能明確指出 WireGuard 無法滿足的特定需求,否則請使用 WireGuard。如果你需要透過 TCP 443 繞過受限網路,請在該連接埠上使用 OpenVPN,也可以考慮同時執行兩者:它們使用不同連接埠,可在同一部伺服器上共存而不會衝突。如果你需要每位使用者的帳戶或第二因素驗證,請不要強行讓 WireGuard 處理這些需求。改在 WireGuard 之上加入身分識別層。自行託管的 Headscale 控制伺服器底層使用 WireGuard,並加入帳戶模型、金鑰分發和裝置核准功能;這些功能在單純的 WireGuard 中都必須由你自行處理。
在不中斷服務的情況下從 OpenVPN 遷移
這不是轉換作業。OpenVPN 的 PKI 不會轉換成 WireGuard 金鑰,因為 WireGuard 沒有可供轉換的憑證。每個用戶端都必須產生新的金鑰組,產生方式與伺服器相同。
請並行遷移,不要直接切換。WireGuard 使用 UDP 51820,而 OpenVPN 使用 1194,兩者可以同時在同一台主機上執行。因此,先啟動 wg0,再使用 sudo wg show 列出最新的 latest handshake 進行確認,然後逐一移轉用戶端。當 OpenVPN 對等端清單不再變動時,使用 sudo systemctl disable --now openvpn-server@server 停止服務。在確認無誤前,請保留 CA 檔案,因為刪除 CA 後,無法在該 CA 上重新建立已撤銷的用戶端。
有一項內容確實無法沿用:使用者名稱與密碼帳戶,以及與其相關的撤銷紀錄。在關閉舊伺服器前,先決定這些資料的存放位置,不要等到關閉後才處理。
FAQ
WireGuard 比 OpenVPN 快嗎?
在標準的 Ubuntu 24.04 伺服器上,是的,而且差距很大,因為 WireGuard 在核心中執行加密,而 OpenVPN 2.6 會將每個封包交由使用者空間程序處理。使用 OpenVPN 2.7 搭配 Linux 6.16 的 ovpn 核心模組後,資料路徑也位於核心中,兩者便屬於同一等級。請使用 iperf3 透過通道測量您自己的效能,不要直接採信部落格上的數字,因為在 VPS 上,限制通常來自 CPU 或頻寬配額。
WireGuard 可以使用 TCP port 443 嗎?
不能單獨使用。WireGuard 依設計僅支援 UDP,也沒有規劃 TCP 模式。若要通過只允許 TCP 443 的網路,您必須使用 wstunnel 或 udp2raw 等方式將其包裝在通道中;這會要求在兩端各執行並維護一個程序。如果這是您平時的工作環境限制,搭配 proto tcp-server 和 port 443 的 OpenVPN 是較簡單的選擇。
OpenVPN 現在不安全嗎?
不會。啟用 AEAD 密碼套件(例如 AES-256-GCM)及 tls-crypt 的新版 OpenVPN,是可靠的 VPN。選擇 WireGuard 的理由在於其他方面:OpenVPN 包含更多程式碼和更多選項,因此管理員較容易以錯誤方式進行設定。選項越少,設定錯誤也越少。
在 VPS 上架設個人 VPN,應該選哪一個?
WireGuard。每台裝置使用一組金鑰組、一個約 10 行的設定檔、開放一個 UDP port,而且交握會在您察覺之前完成。只有在您經常從封鎖 UDP 的網路連線,或必須使用現有的憑證授權單位或使用者目錄時,才選擇 OpenVPN。