WireGuard 自建 VPN 完整教程 2026:從零搭建高性能全設備翻牆
當提到自建科學上網方案時,大多數人首先想到的是 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 協議有本質區別:
| 特性 | WireGuard | OpenVPN | IPSec |
|---|---|---|---|
| 架構 | 無狀態 UDP | 有狀態 TLS | 有狀態 IKE |
| 代碼量 | ~4,000 行 | ~100,000 行 | ~400,000 行 |
| 加密 | ChaCha20+Poly1305 | AES-256-CBC | AES-256-GCM |
| 密鑰交換 | Curve25519 | RSA/DH | DH/RSA |
| 運行層級 | 內核態(Linux) | 用戶態 | 內核態 |
| 握手 | 1-RTT | 多輪握手 | 多輪握手 |
| 漫遊 | 自動 IP 漫遊 | 需要重連 | 需要重連 |
WireGuard 的核心概念是 Peer(對等節點)。每個 Peer 擁有一對公私鑰,雙方通過交換公鑰建立加密通道。WireGuard 沒有傳統 VPN 的「客戶端-服務端」概念——每個節點都是對等的,只是配置時通常將 VPS 作為中轉節點。
與 V2Ray/Shadowsocks 的本質區別
| 維度 | WireGuard | V2Ray/Shadowsocks |
|---|---|---|
| 工作層級 | 網絡層(Layer 3) | 應用層代理(SOCKS5/HTTP) |
| 流量類型 | 全部流量(TCP+UDP+ICMP) | 僅代理指定流量 |
| 運行方式 | 虛擬網卡(tun 設備) | 應用層監聽端口 |
| DNS | 強制走 VPN 隧道 | 可配置 DNS 但非強制 |
| 設備覆蓋 | 系統級全流量 | 需要逐應用配置代理 |
| 隱蔽性 | 較低(特徵明顯的 UDP 流量) | 較高(可偽裝為 HTTPS) |
| 適用場景 | 全設備無感翻牆 | 精細化代理控制 |
簡單理解:V2Ray/Shadowsocks 是「選擇性代理」——你指定哪些 App 走代理;WireGuard 是「全部代理」——連上之後所有流量都走 VPN 隧道。
適用場景
WireGuard 特別適合以下場景:
- 全設備翻牆:需要路由器/Apple TV 等設備全局翻牆,而非逐設備配置
- 遠程辦公:連接公司內網或訪問受地理限制的服務
- 家庭網絡:在 OpenWrt 路由器上部署,全家設備自動翻牆
- 高帶寬需求:WireGuard 性能遠超用戶態協議,適合 4K 流媒體
- 多設備互聯:組建跨地域局域網(如 Tailscale/Netmaker 方案)
不適用場景
- 需要高隱蔽性:WireGuard 的 UDP 流量特徵明顯,容易被 DPI 識別和 QoS
- 需要精細分流:WireGuard 默認全流量走隧道,分流需要額外配置
- 需要 CDN 中轉:WireGuard 是 UDP 協議,無法通過 Cloudflare CDN 中轉
WireGuard vs Shadowsocks vs V2Ray 對比
| 對比維度 | WireGuard | Shadowsocks | V2Ray (VMess/VLESS) |
|---|---|---|---|
| 協議類型 | VPN (Layer 3) | 代理 (SOCKS5) | 代理 (SOCKS5/HTTP) |
| 加密方式 | ChaCha20-Poly1305 | AEAD (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 配置要求較低,因為它運行在內核態,開銷極小:
| 配置項 | 最低要求 | 推薦配置 | 說明 |
|---|---|---|---|
| CPU | 1 核 | 1-2 核 | WireGuard 幾乎不佔 CPU |
| 內存 | 256MB | 512MB-1GB | 內核模塊幾乎不佔內存 |
| 帶寬 | 100Mbps | 500Mbps+ | 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 為例:
# 更新系統
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 模塊
# 檢查內核模塊是否已加載
modprobe wireguard && lsmod | grep wireguard
# 輸出: wireguard 114688 0
# 檢查 wg 命令是否可用
wg --version
# 輸出: wireguard-tools v1.0.20210914服務端配置
一鍵安裝腳本(推薦新手)
使用社區維護的 wireguard-install 腳本,一鍵完成所有配置:
# 下載並運行一鍵腳本
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 的工作原理。
步驟一:生成密鑰對
# 創建配置目錄
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步驟二:創建服務端配置文件
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 通常是ens3或enp0s3。
步驟三:開啟 IP 轉發
# 臨時開啟
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步驟四:防火牆配置
# 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 saveOracle Cloud 注意:Oracle Cloud 有額外的安全列表(Security List)和網絡安全組(NSG),需要在 Oracle Cloud 控制檯的 VCN 設置中放行 UDP 51820 端口。
步驟五:啟動 WireGuard
# 啟動 WireGuard 接口
wg-quick up wg0
# 設置開機自啟
systemctl enable wg-quick@wg0
# 查看狀態
wg showwg 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客戶端配置
通用客戶端配置文件
為客戶端生成配置文件:
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 客戶端
- 下載:從 wireguard.com/install 下載 Windows 客戶端
- 導入配置:點擊「Import tunnel(s) from file」→ 選擇
client1.conf文件 - 連接:點擊「Activate」激活隧道
- 驗證:打開瀏覽器訪問 ip.sb,確認 IP 已變更為 VPS IP
macOS 客戶端
方式一:App Store 客戶端
- 在 Mac App Store 搜索 "WireGuard" 並安裝
- 打開 App → 「Import Tunnel(s) from File」→ 選擇
client1.conf - 點擊開關激活
方式二:Homebrew
brew install wireguard-tools
# 將配置文件複製到 /etc/wireguard/
sudo cp client1.conf /etc/wireguard/wg0.conf
# 啟動
sudo wg-quick up wg0
# 停止
sudo wg-quick down wg0iOS 客戶端
- 在 App Store 搜索 "WireGuard" 安裝
- 將
client1.conf文件通過 AirDrop 發送到 iPhone - 在 WireGuard App 中「Import tunnel(s) from file」
- 或掃描二維碼:在 VPS 上運行
qrencode -t ansiutf8 /etc/wireguard/client1.conf
Android 客戶端
- 在 Google Play 或 F-Droid 搜索 "WireGuard" 安裝
- 點擊「+」→ 「Import from file or archive」→ 選擇
client1.conf - 或掃描二維碼:在 VPS 上運行
qrencode -t ansiutf8 /etc/wireguard/client1.conf
Linux 客戶端
# 安裝
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 showOpenWrt 路由器(全家庭翻牆)
在 OpenWrt 路由器上部署 WireGuard,實現全家設備自動翻牆:
# 安裝 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多用戶管理
添加新用戶
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.confIP 分配規則
| 客戶端 | VPN IP | 說明 |
|---|---|---|
| 服務端 | 10.66.66.1 | 網關地址 |
| Client 1 | 10.66.66.2 | 第一個用戶 |
| Client 2 | 10.66.66.3 | 第二個用戶 |
| Client N | 10.66.66.N+1 | 依次遞增 |
流量監控
# 查看所有 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批量用戶管理腳本
#!/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刪除用戶
# 從服務端配置中刪除對應的 [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 在部分網絡環境下會導致分包,降低性能。
# 測試最佳 MTU
# 在 VPS 上執行(假設 VPS 公網 MTU 為 1500)
ping -M do -s 1392 <client_ip>
# 如果能通,逐步增大直到不通,最佳值 = 最大通值 + 28
# 常見 MTU 推薦:
# - 以太網: 1420(默認)
# - PPPoE: 1412
# - Cloudflare WARP: 1280
# - 移動網絡: 1280在配置文件中設置 MTU:
[Interface]
PrivateKey = ...
Address = 10.66.66.1/24
ListenPort = 51820
MTU = 1420 # 添加此行內核參數優化
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 -pUDP 加速
WireGuard 使用 UDP 傳輸,部分 ISP 會對 UDP 進行 QoS 限速。以下是緩解方案:
方案一:更換端口
# 嘗試使用 53、80、443 等常見端口
# 修改 wg0.conf
ListenPort = 53
# 注意:需要 root 權限綁定 1024 以下端口方案二:UDP over TCP
如果 ISP 完全封鎖 UDP,可以使用 udp2raw 將 WireGuard 的 UDP 流量偽裝為 TCP:
# 安裝 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 的輕量替代:
# 服務端
phantun_server --local 51820 --listen 4567
# 客戶端
phantun_client --local 51820 --remote <SERVER_IP>:4567Cloudflare WARP 中轉
什麼是 Cloudflare WARP
Cloudflare WARP 是 Cloudflare 提供的免費 VPN 服務,基於 WireGuard 協議。可以將 WARP 作為 WireGuard 鏈式代理的出口,實現:
- 隱藏 VPS 真實 IP:流量先到你的 VPS,再通過 WARP 出去
- 解鎖 Netflix 等流媒體:WARP 出口 IP 是 Cloudflare 的住宅 IP
- 防止 VPS IP 被封:即使 WARP IP 被封也不影響 VPS
在 VPS 上配置 WARP
# 安裝 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 代理出去:
# 修改 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 添加:
# 使用 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 精確控制
[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 的路由策略:
# 為特定客戶端創建單獨的路由表
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 配置
[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安全加固
密鑰管理
# 定期輪換密鑰(建議每 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端口隨機化
# 使用隨機高端口而非默認 51820
# 修改 wg0.conf
ListenPort = 47821 # 隨機端口
# 防火牆同步更新
ufw allow 47821/udp限制 Peer 數量
# 在 wg0.conf 中限制最大 Peer 數
# 通過 iptables 限制併發連接
iptables -A INPUT -p udp --dport 51820 -m connlimit --connlimit-above 10 -j DROP日誌與監控
# 啟用 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 規則未正確配置:
# 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: 握手失敗,無法連接
# 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> 51820Q3: 速度很慢,無法跑滿帶寬
# 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 限速,尤其是在晚高峰時段。解決方案:
- 更換端口:嘗試使用 53(DNS)、123(NTP)、443(HTTPS)等常見端口
- udp2raw 偽裝:將 UDP 流量偽裝為 TCP,繞過 UDP QoS(見上文 UDP 加速章節)
- Phantun:輕量級 UDP-to-TCP 偽裝工具
- 雙協議部署:同時部署 WireGuard(日常使用)和 V2Ray+Reality(備用),參考 3X-UI 教程
Q5: 切換 WiFi/4G 後斷連
WireGuard 設計為無狀態協議,理論上切換網絡後應自動恢復。如果斷連:
- 確認 PersistentKeepalive:客戶端配置中
PersistentKeepalive = 25是關鍵 - 重啟客戶端:手動關閉再打開 WireGuard 連接
- 檢查 MTU:移動網絡下 MTU 可能需要降低到 1280
- iOS 後臺限制:iOS 可能在後臺殺掉 WireGuard 進程,需在設置中允許後臺運行
Q6: WireGuard 會洩露真實 IP 嗎?
WireGuard 本身設計安全,但需要注意:
- DNS 洩露:如果 DNS 查詢走本地而非 VPN 隧道,會洩露訪問的域名。在配置中設置
DNS = 1.1.1.1確保 DNS 走隧道 - IPv6 洩露:如果客戶端有 IPv6 但 VPN 僅隧道 IPv4,IPv6 流量可能直連。設置
AllowedIPs = 0.0.0.0/0, ::/0同時覆蓋 IPv6 - Kill Switch:WireGuard 斷連後流量可能直連。在客戶端設置防火牆規則阻斷非 VPN 流量
- WebRTC 洩露:瀏覽器 WebRTC 可能洩露本地 IP。使用瀏覽器插件禁用 WebRTC
Q7: 如何查看誰在用我的 VPN?
# 查看所有已連接的 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 連接/斷開時發送通知:
# 簡單監控腳本
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
doneQ8: WireGuard 和 Tailscale 有什麼區別?
Tailscale 是基於 WireGuard 的商業 VPN 服務,做了大量封裝:
| 對比 | WireGuard | Tailscale |
|---|---|---|
| 類型 | 開源協議 | 商業產品(基於 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 + udp2raw | ISP 限制 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(全設備翻牆),互為補充。
延伸閱讀
- 2026 年科學上網協議深度對比
- 3X-UI 面板自建代理完整教程 2026
- 全平臺科學上網客戶端配置終極指南
- Clash Nyanpasu 使用教程
- 優質機場推薦與選購指南
- 2026 VPS 供應商橫向對比與選購指南
- Oracle Cloud 免費實例註冊教程
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。