WireGuard VPN 的完整設定教學 文章首圖

WireGuard VPN 的完整設定教學

WireGuard VPN 的完整設定教學

在虛擬私人網路(VPN)的領域中,OpenVPN 長期以來是標準解決方案,但隨著核心內建支援的成熟,WireGuard 憑藉其極簡的架構、驚人的連線速度以及更低的資源消耗,迅速成為系統管理員的首選。對於熟悉 Linux 基礎操作的中階使用者而言,掌握 WireGuard 的設定不僅能提升網路安全性,更能深入理解現代網路協定的運作原理。本文將以 Ubuntu 22.04 與 Debian 12 為基礎,帶您快速搭建一套高效能的 WireGuard 服務。

環境準備與安裝

WireGuard 的核心模組已整合進 Linux 5.6 以上的核心版本中,因此我們主要需要安裝用戶端工具與相關相依套件。請確保您的系統已更新到最新狀態,並透過以下指令安裝 WireGuard:

sudo apt update
sudo apt install wireguard-tools -y

安裝完成後,您可以透過 wg 指令檢查版本,確認安裝成功:

wg --version

產生金鑰對

WireGuard 使用非對稱加密,因此每一端(伺服器與客戶端)都需要一組公鑰(Public Key)與私鑰(Private Key)。為了簡化操作,我們可以使用 wg genkey 指令來生成金鑰。

首先,在伺服器端生成私鑰,並將其儲存至檔案,同時從私鑰衍生出公鑰:

# 生成伺服器私鑰
wg genkey | sudo tee /etc/wireguard/privatekey_server | wg pubkey | sudo tee /etc/wireguard/publickey_server

# 生成客戶端私鑰(模擬遠端連線者)
wg genkey | sudo tee /etc/wireguard/privatekey_client | wg pubkey | sudo tee /etc/wireguard/publickey_client

請務必妥善保管私鑰檔案,切勿將其上傳至公開版本控制系統。後續設定中,我們將分別讀取這些金鑰來建立信任關係。

伺服器端設定

WireGuard 的設定檔位於 /etc/wireguard/wg0.conf。我們需要定義監聽埠、金鑰以及允許的連線網段。以下是一個典型的伺服器設定範例:

[Interface]
# 監聽埠,預設為 51820,可根據需求修改
ListenPort = 51820
# 讀取伺服器私鑰
PrivateKey = $(cat /etc/wireguard/privatekey_server)
# 設定 VPN 內部網路網段
Address = 10.0.0.1/24

# 允許 IP 轉發與 NAT,若需啟用此功能需額外設定 iptables 或 nftables
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# 客戶端的公鑰
PublicKey = $(cat /etc/wireguard/publickey_client)
# 分配給客戶端的 VPN IP
AllowedIPs = 10.0.0.2/32
# 若客戶端需透過伺服器存取網際網路,可設為 0.0.0.0/0
# AllowedIPs = 0.0.0.0/0

設定完成後,賦予檔案適當的權限以確保私鑰安全:

sudo chmod 600 /etc/wireguard/privatekey_server
sudo chmod 644 /etc/wireguard/wg0.conf

接著啟動 WireGuard 服務並設定開機自動啟動:

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

您可以使用 sudo wg show 來驗證介面是否已正確啟動並顯示連線狀態。

客戶端端設定

在客戶端機器上,我們同樣建立 /etc/wireguard/wg0.conf,內容如下:

[Interface]
PrivateKey = $(cat /etc/wireguard/privatekey_client)
Address = 10.0.0.2/32

[Peer]
# 伺服器的公鑰
PublicKey = $(cat /etc/wireguard/publickey_server)
# 伺服器的 IP 與埠號
Endpoint = <SERVER_PUBLIC_IP>:51820
# 定義哪些流量應透過 VPN 隧道傳輸
AllowedIPs = 0.0.0.0/0
# 保持連線活躍的探測間隔
PersistentKeepalive = 25

請將 <SERVER_PUBLIC_IP> 替換為您伺服器的真實公网 IP 位址。啟動客戶端連線:

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

常見問題排查

1. 連線無法建立或狀態為「Handshake did not occur」

這通常是由於防火牆阻擋 UDP 51820 埠所致。請檢查伺服器端的防火牆設定(如 UFW 或 AWS/GCP 的安全群組),確保 UDP 51820 埠已開放。此外,確認伺服器與客戶端的時間同步,因為 WireGuard 對時間差異敏感,若時間相差過大,加密驗證會失敗。

2. 無法透過 VPN 存取外部網際網路

若設定中未啟用 PostUp 的 NAT 規則,或核心未啟用 IP 轉發功能,流量將無法正確路由。請檢查 /etc/sysctl.confnet.ipv4.ip_forward=1 是否已取消註解並執行 sudo sysctl -p 套用設定。同時,確認 AllowedIPs 在客戶端設為 0.0.0.0/0 以確保所有流量都走隧道。

小結

WireGuard 以其簡潔的配置與卓越的性能,成為現代 Linux 環境中部署 VPN 的理想選擇。透過上述步驟,您已成功建立了一條加密的通訊隧道。建議後續可進一步研究如何動態管理多個客戶端金鑰,或結合 Fail2ban 增強安全性。掌握 WireGuard 不僅能解決當前需求,更為未來網路架構的擴展奠定堅實基礎。