Neatly organized yellow and green network cables in a data center server rack

市面上的商業 VPN 應用程式每年收費 60 至 120 美元,記錄的資料往往比它們承認的多,而且要跟成千上萬個陌生用戶共用同一台伺服器。KVM 架構的 VPS——也就是 DigitalOcean、Linode 和 Vultr 等服務商出售的標準虛擬機器實例——讓你以每月約 4 至 6 美元的價錢,擁有一台專屬的 Linux 主機,再用 WireGuard 在不到十五分鐘內把它變成一台 VPN 伺服器。以下是逐一指令的實際設定步驟,並已對照 DigitalOcean 與 Vultr 現行的官方文件核實。

為什麼要選 KVM,又為什麼要選 WireGuard

「KVM」(kernel-based virtual machine,核心式虛擬機器)是幾乎所有現代雲端 VPS 背後採用的虛擬化技術——它讓你的實例擁有獨立核心和完整的 root 權限,不像舊式的容器型主機(OpenVZ)要跟其他租戶共用同一個核心,還經常封鎖 WireGuard 所需的網絡模組。DigitalOcean 的每個 droplet、Linode 的每個實例,以及 Vultr 的每個 Cloud Compute 實例都是 KVM,所以這三家服務商任選一家都適用本指南。選一個有公開 IPv4 位址的最便宜方案就足夠——對個人 VPN 來說,1 核心 CPU 加 1GB 記憶體已經是綽綽有餘。

WireGuard 早在 2020 年就併入 Linux 5.6 核心,如今已成為取代 OpenVPN 的首選:它的程式碼量只有約 4,000 行,相比 OpenVPN 的十萬行以上簡潔得多;它採用現代加密演算法(Curve25519、ChaCha20、Poly1305、BLAKE2s),不需要協商加密套件,也就沒有設定錯誤的風險;而且因為只使用 UDP、採用無狀態設計,在行動網絡上的測試表現也一直比較快。

第一步:建立 VPS 並安裝 WireGuard

在任何一家服務商建立一台 Ubuntu 24.04 的實例,記下它的公開 IP,然後用 root 或具 sudo 權限的使用者 SSH 登入。WireGuard 自 Ubuntu 18.04 開始已內建在預設的套件庫中,不需要額外加入 PPA:

sudo apt update
sudo apt install wireguard qrencode -y
wg --version

qrencode 嚴格來說並不是 WireGuard 本身的一部分——它是稍後用來把手機設定檔轉換成可掃描 QR code 的小工具。

第二步:生成伺服器的金鑰對

WireGuard 使用公開金鑰加密來驗證各個節點(peer)的身分,而不是用戶名和密碼。生成伺服器的私密金鑰和公開金鑰後,要立即鎖緊私密金鑰檔案的權限:

cd /etc/wireguard
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key

執行 cat server_private.key 及 cat server_public.key 即可查看內容——接下來你會把私密金鑰貼進伺服器的設定檔中。

第三步:撰寫伺服器設定檔

首先找出伺服器的預設網絡介面名稱——設定 NAT 規則時會用到:

ip -o -4 route show to default | awk '{print $5}'

一般會顯示 eth0 (DigitalOcean 或 Linode 上常見),或 enp1s0 (Vultr 上常見)。建立 /etc/wireguard/wg0.conf 並把該介面名稱代入其中:

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <paste server_private.key here>
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Peers are appended below, one [Peer] block per device

10.8.0.1/24 是這個 VPN 的私有子網段——伺服器永遠佔用該網段的第一個位址,之後每個用戶端依序取得下一個位址(10.8.0.2、10.8.0.3 依此類推)。51820/UDP 是 WireGuard 慣用的預設埠號;你也可以改用其他埠號,但必須跟用戶端連線時使用的設定一致。

第四步:開啟 IP 轉送功能

Linux 預設不會在不同網絡介面之間轉送流量——你必須手動開啟這項功能,讓伺服器能把用戶端的流量轉送到網際網路:

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

第五步:開啟防火牆

如果你使用的是 UFW(Ubuntu 的預設防火牆),要在啟動服務前先允許 WireGuard 使用的埠號,否則就會出現一條運作正常、但誰也連不進來的通道:

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable

DigitalOcean 和 Linode 預設不會在雲端層級的防火牆上做任何限制(真正擋住你的其實是 UFW);但如果你另外啟用了 Vultr 的 Cloud Firewall,或 DigitalOcean 可選用的 Cloud Firewall 服務,就要在對應的控制台另外新增一條允許 UDP 51820 的規則。

第六步:啟動 WireGuard 並設定開機自動啟動

sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0
sudo systemctl status wg-quick@wg0
sudo wg show wg0

wg show wg0 應該會列出你的介面、公開金鑰和監聽埠號,此時還不會有任何節點(peer)。如果 systemctl status 顯示的是「active (exited)」而不是「active (running)」,這是正常現象—— wg-quick 是一個執行一次就結束的腳本,負責設定好介面後就退出。

第七步:建立用戶端並生成 QR code

每一台裝置(手機、手提電腦)都是獨立的「節點」(peer),各自擁有自己的金鑰對。先生成一組:

cd /etc/wireguard
wg genkey | tee client1_private.key | wg pubkey > client1_public.key

把這個節點加到 /etc/wireguard/wg0.conf 檔案的最後面,在伺服器端進行設定:

[Peer]
PublicKey = <paste client1_public.key here>
AllowedIPs = 10.8.0.2/32

然後在不中斷通道連線的情況下重新載入設定:

sudo wg syncconf wg0 <(wg-quick strip wg0)

接著撰寫用戶端自己的設定檔——這就是手機或手提電腦實際匯入的檔案——命名為 client1.conf:

[Interface]
PrivateKey = <paste client1_private.key here>
Address = 10.8.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <paste server_public.key here>
Endpoint = <your server's public IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

AllowedIPs = 0.0.0.0/0 會把用戶端的所有流量都導向這條通道(完整的 VPN);如果你只想透過伺服器存取其私有網絡,而不是把全部流量都繞過去,可以改設為只有 10.8.0.0/24 就可以了。 PersistentKeepalive = 25 每 25 秒發送一次保持連線封包——這對手機尤其重要,否則手機在行動網絡上很容易失去 UDP 連線對應關係。

把這個檔案轉換成 QR code,方便用官方 WireGuard 應用程式(iOS/Android)直接掃描匯入,免去手動輸入的麻煩:

qrencode -t ansiutf8 < client1.conf

在手機版 WireGuard 應用程式中,點擊「+」按鈕,選擇「掃描 QR code」,再把相機對準終端機畫面即可。如果是桌面裝置,把 client1.conf 複製到安裝了官方 WireGuard 用戶端的電腦上直接匯入即可——桌面版不需要掃描 QR code 這個步驟。

請把這個 QR code 和 .conf 檔案當成密碼一樣看待:任何人只要掃描到它,就能完全存取這條通道。傳送完成後記得刪除 client1.conf 伺服器硬碟上的副本,畢竟私密金鑰其實不需要留在伺服器上。

確認連線真的生效

從用戶端連線後,在通道內確認你的流量真的是透過這台 VPS 對外發出:

ping -c 4 10.8.0.1
curl ifconfig.me

ping 應該會成功,而 curl ifconfig.me 應該會回傳你 VPS 的公開 IP,而不是你家裡或辦公室的 IP。回到伺服器端執行 sudo wg show wg0 這時就會看到該節點出現「最近一次交握(latest handshake)」的時間戳記和流量統計數字——證明資料確實有在傳輸。

之後每新增一台裝置,重複第七步並依序遞增 IP(10.8.0.3、10.8.0.4……)即可。一台每月 5 美元的 KVM 實例,足以輕鬆應付一整個家庭的手機和手提電腦,而且因為整台機器從頭到尾都由你自己掌控,不會再有服務商記錄你的瀏覽紀錄——唯一需要擔心的,只有你自己。