跳轉到內容

WireGuard 自建 VPN 完整教程 2026:從零搭建高性能全設備翻牆

WireGuard

當提到自建科學上網方案時,大多數人首先想到的是 V2Ray、Shadowsocks 或 3X-UI 面板。但如果你需要的是一種 全設備無感翻牆 ——不僅僅是瀏覽器和特定 App 走代理,而是整個系統的所有流量(包括系統服務、DNS 查詢、局域網通信)都通過加密隧道傳輸——那麼 WireGuard 才是最佳選擇。

WireGuard 是一種現代化的 VPN 協議,代碼量僅約 4,000 行(相比之下 OpenVPN 超過 10 萬行、IPSec 超過 40 萬行),已於 2020 年正式合併進 Linux 內核。它以極高的性能、極簡的配置和極強的安全性著稱,被公認為下一代 VPN 協議的標準。

本文將詳細介紹如何在 VPS 上從零搭建 WireGuard VPN,並涵蓋多用戶管理、性能優化、全平臺客戶端配置和常見故障排查。


WireGuard 簡介

什麼是 WireGuard

WireGuard 是一種 Layer 3 VPN 協議,由 Jason A. Donenfeld 開發。它的設計理念是:

🎯 極簡:整個協議只有 4,000 行代碼,易於審計
🚀 極速:內核級運行,性能遠超用戶態協議
🔒 極安全:使用現代加密算法(ChaCha20、Poly1305、Curve25519)
📱 全平臺:Linux/Windows/macOS/iOS/Android 全支持
🔄 無狀態:無連接概念,UDP 無狀態設計,切換網絡自動恢復

工作原理

WireGuard 的核心設計與傳統 VPN 協議有本質區別:

特性WireGuardOpenVPNIPSec
架構無狀態 UDP有狀態 TLS有狀態 IKE
代碼量~4,000 行~100,000 行~400,000 行
加密ChaCha20+Poly1305AES-256-CBCAES-256-GCM
密鑰交換Curve25519RSA/DHDH/RSA
運行層級內核態(Linux)用戶態內核態
握手1-RTT多輪握手多輪握手
漫遊自動 IP 漫遊需要重連需要重連

WireGuard 的核心概念是 Peer(對等節點)。每個 Peer 擁有一對公私鑰,雙方通過交換公鑰建立加密通道。WireGuard 沒有傳統 VPN 的「客戶端-服務端」概念——每個節點都是對等的,只是配置時通常將 VPS 作為中轉節點。

與 V2Ray/Shadowsocks 的本質區別

維度WireGuardV2Ray/Shadowsocks
工作層級網絡層(Layer 3)應用層代理(SOCKS5/HTTP)
流量類型全部流量(TCP+UDP+ICMP)僅代理指定流量
運行方式虛擬網卡(tun 設備)應用層監聽端口
DNS強制走 VPN 隧道可配置 DNS 但非強制
設備覆蓋系統級全流量需要逐應用配置代理
隱蔽性較低(特徵明顯的 UDP 流量)較高(可偽裝為 HTTPS)
適用場景全設備無感翻牆精細化代理控制

簡單理解:V2Ray/Shadowsocks 是「選擇性代理」——你指定哪些 App 走代理;WireGuard 是「全部代理」——連上之後所有流量都走 VPN 隧道。

適用場景

WireGuard 特別適合以下場景:

  1. 全設備翻牆:需要路由器/Apple TV 等設備全局翻牆,而非逐設備配置
  2. 遠程辦公:連接公司內網或訪問受地理限制的服務
  3. 家庭網絡:在 OpenWrt 路由器上部署,全家設備自動翻牆
  4. 高帶寬需求:WireGuard 性能遠超用戶態協議,適合 4K 流媒體
  5. 多設備互聯:組建跨地域局域網(如 Tailscale/Netmaker 方案)

不適用場景

  • 需要高隱蔽性:WireGuard 的 UDP 流量特徵明顯,容易被 DPI 識別和 QoS
  • 需要精細分流:WireGuard 默認全流量走隧道,分流需要額外配置
  • 需要 CDN 中轉:WireGuard 是 UDP 協議,無法通過 Cloudflare CDN 中轉

WireGuard vs Shadowsocks vs V2Ray 對比

對比維度WireGuardShadowsocksV2Ray (VMess/VLESS)
協議類型VPN (Layer 3)代理 (SOCKS5)代理 (SOCKS5/HTTP)
加密方式ChaCha20-Poly1305AEAD (AES-GCM)可選多種加密
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
隱蔽性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
配置難度⭐⭐(簡單)⭐⭐(簡單)⭐⭐⭐⭐(複雜)
全設備支持✅ 原生❌ 需額外配置❌ 需額外配置
UDP 支持✅ 原生
CDN 中轉
流量偽裝✅ (WS+TLS/Reality)
防封鎖能力
內核加速✅ Linux 內核❌ 用戶態❌ 用戶態
代碼量~4,000 行~2,000 行~100,000+ 行

選擇建議

你的需求推薦方案
需要高隱蔽性、防封鎖V2Ray + Reality(參考 3X-UI 教程
需要精細分流、按 App 代理V2Ray + Clash(參考 Clash Nyanpasu 教程
需要全設備無感翻牆WireGuard(本文)
需要路由器級翻牆WireGuard(OpenWrt 部署)
需要簡單快速上手Shadowsocks 或 機場服務
需要兩者兼顧WireGuard + V2Ray 雙部署

VPS 準備

推薦配置

WireGuard 對 VPS 配置要求較低,因為它運行在內核態,開銷極小:

配置項最低要求推薦配置說明
CPU1 核1-2 核WireGuard 幾乎不佔 CPU
內存256MB512MB-1GB內核模塊幾乎不佔內存
帶寬100Mbps500Mbps+WireGuard 可跑滿帶寬
流量500GB/月1TB+/月全流量 VPN 消耗流量較大
系統Linux 5.6+Ubuntu 22.04/24.04內核 5.6+ 原生支持 WireGuard
架構x86_64 / ARM64均可樹莓派/Oracle ARM 也支持

注意:Oracle Cloud 免費 ARM 實例(4 核 24GB)是搭建 WireGuard 的絕佳選擇,性能過剩且完全免費。參考 Oracle Cloud 註冊教程

VPS 供應商推薦

供應商最低價推薦度說明
Oracle Cloud免費⭐⭐⭐⭐⭐ARM 免費實例,4C24G
RackNerd$10/年⭐⭐⭐⭐性價比高
Vultr$3.5/月⭐⭐⭐⭐全球機房可選
搬瓦工$49.99/年⭐⭐⭐⭐CN2 GIA 線路佳

詳見 2026 VPS 供應商橫向對比

系統初始化

以 Ubuntu 22.04/24.04 為例:

bash
# 更新系統
apt update && apt upgrade -y

# 安裝必要工具
apt install -y curl wget git qrencode iptables

# 檢查內核版本(需 5.6+)
uname -r
# 輸出示例: 6.5.0-1014-oracle (已內置 WireGuard)

# 如果內核低於 5.6,需要安裝 wireguard-dkms
# Ubuntu 20.04:
# apt install -y wireguard wireguard-tools wireguard-dkms

檢查 WireGuard 模塊

bash
# 檢查內核模塊是否已加載
modprobe wireguard && lsmod | grep wireguard
# 輸出: wireguard  114688  0

# 檢查 wg 命令是否可用
wg --version
# 輸出: wireguard-tools v1.0.20210914

服務端配置

一鍵安裝腳本(推薦新手)

使用社區維護的 wireguard-install 腳本,一鍵完成所有配置:

bash
# 下載並運行一鍵腳本
curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh
chmod +x wireguard-install.sh
./wireguard-install.sh

腳本會交互式詢問以下信息:

Welcome to the WireGuard installer!
The repository for the system is ready.

IPv4 or IPv6 public address: <自動檢測>
Public interface: eth0
WireGuard port: 51820 (默認)
First DNS resolver: 1.1.1.1 (可選 8.8.8.8)
Second DNS resolver: 1.0.0.1 (可選 8.8.4.4)

Client name: client1
Client's IPv4: 10.66.66.2 (自動分配)
Client's IPv6: fd42:42:42::2 (自動分配)

腳本完成後會生成客戶端配置文件和二維碼。

手動配置(推薦進階用戶)

手動配置能讓你更好地理解 WireGuard 的工作原理。

步驟一:生成密鑰對

bash
# 創建配置目錄
mkdir -p /etc/wireguard
cd /etc/wireguard

# 生成服務端私鑰和公鑰
wg genkey | tee server_private.key | wg pubkey > server_public.key

# 設置權限(私鑰必須僅 root 可讀)
chmod 600 server_private.key

# 查看密鑰
echo "Server Private Key: $(cat server_private.key)"
echo "Server Public Key: $(cat server_public.key)"

# 為第一個客戶端生成密鑰
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
chmod 600 client1_private.key

步驟二:創建服務端配置文件

bash
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
# 服務端私鑰
PrivateKey = $(cat server_private.key)
# 監聽端口
Address = 10.66.66.1/24
ListenPort = 51820
# DNS(可選,使用 Pi-hole 或 AdGuard 可設置)
# DNS = 10.66.66.1

# IP 轉發 NAT 規則(將 VPN 流量轉發到公網)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# --- 客戶端 Peer 配置 ---

# Client 1
[Peer]
PublicKey = $(cat client1_public.key)
AllowedIPs = 10.66.66.2/32
EOF

注意eth0 是 VPS 的公網網卡名。如果不確定,運行 ip addr 查看。Oracle Cloud 通常是 ens3enp0s3

步驟三:開啟 IP 轉發

bash
# 臨時開啟
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1

# 永久開啟
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
EOF

# 應用
sysctl -p

步驟四:防火牆配置

bash
# UFW 放行 WireGuard 端口
ufw allow 51820/udp

# 確保 VPN 內網流量可轉發
ufw route allow in on wg0 out on eth0

# 重載防火牆
ufw reload

# 如果使用 iptables(無 UFW)
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
iptables -A FORWARD -i wg0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 保存規則
apt install -y iptables-persistent
netfilter-persistent save

Oracle Cloud 注意:Oracle Cloud 有額外的安全列表(Security List)和網絡安全組(NSG),需要在 Oracle Cloud 控制檯的 VCN 設置中放行 UDP 51820 端口。

步驟五:啟動 WireGuard

bash
# 啟動 WireGuard 接口
wg-quick up wg0

# 設置開機自啟
systemctl enable wg-quick@wg0

# 查看狀態
wg show

wg show 輸出示例:

interface: wg0
  public key: <server_public_key>
  private key: (hidden)
  listening port: 51820

peer: <client1_public_key>
  endpoint: <client_ip>:<port>
  allowed ips: 10.66.66.2/32
  latest handshake: 1 minute ago
  transfer: 1.23 GiB received, 456.78 MiB sent

客戶端配置

通用客戶端配置文件

為客戶端生成配置文件:

bash
cat > /etc/wireguard/client1.conf << EOF
[Interface]
PrivateKey = $(cat client1_private.key)
Address = 10.66.66.2/24
DNS = 1.1.1.1, 1.0.0.1

[Peer]
PublicKey = $(cat server_public.key)
Endpoint = <SERVER_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

關鍵字段說明

字段說明
Address客戶端在 VPN 內網的 IP
DNS客戶端使用的 DNS 服務器
PublicKey服務端的公鑰
Endpoint服務端公網 IP 和端口
AllowedIPs = 0.0.0.0/0全流量走 VPN(關鍵設置)
PersistentKeepalive = 25每 25 秒發送心跳保持連接

分流模式:如果只想特定 IP 段走 VPN,將 AllowedIPs 改為具體網段,如 AllowedIPs = 10.66.66.0/24, 192.168.1.0/24

Windows 客戶端

  1. 下載:從 wireguard.com/install 下載 Windows 客戶端
  2. 導入配置:點擊「Import tunnel(s) from file」→ 選擇 client1.conf 文件
  3. 連接:點擊「Activate」激活隧道
  4. 驗證:打開瀏覽器訪問 ip.sb,確認 IP 已變更為 VPS IP

macOS 客戶端

方式一:App Store 客戶端

  1. 在 Mac App Store 搜索 "WireGuard" 並安裝
  2. 打開 App → 「Import Tunnel(s) from File」→ 選擇 client1.conf
  3. 點擊開關激活

方式二:Homebrew

bash
brew install wireguard-tools

# 將配置文件複製到 /etc/wireguard/
sudo cp client1.conf /etc/wireguard/wg0.conf

# 啟動
sudo wg-quick up wg0

# 停止
sudo wg-quick down wg0

iOS 客戶端

  1. 在 App Store 搜索 "WireGuard" 安裝
  2. client1.conf 文件通過 AirDrop 發送到 iPhone
  3. 在 WireGuard App 中「Import tunnel(s) from file」
  4. 或掃描二維碼:在 VPS 上運行 qrencode -t ansiutf8 /etc/wireguard/client1.conf

Android 客戶端

  1. 在 Google Play 或 F-Droid 搜索 "WireGuard" 安裝
  2. 點擊「+」→ 「Import from file or archive」→ 選擇 client1.conf
  3. 或掃描二維碼:在 VPS 上運行 qrencode -t ansiutf8 /etc/wireguard/client1.conf

Linux 客戶端

bash
# 安裝
apt install -y wireguard-tools

# 複製配置
sudo cp client1.conf /etc/wireguard/wg0.conf

# 啟動
sudo wg-quick up wg0

# 開機自啟
sudo systemctl enable wg-quick@wg0

# 查看狀態
wg show

OpenWrt 路由器(全家庭翻牆)

在 OpenWrt 路由器上部署 WireGuard,實現全家設備自動翻牆:

bash
# 安裝 WireGuard 包
opkg update
opkg install wireguard-tools kmod-wireguard luci-proto-wireguard

# 配置接口
uci set network.wg0=interface
uci set network.wg0.proto='wireguard'
uci set network.wg0.private_key='<client_private_key>'
uci set network.wg0.addresses='10.66.66.2/24'

# 配置 Peer
uci add network wireguard_wg0
uci set network.@wireguard_wg0[0].public_key='<server_public_key>'
uci set network.@wireguard_wg0[0].endpoint_host='<SERVER_IP>'
uci set network.@wireguard_wg0[0].endpoint_port='51820'
uci set network.@wireguard_wg0[0].allowed_ips='0.0.0.0/0'
uci set network.@wireguard_wg0[0].persistent_keepalive='25'

# 應用配置
uci commit network
/etc/init.d/network reload

多用戶管理

添加新用戶

bash
cd /etc/wireguard

# 生成新用戶密鑰
wg genkey | tee client2_private.key | wg pubkey > client2_public.key
chmod 600 client2_private.key

# 生成客戶端配置文件
cat > client2.conf << EOF
[Interface]
PrivateKey = $(cat client2_private.key)
Address = 10.66.66.3/24
DNS = 1.1.1.1, 1.0.0.1

[Peer]
PublicKey = $(cat server_public.key)
Endpoint = <SERVER_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

# 將新 Peer 添加到服務端配置
cat >> /etc/wireguard/wg0.conf << EOF

# Client 2
[Peer]
PublicKey = $(cat client2_public.key)
AllowedIPs = 10.66.66.3/32
EOF

# 重啟 WireGuard 應用新配置
wg-quick down wg0 && wg-quick up wg0

# 生成二維碼
qrencode -t ansiutf8 client2.conf

IP 分配規則

客戶端VPN IP說明
服務端10.66.66.1網關地址
Client 110.66.66.2第一個用戶
Client 210.66.66.3第二個用戶
Client N10.66.66.N+1依次遞增

流量監控

bash
# 查看所有 Peer 的流量統計
wg show

# 只看某個 Peer
wg show peer <public_key>

# 實時流量監控(每 2 秒刷新)
watch -n 2 wg show

# 按 JSON 格式輸出(便於腳本處理)
wg show wg0 dump

輸出中的 transfer 字段顯示每個 Peer 的接收和發送流量:

peer: <client1_public_key>
  endpoint: <ip>:<port>
  allowed ips: 10.66.66.2/32
  latest handshake: 2 minutes ago
  transfer: 1.23 GiB received, 456.78 MiB sent

批量用戶管理腳本

bash
#!/bin/bash
# /etc/wireguard/add-user.sh
# 用法: ./add-user.sh <username>

USERNAME=$1
IP_BASE=10.66.66
# 查找下一個可用 IP
LAST_IP=$(grep "AllowedIPs" /etc/wireguard/wg0.conf | awk -F'[./]' '{print $5}' | sort -n | tail -1)
NEXT_IP=$((LAST_IP + 1))

cd /etc/wireguard

# 生成密鑰
wg genkey | tee ${USERNAME}_private.key | wg pubkey > ${USERNAME}_public.key
chmod 600 ${USERNAME}_private.key

# 生成客戶端配置
cat > ${USERNAME}.conf << EOF
[Interface]
PrivateKey = $(cat ${USERNAME}_private.key)
Address = ${IP_BASE}.${NEXT_IP}/24
DNS = 1.1.1.1, 1.0.0.1

[Peer]
PublicKey = $(cat server_public.key)
Endpoint = $(curl -s ifconfig.me):51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

# 添加到服務端配置
cat >> /etc/wireguard/wg0.conf << EOF

# ${USERNAME}
[Peer]
PublicKey = $(cat ${USERNAME}_public.key)
AllowedIPs = ${IP_BASE}.${NEXT_IP}/32
EOF

# 重啟
wg-quick down wg0 && wg-quick up wg0

echo "用戶 ${USERNAME} 創建成功!"
echo "配置文件: /etc/wireguard/${USERNAME}.conf"
echo "VPN IP: ${IP_BASE}.${NEXT_IP}"
echo ""
echo "二維碼:"
qrencode -t ansiutf8 ${USERNAME}.conf

刪除用戶

bash
# 從服務端配置中刪除對應的 [Peer] 段
# 手動編輯 /etc/wireguard/wg0.conf 刪除該用戶的段落

# 或使用 wg 命令動態刪除(不需要重啟)
wg set wg0 peer <client_public_key> remove

# 保存到配置文件
wg-quick save wg0

# 清理密鑰文件
rm -f /etc/wireguard/client1_private.key /etc/wireguard/client1_public.key /etc/wireguard/client1.conf

性能優化

MTU 調整

MTU(最大傳輸單元)是 WireGuard 性能優化的關鍵參數。默認值 1420 在部分網絡環境下會導致分包,降低性能。

bash
# 測試最佳 MTU
# 在 VPS 上執行(假設 VPS 公網 MTU 為 1500)
ping -M do -s 1392 <client_ip>
# 如果能通,逐步增大直到不通,最佳值 = 最大通值 + 28

# 常見 MTU 推薦:
# - 以太網: 1420(默認)
# - PPPoE: 1412
# - Cloudflare WARP: 1280
# - 移動網絡: 1280

在配置文件中設置 MTU:

ini
[Interface]
PrivateKey = ...
Address = 10.66.66.1/24
ListenPort = 51820
MTU = 1420  # 添加此行

內核參數優化

bash
cat >> /etc/sysctl.conf << EOF

# WireGuard 性能優化
# 增大網絡緩衝區
net.core.rmem_max = 7500000
net.core.wmem_max = 7500000
net.core.rmem_default = 7500000
net.core.wmem_default = 7500000

# 啟用 BBR 擁塞控制
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# 增大 UDP 緩衝區
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
EOF

sysctl -p

UDP 加速

WireGuard 使用 UDP 傳輸,部分 ISP 會對 UDP 進行 QoS 限速。以下是緩解方案:

方案一:更換端口

bash
# 嘗試使用 53、80、443 等常見端口
# 修改 wg0.conf
ListenPort = 53

# 注意:需要 root 權限綁定 1024 以下端口

方案二:UDP over TCP

如果 ISP 完全封鎖 UDP,可以使用 udp2raw 將 WireGuard 的 UDP 流量偽裝為 TCP:

bash
# 安裝 udp2raw
wget https://github.com/wangyu-/udp2raw-tunnel/releases/latest/download/udp2raw_binaries.tar.gz
tar xzf udp2raw_binaries.tar.gz

# 服務端(VPS)
./udp2raw -s -l 0.0.0.0:4096 -r 127.0.0.1:51820 --raw-mode faketcp -a -k "your_password"

# 客戶端
./udp2raw -c -l 127.0.0.1:51820 -r <SERVER_IP>:4096 --raw-mode faketcp -a -k "your_password"

# 然後客戶端 WireGuard 連接到 127.0.0.1:51820

方案三:Phantun

Phantun 是 udp2raw 的輕量替代:

bash
# 服務端
phantun_server --local 51820 --listen 4567

# 客戶端
phantun_client --local 51820 --remote <SERVER_IP>:4567

Cloudflare WARP 中轉

什麼是 Cloudflare WARP

Cloudflare WARP 是 Cloudflare 提供的免費 VPN 服務,基於 WireGuard 協議。可以將 WARP 作為 WireGuard 鏈式代理的出口,實現:

  1. 隱藏 VPS 真實 IP:流量先到你的 VPS,再通過 WARP 出去
  2. 解鎖 Netflix 等流媒體:WARP 出口 IP 是 Cloudflare 的住宅 IP
  3. 防止 VPS IP 被封:即使 WARP IP 被封也不影響 VPS

在 VPS 上配置 WARP

bash
# 安裝 Cloudflare WARP 客戶端
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ jammy main" | tee /etc/apt/sources.list.d/cloudflare-client.list
apt update && apt install -y cloudflare-warp

# 註冊
warp-cli registration new

# 設置代理模式(僅代理特定流量)
warp-cli mode proxy

# 連接
warp-cli connect

# 驗證
curl --proxy socks5h://127.0.0.1:40000 https://cloudflare.com/cdn-cgi/trace/
# warp=on 表示 WARP 已生效

WireGuard + WARP 鏈式配置

修改 WireGuard 服務端配置,將流量通過 WARP 代理出去:

bash
# 修改 wg0.conf 的 PostUp/PostDown
# 將原本的 MASQUERADE 改為通過 WARP SOCKS5 代理

# 安裝 redsocks 實現透明代理
apt install -y redsocks

# 配置 redsocks
cat > /etc/redsocks.conf << EOF
base {
  log_debug = off;
  log_info = on;
  log = "syslog:daemon";
  daemon = on;
  user = redsocks;
  group = redsocks;
  redirector = iptables;
}

redsocks {
  local_ip = 127.0.0.1;
  local_port = 12345;
  ip = 127.0.0.1;
  port = 40000;
  type = socks5;
}
EOF

# 啟動 redsocks
systemctl restart redsocks
systemctl enable redsocks

簡化方案:WARP WireGuard 配置

更簡單的方式是直接獲取 WARP 的 WireGuard 配置,作為額外 Peer 添加:

bash
# 使用 wgcf 工具獲取 WARP 配置
wget https://github.com/ViRb3/wgcf/releases/latest/download/wgcf_2.2.0_linux_amd64 -O /usr/local/bin/wgcf
chmod +x /usr/local/bin/wgcf

# 註冊 WARP 賬戶
wgcf register --accept-tos

# 生成 WireGuard 配置
wgcf generate

# 會生成 wgcf-profile.conf,其中包含 WARP 的 Peer 信息
# 將其作為額外 Peer 添加到你的 wg0.conf 中

全設備翻牆與分流

全局代理模式

默認配置 AllowedIPs = 0.0.0.0/0, ::/0 表示所有流量走 VPN。這是最簡單的全設備翻牆模式。

分流模式

如果只想讓特定流量走 VPN,其餘走本地網絡:

方式一:AllowedIPs 精確控制

ini
[Peer]
PublicKey = <server_public_key>
Endpoint = <SERVER_IP>:51820
# 僅代理這些 IP 段
AllowedIPs = 10.66.66.0/24, 8.8.8.8/32, 1.1.1.1/32
PersistentKeepalive = 25

方式二:使用 Policy-Based Routing

在服務端配置基於源 IP 的路由策略:

bash
# 為特定客戶端創建單獨的路由表
echo "100 wireguard" >> /etc/iproute2/rt_tables

# 在 wg0.conf 中添加
PostUp = ip rule add from 10.66.66.2 table wireguard
PostUp = ip route add default via <WARP_GATEWAY> table wireguard
PostDown = ip rule del from 10.66.66.2 table wireguard
PostDown = ip route del default via <WARP_GATEWAY> table wireguard

方式三:客戶端使用 Split Tunneling

在 Windows/macOS 客戶端中設置:

  • WireGuard App → Edit Tunnel → 修改 AllowedIPs
  • 僅填寫需要走 VPN 的目標 IP 段
  • 其餘流量自動走本地網絡

DNS 配置

ini
[Interface]
PrivateKey = ...
Address = 10.66.66.2/24
# 使用自定義 DNS
DNS = 10.66.66.1  # 如果服務端運行了 Pi-hole/AdGuard
# 或使用公共 DNS
DNS = 1.1.1.1, 8.8.8.8

安全加固

密鑰管理

bash
# 定期輪換密鑰(建議每 6 個月)
# 生成新密鑰
wg genkey | tee new_server_private.key | wg pubkey > new_server_public.key

# 更新配置文件
sed -i "s/PrivateKey = .*/PrivateKey = $(cat new_server_private.key)/" /etc/wireguard/wg0.conf

# 重啟
wg-quick down wg0 && wg-quick up wg0

# 所有客戶端也需要更新 PublicKey

端口隨機化

bash
# 使用隨機高端口而非默認 51820
# 修改 wg0.conf
ListenPort = 47821  # 隨機端口

# 防火牆同步更新
ufw allow 47821/udp

限制 Peer 數量

bash
# 在 wg0.conf 中限制最大 Peer 數
# 通過 iptables 限制併發連接
iptables -A INPUT -p udp --dport 51820 -m connlimit --connlimit-above 10 -j DROP

日誌與監控

bash
# 啟用 WireGuard 日誌(需要 debug 模塊)
modprobe wireguard debug

# 查看內核日誌
dmesg | grep wireguard

# 使用 Prometheus 監控(可選)
# 安裝 wireguard_exporter
wget https://github.com/MindFlavor/prometheus_wireguard_exporter/releases/latest/download/prometheus_wireguard_exporter
./prometheus_wireguard_exporter
# 訪問 http://localhost:9586/metrics

常見問題

Q1: 連接後無法上網,但握手成功

這是最常見的問題,通常是 IP 轉發或 NAT 規則未正確配置:

bash
# 1. 檢查 IP 轉發是否開啟
sysctl net.ipv4.ip_forward
# 應輸出: net.ipv4.ip_forward = 1

# 2. 檢查 iptables NAT 規則
iptables -t nat -L POSTROUTING
# 應包含 MASQUERADE 規則

# 3. 檢查網卡的名稱是否正確
ip addr
# 確認 PostUp/PostDown 中的 eth0 與實際網卡名一致

# 4. 檢查防火牆是否放行
ufw status
# 確認 51820/udp 已放行
Q2: 握手失敗,無法連接
bash
# 1. 檢查服務端是否在運行
wg show
# 應顯示 listening port: 51820

# 2. 檢查端口是否放行
# VPS 控制檯安全組 / UFW / iptables
ufw status
# Oracle Cloud 需要檢查 VCN Security List

# 3. 檢查公鑰是否正確
# 客戶端的 [Peer] PublicKey 應與服務端 [Interface] PrivateKey 對應
# 服務端的 [Peer] PublicKey 應與客戶端 [Interface] PrivateKey 對應

# 4. 檢查 Endpoint 地址
# 客戶端配置中的 Endpoint 應為 VPS 的公網 IP

# 5. 測試端口連通性
nc -vu <SERVER_IP> 51820
Q3: 速度很慢,無法跑滿帶寬
bash
# 1. 調整 MTU
# 編輯 wg0.conf 添加 MTU = 1280(保守值)或 1420(默認)

# 2. 開啟 BBR 擁塞控制
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
sysctl -p

# 3. 增大網絡緩衝區
echo "net.core.rmem_max = 7500000" >> /etc/sysctl.conf
echo "net.core.wmem_max = 7500000" >> /etc/sysctl.conf
sysctl -p

# 4. 檢查是否被 ISP QoS 限速
# 嘗試更換端口(53/80/443)
# 或使用 udp2raw 偽裝為 TCP

# 5. 檢查 VPS 帶寬限制
# 部分廉價 VPS 限速嚴重
Q4: UDP 被 ISP 限速/封鎖怎麼辦?

部分中國 ISP 會對 UDP 流量進行 QoS 限速,尤其是在晚高峰時段。解決方案:

  1. 更換端口:嘗試使用 53(DNS)、123(NTP)、443(HTTPS)等常見端口
  2. udp2raw 偽裝:將 UDP 流量偽裝為 TCP,繞過 UDP QoS(見上文 UDP 加速章節)
  3. Phantun:輕量級 UDP-to-TCP 偽裝工具
  4. 雙協議部署:同時部署 WireGuard(日常使用)和 V2Ray+Reality(備用),參考 3X-UI 教程
Q5: 切換 WiFi/4G 後斷連

WireGuard 設計為無狀態協議,理論上切換網絡後應自動恢復。如果斷連:

  1. 確認 PersistentKeepalive:客戶端配置中 PersistentKeepalive = 25 是關鍵
  2. 重啟客戶端:手動關閉再打開 WireGuard 連接
  3. 檢查 MTU:移動網絡下 MTU 可能需要降低到 1280
  4. iOS 後臺限制:iOS 可能在後臺殺掉 WireGuard 進程,需在設置中允許後臺運行
Q6: WireGuard 會洩露真實 IP 嗎?

WireGuard 本身設計安全,但需要注意:

  1. DNS 洩露:如果 DNS 查詢走本地而非 VPN 隧道,會洩露訪問的域名。在配置中設置 DNS = 1.1.1.1 確保 DNS 走隧道
  2. IPv6 洩露:如果客戶端有 IPv6 但 VPN 僅隧道 IPv4,IPv6 流量可能直連。設置 AllowedIPs = 0.0.0.0/0, ::/0 同時覆蓋 IPv6
  3. Kill Switch:WireGuard 斷連後流量可能直連。在客戶端設置防火牆規則阻斷非 VPN 流量
  4. WebRTC 洩露:瀏覽器 WebRTC 可能洩露本地 IP。使用瀏覽器插件禁用 WebRTC
Q7: 如何查看誰在用我的 VPN?
bash
# 查看所有已連接的 Peer
wg show

# 關注 latest handshake 字段
# 如果顯示 "X seconds/minutes ago",說明該 Peer 最近有活躍連接
# 如果顯示 "(none)",說明該 Peer 未連接

# 實時監控
watch -n 5 wg show

# 導出流量統計
wg show wg0 dump | awk '{print $1, $5}'

可以配合日誌腳本,在 Peer 連接/斷開時發送通知:

bash
# 簡單監控腳本
while true; do
    wg show wg0 latest-handshakes | while read pubkey ts; do
        if [ $ts -gt 0 ]; then
            echo "$(date): Peer $pubkey active" >> /var/log/wireguard-monitor.log
        fi
    done
    sleep 60
done
Q8: WireGuard 和 Tailscale 有什麼區別?

Tailscale 是基於 WireGuard 的商業 VPN 服務,做了大量封裝:

對比WireGuardTailscale
類型開源協議商業產品(基於 WireGuard)
配置手動管理密鑰和配置一鍵安裝,自動密鑰管理
NAT 穿透需要公網 IP 或端口轉發自動 NAT 穿透(DERP 服務器)
ACL基於 IP 的防火牆規則基於用戶/設備的 ACL 策略
費用免費免費(個人 100 設備)/ 付費(團隊)
控制權完全自主依賴 Tailscale 協調服務器
適用場景需要完全控制的自建用戶快速組建團隊 VPN

如果你不想自己管理 VPS 和密鑰,Tailscale 是更好的選擇。如果需要完全控制流量走向,自建 WireGuard 更靈活。


總結與推薦

WireGuard 自建 VPN Checklist

✅ VPS 已購買並完成安全加固
✅ 內核版本 ≥ 5.6(WireGuard 已內置)
✅ 服務端 wg0.conf 配置完成
✅ IP 轉發已開啟
✅ 防火牆已放行 UDP 端口
✅ 客戶端配置文件已生成
✅ 全平臺客戶端已連接並驗證
✅ MTU 已優化
✅ BBR 已開啟
✅ 多用戶管理腳本已就緒

推薦部署方案

方案適合人群優點缺點
純 WireGuard技術愛好者,全設備翻牆需求性能最佳,全設備覆蓋隱蔽性低,可能被 QoS
WireGuard + udp2rawISP 限制 UDP 的用戶繞過 UDP QoS配置複雜
WireGuard + WARP需要解鎖流媒體隱藏 VPS IP,住宅出口速度略有損耗
WireGuard + V2Ray 雙部署需要兼顧隱蔽性和全設備雙保險,互為備份需要維護兩套系統

與其他自建方案的關係

WireGuard 和 V2Ray/3X-UI 不是互斥的——它們解決不同問題:

  • V2Ray/3X-UI:精細化代理控制,高隱蔽性,適合日常科學上網 → 參考 3X-UI 教程
  • WireGuard:全設備無感翻牆,高性能,適合路由器/Apple TV 等設備 → 本文
  • 機場服務:零配置,即買即用 → 參考 機場推薦

最佳實踐是 雙部署:VPS 上同時運行 3X-UI(日常代理)和 WireGuard(全設備翻牆),互為補充。


延伸閱讀



延伸阅读

免责声明

本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。

最後更新於: