VPN 虛擬私人網路完整教學:原理、協定與實戰設定 | Networking
VPN(Virtual Private Network,虛擬私人網路)是一種透過公共網路建立 加密隧道(Encrypted Tunnel) 的技術,讓遠端使用者或不同地點的網路能夠安全通訊,如同處於同一個私有網路中。本文從 VPN 的核心原理出發,深入比較 IPSec、OpenVPN、WireGuard 等主流協定,介紹 Site-to-Site 與 Remote Access 兩種架構模式,並提供完整的 WireGuard 實戰設定教學。
VPN 是什麼?
虛擬私人網路(Virtual Private Network,VPN)是一種透過公共網路(例如 Internet)建立加密隧道的技術。VPN 結合了加密、認證與隧道協議,確保資料在傳輸過程中的 機密性(Confidentiality)、完整性(Integrity) 與 來源驗證(Authentication)。
傳統做法是租用專線連接兩個地點的網路,成本極高。VPN 的核心概念就是利用已有的公共網路基礎建設,透過加密封裝的方式建立「虛擬的」私人通道,大幅降低成本的同時維持安全性。
封裝過程可以簡單理解為:
原始封包:
[IP: 10.0.1.50 → 10.0.2.100] [TCP] [Data]
VPN 封裝後:
[外部IP: 203.0.113.1 → 198.51.100.1] ← 公網 IP,路由器看得到
[ESP Header] ← VPN 安全標頭
[加密: IP: 10.0.1.50 → 10.0.2.100] ← 原始封包被加密
[加密: TCP] [加密: Data] ← 資料內容被加密
VPN 閘道(Gateway)將內部私有網路的封包封裝在公共網路封包中傳輸,接收端再解封裝還原原始封包,整個過程對使用者完全透明。
VPN 提供的核心安全功能
| 功能 | 說明 |
|---|---|
| 機密性(Confidentiality) | 資料加密,防止第三方竊聽 |
| 完整性(Integrity) | 透過 HMAC/Hash 確保資料未被篡改 |
| 認證(Authentication) | 驗證通訊對方的身份 |
| 防重放(Anti-Replay) | 防止封包被攔截後重新發送 |
| 隧道封裝(Tunneling) | 將私有網路封包封裝於公共網路中傳輸 |
VPN 的兩種主要類型
根據使用場景,VPN 主要分為兩種架構:Site-to-Site VPN 與 Remote Access VPN。
Site-to-Site VPN(站對站 VPN)
Site-to-Site VPN 用來連接兩個或多個固定地點的網路,最常見的場景是企業總部與分公司之間的永久性連線。VPN 閘道(通常是防火牆或路由器)自動建立並維護隧道,使用者不需要手動操作。
特點:
- 自動建立隧道,無需使用者介入
- 兩端網路的使用者可以透明存取對方的資源
- 通常使用 IPSec 協議
- 需要固定的公網 IP 位址
Remote Access VPN(遠端存取 VPN)
Remote Access VPN 允許個別使用者(例如在家工作的員工)透過 VPN 客戶端軟體連接到企業內部網路。每位使用者獨立建立 VPN 連線,連線成功後就如同身處辦公室內網。
特點:
- 每個使用者獨立建立連線
- 需要在裝置上安裝 VPN 客戶端軟體
- 常使用 SSL/TLS VPN、IPSec 或 WireGuard
- 支援多因素認證(Multi-Factor Authentication,MFA)
兩種類型的比較
| 特性 | Site-to-Site | Remote Access |
|---|---|---|
| 使用者 | 網路對網路(自動) | 個人對網路(手動連線) |
| 端點 | VPN 閘道 / 路由器 | 使用者裝置 + VPN 伺服器 |
| 常用協議 | IPSec | SSL/TLS、IPSec、WireGuard |
| 連線時間 | 永久連線 | 按需連線 |
| 典型場景 | 總部與分公司互連 | 遠端工作、出差 |
| 設定複雜度 | 中等(一次設定) | 低(使用者端簡單) |
IPSec 協議套件
IPSec(Internet Protocol Security)是一套在 IP 層(Layer 3)提供安全通訊的協議框架,也是 Site-to-Site VPN 最廣泛使用的標準。IPSec 包含多個子協議與機制,主要透過 IKE 進行金鑰協商、使用 ESP 或 AH 進行資料保護。
IKE 金鑰交換(Phase 1 & Phase 2)
IKE(Internet Key Exchange)負責在 VPN 端點之間協商安全參數並建立安全通道,分為兩個階段:
Phase 1 — 建立安全管理通道:
- 雙方交換安全參數提議(加密演算法、雜湊函式、DH 群組)
- 進行 Diffie-Hellman 金鑰交換,產生共享秘密
- 完成身份認證(Pre-shared Key 或數位憑證)
- 建立 IKE SA(安全管理通道),用於保護 Phase 2 的協商
Phase 2 — 建立資料傳輸通道:
- 在 Phase 1 建立的安全通道中,協商 IPSec 參數(ESP 或 AH)
- 產生 IPSec SA 金鑰
- 建立實際的加密資料傳輸通道
目前建議使用 IKEv2,相比 IKEv1 只需 4 個訊息(v1 需要 6-9 個)就能完成協商,並且原生支援 NAT 穿越與 MOBIKE(IP 變更不斷線)。
ESP vs AH
IPSec 提供兩種資料保護協議:
| 特性 | ESP(Encapsulating Security Payload) | AH(Authentication Header) |
|---|---|---|
| 加密 | 是(AES、3DES 等) | 否 |
| 認證 | 是(HMAC) | 是(HMAC) |
| IP Header 認證 | 否 | 是(含不可變欄位) |
| NAT 相容 | 是(NAT-T,UDP 4500) | 否(修改 IP Header 會破壞認證) |
| Protocol 編號 | 50 | 51 |
| 使用率 | 極高(主流選擇) | 低(逐步淘汰) |
實務上幾乎都使用 ESP,因為它同時提供加密與認證,且與 NAT 相容。AH 因為不支援加密且與 NAT 不相容,已經很少使用。
Tunnel Mode vs Transport Mode
| 特性 | Tunnel Mode(隧道模式) | Transport Mode(傳輸模式) |
|---|---|---|
| 封裝方式 | 封裝整個原始 IP 封包 | 僅加密 Payload |
| IP Header | 新增外部 IP Header | 使用原始 IP Header |
| 主要用途 | 閘道對閘道(Site-to-Site VPN) | 主機對主機(L2TP/IPSec) |
| 隱私性 | 原始 IP 被加密隱藏 | 原始 IP 可見 |
| 開銷 | 較大(額外 IP Header) | 較小 |
Tunnel Mode 是 Site-to-Site VPN 的標準模式,它會將整個原始 IP 封包加密並加上新的 IP Header,讓中間路由器只看到 VPN 閘道之間的流量。Transport Mode 則常用於端對端的通訊場景。
OpenVPN 概述
OpenVPN 是最廣泛使用的開源 SSL/TLS VPN 實現,利用 SSL/TLS 協議建立加密隧道。它通常運作在 TCP 443 或 UDP 1194 端口。
OpenVPN 的主要特點:
- 使用 OpenSSL 函式庫,支援所有 SSL/TLS 加密套件
- 支援 TCP(可靠但較慢)和 UDP(較快,推薦)兩種傳輸模式
- 憑證式認證(PKI,X.509)
- 跨平台支援:Linux、Windows、macOS、Android、iOS
- 使用 TCP 443 端口時幾乎不會被防火牆阻擋
- 提供 TUN 模式(Layer 3 路由模式)和 TAP 模式(Layer 2 橋接模式)
OpenVPN 的缺點是程式碼量較大(約 70,000 行),運行在 User Space,效能不如 Kernel Space 的方案。設定相對複雜,需要管理憑證基礎設施(CA)。
WireGuard 深入解析
WireGuard 是一個現代、極簡的 VPN 協議與實現,已直接整合在 Linux Kernel 中。以極少的程式碼量(約 4,000 行,對比 OpenVPN 的 70,000+ 行)實現了高效能的加密隧道,是目前最受推薦的 VPN 方案之一。
WireGuard 的設計哲學
WireGuard 的核心設計原則包括:
- Cryptokey Routing:公鑰等於 Peer 的身份,同時也定義了允許的 IP 範圍,不需要傳統的 PKI/CA 基礎設施
- 固定加密套件:使用 Noise Protocol Framework,不提供演算法選擇,避免設定錯誤
- Curve25519 — ECDH 金鑰交換
- ChaCha20 — 對稱加密
- Poly1305 — MAC 認證
- BLAKE2s — 雜湊函式
- Kernel Space 實現:直接在 Linux Kernel 運作,效能極高
- Stealth 特性:不回應未認證的封包,對網路掃描器不可見
WireGuard 金鑰生成
WireGuard 使用公私鑰對進行認證,金鑰生成非常簡單:
# 安裝 WireGuard(Ubuntu/Debian)
sudo apt update && sudo apt install wireguard
# 產生伺服器金鑰對
wg genkey | tee server_privatekey | wg pubkey > server_publickey
# 產生客戶端金鑰對
wg genkey | tee client_privatekey | wg pubkey > client_publickey
# 查看產生的金鑰
cat server_privatekey
# 輸出範例:yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
cat server_publickey
# 輸出範例:xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
# 設定金鑰檔案權限(僅限擁有者讀取)
chmod 600 server_privatekey client_privatekey
WireGuard Server 端設定
在伺服器上建立設定檔 /etc/wireguard/wg0.conf:
# === WireGuard Server 設定 ===
# 檔案位置:/etc/wireguard/wg0.conf
[Interface]
# 伺服器的私鑰
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
# VPN 內部 IP 位址
Address = 10.200.200.1/24
# 監聽端口
ListenPort = 51820
# 啟動時設定 NAT 轉發規則
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 關閉時移除 NAT 轉發規則
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# Peer 1:員工 Alice
[Peer]
PublicKey = ALICE_PUBLIC_KEY_BASE64
# 允許 Alice 使用的 VPN IP
AllowedIPs = 10.200.200.2/32
# 保持連線,用於 NAT 穿越(每 25 秒發送一次心跳)
PersistentKeepalive = 25
# Peer 2:員工 Bob
[Peer]
PublicKey = BOB_PUBLIC_KEY_BASE64
AllowedIPs = 10.200.200.3/32
PersistentKeepalive = 25
WireGuard Client 端設定
在客戶端建立設定檔:
# === WireGuard Client 設定(Alice)===
# 檔案位置:/etc/wireguard/wg0.conf
[Interface]
# 客戶端的私鑰
PrivateKey = ALICE_PRIVATE_KEY_BASE64
# 客戶端的 VPN 內部 IP
Address = 10.200.200.2/24
# 指定 DNS 伺服器
DNS = 10.200.200.1, 1.1.1.1
[Peer]
# 伺服器的公鑰
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
# Full Tunneling:所有流量都走 VPN
AllowedIPs = 0.0.0.0/0, ::/0
# 伺服器的公網位址與端口
Endpoint = vpn.example.com:51820
# 保持連線
PersistentKeepalive = 25
WireGuard 常用操作指令
# 啟動 VPN 介面
sudo wg-quick up wg0
# 輸出範例:
# [#] ip link add wg0 type wireguard
# [#] wg setconf wg0 /dev/fd/63
# [#] ip -4 address add 10.200.200.1/24 dev wg0
# [#] ip link set mtu 1420 up dev wg0
# 查看連線狀態
sudo wg show
# 輸出範例:
# interface: wg0
# public key: xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
# private key: (hidden)
# listening port: 51820
#
# peer: ALICE_PUBLIC_KEY_BASE64
# endpoint: 203.0.113.50:52341
# allowed ips: 10.200.200.2/32
# latest handshake: 32 seconds ago
# transfer: 3.41 GiB received, 1.02 GiB sent
# 關閉 VPN 介面
sudo wg-quick down wg0
# 設定開機自動啟動
sudo systemctl enable wg-quick@wg0
# 確認服務狀態
sudo systemctl status wg-quick@wg0
L2TP/IPSec 簡介
L2TP(Layer 2 Tunneling Protocol)本身不提供加密,通常與 IPSec 搭配使用,稱為 L2TP/IPSec。L2TP 負責隧道封裝,IPSec 負責加密。
L2TP/IPSec 的優勢在於多數作業系統原生支援,不需要安裝額外軟體。但它有幾個明顯的缺點:
- 雙重封裝 導致效能開銷較大
- 固定使用 UDP 500/4500/1701 端口,容易被防火牆阻擋
- NAT 穿越能力較差
- 已逐漸被 IKEv2 和 WireGuard 取代
Split Tunneling vs Full Tunneling
VPN 連線建立後,有兩種流量處理策略:
Full Tunneling(全隧道)
所有 網路流量都經過 VPN 隧道,包括存取公共網站(如 YouTube、Gmail)的流量。
- 安全性較高,企業可以完全掌控流量
- 但 VPN 伺服器負載較大,使用者體驗可能較差(所有流量繞道)
Split Tunneling(分割隧道)
僅企業內部 流量經過 VPN 隧道,公共網站流量直接存取 Internet。
- VPN 伺服器負載較小,公共服務速度不受影響
- 但公共流量未受 VPN 保護,企業無法完全監控
WireGuard 中的設定差異
在 WireGuard 的 Client 設定中,透過 AllowedIPs 參數即可控制:
# Full Tunneling — 所有流量都走 VPN
[Peer]
AllowedIPs = 0.0.0.0/0, ::/0
# Split Tunneling — 僅私有網段走 VPN
[Peer]
AllowedIPs = 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
| 特性 | Full Tunneling | Split Tunneling |
|---|---|---|
| 安全性 | 較高(所有流量受保護) | 較低(公共流量未經 VPN) |
| VPN 頻寬 | 伺服器負載大 | 伺服器負載小 |
| 使用者體驗 | 較差(速度慢) | 較佳(公共服務速度正常) |
| 企業控管 | 完整流量可視性 | 部分流量不可見 |
| 適用場景 | 高安全需求環境 | 一般遠端工作 |
VPN 協定比較總表
| 特性 | WireGuard | IPSec/IKEv2 | OpenVPN | L2TP/IPSec |
|---|---|---|---|---|
| 運作層級 | Layer 3 | Layer 3 | Layer 3 (TUN) / Layer 2 (TAP) | Layer 2 |
| 加密演算法 | ChaCha20、Curve25519 | AES、3DES、DH | OpenSSL 全部支援 | AES + IPSec |
| 使用端口 | UDP(自訂) | UDP 500/4500 | TCP/UDP(自訂) | UDP 1701/500/4500 |
| NAT 穿越 | 原生支援 | NAT-T(UDP 4500) | 容易 | 較困難 |
| 程式碼量 | 約 4,000 行 | 數十萬行 | 約 70,000 行 | 作業系統內建 |
| 效能 | 最高(Kernel Space) | 高(硬體加速支援佳) | 中等(User Space) | 中等(雙重封裝) |
| 設定難度 | 極簡 | 最複雜 | 複雜但文件豐富 | 簡單(OS 原生) |
| 跨平台 | 全平台支援 | 全平台(OS 內建) | 全平台 | 全平台(OS 內建) |
Zero Trust Network Access(ZTNA)
傳統 VPN 模型存在一個根本問題:一旦使用者通過 VPN 認證進入內部網路,就可以存取網路中的所有資源。這種「信任邊界」的概念在現代威脅環境下越來越不安全。
零信任網路存取(Zero Trust Network Access,ZTNA) 是一種更現代的安全架構,其核心原則是 「永不信任,始終驗證」:
- 每次存取資源都需要重新驗證身份與裝置狀態
- 遵循 最小權限原則,使用者只能存取被明確授權的資源
- 不區分「內部」與「外部」,無論使用者在哪裡,都適用相同的安全策略
主流的 ZTNA 方案包括:
| 方案 | 說明 |
|---|---|
| Google BeyondCorp | Google 內部實踐的零信任架構 |
| Cloudflare Access | 基於 Cloudflare 網路的零信任存取 |
| Zscaler Private Access | 企業級零信任安全平台 |
| Tailscale | 基於 WireGuard 的 Mesh VPN + ACL 控制 |
值得注意的是,ZTNA 與 VPN 並非完全對立。像 Tailscale 這樣的方案就是將 WireGuard VPN 技術與零信任存取控制結合,既保留了 VPN 的加密隧道優勢,又加入了細粒度的權限管理。
總結
VPN 技術讓我們能夠在不安全的公共網路上建立安全的私人通訊通道。以下是本文的重點回顧:
- VPN 的核心原理 是透過加密隧道封裝私有網路封包,在公共網路上安全傳輸
- Site-to-Site VPN 適用於企業分公司互連的固定連線場景;Remote Access VPN 適用於遠端員工按需連回公司的場景
- IPSec 是成熟的協議框架,透過 IKE 進行金鑰協商、ESP 進行加密與認證,是 Site-to-Site VPN 的主流選擇
- OpenVPN 基於 SSL/TLS,跨平台且容易穿越防火牆,但設定較為複雜
- WireGuard 是目前最推薦的現代 VPN 方案——程式碼極簡、效能最高、設定容易,已內建於 Linux Kernel
- Split Tunneling 與 Full Tunneling 各有優缺點,應根據安全需求與使用者體驗來選擇
- ZTNA 代表了網路安全的演進方向,但 VPN 技術仍然是建立安全通訊的基礎
如果你正在考慮為團隊或個人架設 VPN,WireGuard 是目前最值得優先嘗試的方案:設定簡單、效能卓越、安全性高,幾乎沒有理由不選擇它。