WireGuard 還是 OpenVPN?自架 VPN 怎麼選
WireGuard 以速度、約 10 行的設定檔與較小的 4,000 行程式碼勝出;但遇到 TCP 443、憑證授權、帳密驗證或 Layer 2 橋接時,OpenVPN 仍較適合。
簡短結論
對於單人自行在 VPS 上執行 VPN 伺服器的情境,WireGuard 與 OpenVPN 並不是勢均力敵的選擇:請選擇 WireGuard。WireGuard 的程式碼規模較小、在 Linux kernel 內執行,建立連線只需不到一秒,而且可運作的用戶端設定檔大約只有 10 行。OpenVPN 仍有 4 項實際用途;如果你不需要其中任何一項,就不需要使用 OpenVPN。
這 4 項用途包括:離開只允許 TCP port 443 的網路、接入現有的憑證授權中心、使用密碼或第二因素驗證具名使用者,以及在 Layer 2 建立橋接。以下內容將說明這項建議的依據,並指出每個例外情況開始適用於你的確切條件。
為何 WireGuard 成為自架服務使用者的首選
程式碼規模小到可以閱讀。 WireGuard 專案的通訊協定實作約為 4,000 行程式碼。若將 OpenVPN 每次執行加密運算所依賴的 OpenSSL library 一併計算,程式碼規模會達到 6 位數。規模很重要,因為每一行都是攻擊面,而你和程式碼審查者都不可能閱讀 100,000 行。4,000 行則有可能。
它在 kernel 中執行。 WireGuard 自 5.6 起納入 mainline Linux,因此 Ubuntu 24.04 與 Debian 13 無須編譯即可使用。封包會在原本所在的 kernel space 中加密,不必複製到 userspace process 再傳回。先執行以下命令確認:
sudo modprobe wireguard && echo ok在 KVM VPS 上會輸出 ok。在 OpenVZ 或 LXC 等共用主機 kernel 的 container virtualisation 環境中,則會因為無法將 module 載入不屬於你的 kernel 而輸出 Operation not supported。
不需要進行協商。 WireGuard 只有一組固定的 cipher suite:資料使用 ChaCha20-Poly1305,金鑰使用 Curve25519。沒有可降級的版本,也沒有容易設定錯誤的選項。OpenVPN 會與每個 client 協商 cipher 和 TLS(transport layer security)版本。這提供了彈性,也帶來設定錯誤的可能。若 server 保留 data-ciphers AES-256-GCM:AES-128-CBC,遇到沒有提供更佳選項的 client 時,會順利降級使用 CBC cipher;log 不會將較弱的 cipher 標示為問題。若可使用 data channel offload,OpenVPN 會提示 CBC 項目已關閉 offload。這是速度方面的警告,不是安全性警告。
該埠不會回應。 WireGuard 封包若未通過訊息驗證檢查,會直接丟棄且完全不回覆。因此,nmap -sU -p 51820 無法區分 WireGuard server 與防火牆靜默丟棄封包的埠:兩者都會回傳 open|filtered。只有未受過濾且沒有 process 監聽的埠會暴露自身狀態,因為 kernel 會以 ICMP port unreachable 回應,而 nmap 會將其回報為 closed。TCP mode 的 OpenVPN server 會先完成 TCP handshake,再判定不接受該連線。這已足以讓掃描器確認該處存在服務。使用 tls-crypt 的 OpenVPN over UDP 幾乎同樣安靜,因此這項理由是反對在 TCP 上執行 OpenVPN,而不是反對 OpenVPN 本身。
漫遊不需額外處理。 WireGuard peer 以 public key 識別,而不是以位址識別。你的筆記型電腦從家用網路切換到行動熱點後,會從新的位址傳送一次 handshake,server 隨即更新回覆所使用的 endpoint。不需要重新連線,因為原本就沒有持續建立連線。OpenVPN 也能透過 float 實現類似功能,但 client 通常會先中斷,再重新建立完整的 TLS session。因此,OpenVPN 在掀開上蓋後會出現可察覺的暫停,WireGuard 則不會。
2026 年的速度:差距已經縮小
多年來,關於速度的合理說法是:OpenVPN 會將每個封包複製到 userspace,在其中加密後再複製回去;WireGuard 則始終不離開 kernel。如今情況已不完全如此,忽略這點的比較已經過時。
OpenVPN 2.7 於 February 2026 發布,支援上游的 ovpn kernel module;該模組已合併至 Linux 6.16。這就是 DCO(data channel offload):control channel 留在 userspace,而大量資料路徑移至 kernel,運作方式大致與 WireGuard 一直採用的方式相同。在 kernel 和 OpenVPN 都足夠新、能使用這項功能的情況下,兩者的 throughput 屬於同一個等級,而不是相差一個等級。請確認實際安裝的版本:
uname -r
openvpn --version | head -n 1
modinfo ovpn 2>/dev/null | head -n 3截至 October 2026,標準的 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 沒有的額外變動因素。Ubuntu 26.04 LTS 隨附 OpenVPN 2.7.0 和 Linux 7.0 kernel,兩者都足以使用 ovpn;因此在該版本中,應檢查上方的 modinfo 行。
在將 DCO 列為繼續使用 OpenVPN 的理由前,請先了解其限制。它只支援 Layer 3 tunnels,只接受 AEAD ciphers(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 443 埠連出。 WireGuard 僅支援 UDP,這是刻意的設計,也不會加入 TCP 模式。只依埠號篩選流量的旅館網路,通常會放行使用 proto tcp-server 與 port 443 設定的 OpenVPN。但不要將此誤認為流量偽裝:OpenVPN over TCP 使用自己的封包框架,而不是一般的 TLS 工作階段,因此仍可能被會檢查或終止 HTTPS 連線的企業防火牆或 Proxy 辨識並封鎖。WireGuard 需要透過 wstunnel 或 udp2raw 等包裝程式才能通過相同網路,這會增加一個需要執行及持續修補的程序。請注意埠號衝突:如果該 IP 位址上的 TCP 443 已由 Web 伺服器使用,兩者其中之一就必須改用其他埠號。
您已經在執行憑證授權中心。 OpenVPN 使用 X.509 憑證進行驗證,因此可以直接整合至您已經運作的 PKI(public key infrastructure)。憑證會自行到期;若要撤銷憑證,只要將其加入憑證撤銷清單,伺服器便可透過 crl-verify 讀取。WireGuard 沒有憑證、到期機制或撤銷清單。移除對等端點時,必須編輯伺服器設定並重新載入。若只有 10 個對等端點,這樣做沒有問題;但若有 400 個對等端點且需要稽核,憑證模型就能實際降低管理負擔。
您需要具名使用者,而不只是金鑰。 OpenVPN 可以透過 auth-user-pass-verify 或 openvpn-plugin-auth-pam.so 等外掛程式,將驗證交給外部系統,藉此整合 LDAP 或一次性密碼的第二因素驗證。WireGuard 完全沒有使用者的概念。金鑰不是存在設定中,就是不存在。如果需求是「Sara 必須輸入手機收到的驗證碼」,WireGuard 本身無法表達這項要求。
您需要 Layer 2,或需要支援舊式系統的用戶端。 使用 dev tap 的 OpenVPN 可以橋接 Ethernet frame,這對廣播通訊協定及舊式 LAN 遊戲很重要。WireGuard 僅支援 Layer 3,今後也不會改變。OpenVPN 也有適用於某些永遠不會提供 WireGuard 應用程式的硬體與作業系統的用戶端。這兩項需求都日益少見,而且 dev tap 與 DCO 不相容,因此使用橋接時必須採用較慢的處理路徑。
兩種設定實際上需要付出什麼代價
WireGuard identity 只需執行一個命令。括號不可省略,因為它會在金鑰建立前設定檔案模式:
(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 能提供到期與撤銷機制,但你也必須保護一把要使用多年的私密金鑰、記得續期,並在遺失金鑰時重新建立整套環境。如果你不需要 CA 提供的功能,就等於白費成本。完整的 WireGuard 操作程序包含 forwarding、NAT (network address translation),以及可能浪費一個下午的 handshake failures,請參閱在 VPS 上自行架設 WireGuard VPN 的指南。
防火牆需要為每個協定設定什麼
WireGuard 只需要一條入站規則,允許 ListenPort 中指定連接埠的 UDP 流量:
sudo ufw allow 51820/udp
sudo ufw status verboseOpenVPN 預設需要開放 UDP 1194;如果選擇該設定,也可以使用 TCP 443。接著,這兩種協定都需要啟用 IP forwarding,並設定來源 NAT 規則,因為 Linux 會丟棄目的地不是本機的封包。這部分對兩種協定完全相同,也是大多數「tunnel 已連線,但沒有網際網路」問題的來源。如果你不熟悉 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 透過 VPN 通道測量自己的結果,不要直接採信部落格上的數字,因為在 VPS 上,限制通常來自 CPU 或頻寬配額。
WireGuard 能透過 TCP 443 埠運作嗎?
不能單獨運作。WireGuard 的設計僅支援 UDP,目前也沒有規劃 TCP 模式。若要通過只允許 TCP 443 的網路,必須使用 wstunnel 或 udp2raw 等方式將其包在通道中,但兩端都需要執行並維護額外的程序。如果這是你平時的工作環境,而網路只依連接埠篩選流量,使用搭配 proto tcp-server 與 port 443 的 OpenVPN 會是較簡單的選擇;不過,會檢查 HTTPS 的代理程式仍可能辨識出來並加以封鎖。
OpenVPN 現在不安全嗎?
不是。啟用 AEAD 加密法(例如 AES-256-GCM)與 tls-crypt 的最新版 OpenVPN,是可靠的 VPN。WireGuard 的優勢在於其他方面:OpenVPN 包含更多程式碼與更多選項,因此容易讓疲於管理的系統管理員以錯誤方式設定。選項越少,設定錯誤的可能性就越低。
VPS 上的個人 VPN 應該選哪一個?
WireGuard。每台裝置一組金鑰組、一份約 10 行的設定檔、開放一個 UDP 埠,而且交握會在你察覺前完成。只有在你經常從封鎖 UDP 的網路連線,或必須配合既有的憑證授權單位或使用者目錄時,才選擇 OpenVPN。