- 为什么选 WireGuard?
在现代 VPN 技术栈里,WireGuard 是一个分水岭——它把 VPN 从「配置地狱」拉到了「3 个文件 + 5 条命令」的复杂度。
对比维度 OpenVPN IPsec/IKEv2 WireGuard
代码规模 ~70,000 行 ~400,000 行(StrongSwan+内核) ~4,000 行
加密套件 可协商(容易配错) 可协商 固定 Noise + ChaCha20Poly1305
漫游支持 需重连 需重连 无缝切换(WiFi ↔ 4G)
内核集成 用户态 + tun 内核态 + 用户态 Linux 5.6+ 主线内核
配置难度 证书体系,上手陡峭 更高 类 SSH,公钥交换即配对
WireGuard 的设计哲学是 no knobs——没有加密算法选择、没有协商握手超时参数、没有冗余模式。要么配对成功,要么静默不响应。这种极简设计带来了两个直接结果:
攻击面极小:4,000 行代码,审计工作量是 OpenVPN 的 1/18
性能极高:内核态数据路径,吞吐量通常比 OpenVPN 高 2-3x
WireGuard 不隐藏自己是 VPN——它不做流量混淆。如果你的需求是「翻墙抗审查」,需要用 Xray VLESS + REALITY 这类伪装工具。WireGuard 的正确使用场景是:加密组网、内网穿透、安全接入。
- 三种实际应用场景
场景一:公共 WiFi 加密接入
酒店、机场、咖啡厅的开放 WiFi 是明文数据的重灾区。在本地连上 WireGuard 后,设备 → 你的云服务器之间建立加密隧道,公网段的所有中间节点只能看到 UDP 密文。DNS 查询走你指定的私有 DNS(如 223.5.5.5),杜绝热点方 DNS 劫持。
适用:出差远程办公、登录服务器后台、操作涉敏业务系统。
场景二:内网穿透 / 多地组网
家庭 NAS、公司内网 Git 仓库、Plex 媒体服务器——这些服务放到公网上不安全,但不暴露又没法远程访问。
WireGuard 的方案是:给每台设备分配一个虚拟内网 IP(如 10.0.0.0/24),所有设备通过隧道互通,仿佛连在同一台交换机上。不需要 DDNS、不需要端口映射、不需要担心 FRP 服务商的安全记录。
腾讯云轻量云上海 做中转节点,BGP 多线,覆盖电信联通移动全线路。
场景三:跨境低延迟接入
从国内访问境外游戏服务器、GitHub、Docker Hub 时,公网路由绕行第三国、运营商互联 QoS 限速——延迟高、丢包大。
WireGuard 本身不解决跨境路由问题。但如果搭配专线(如 MKCloud IEPL/IPLC),专线不走 GFW、不绕第三国,到香港端内延迟 < 2ms——此时 WireGuard 负责在专线之上提供加密隧道,做法是「专线提供线路质量,WireGuard 提供端到端加密」。
跨境组网的硬约束
WireGuard 客户端在中国大陆、服务端在境外——这条隧道一定会被 GFW 的 DPI 识别并阻断。WireGuard 协议特征明显(UDP 固定头、握手包长度固定),不做任何混淆。唯一合规的跨境 WireGuard 使用方式,是走专线(IEPL/IPLC),不过 GFW。 普通 BGP 方案的 WireGuard 跨境连接,存活时间通常不超过数小时。
- 实验环境
项目 详情
服务端 腾讯云上海轻量云,2C/2G/40G,BGP 200Mbps
操作系统 Ubuntu 24.04 LTS(内核 6.8+,WireGuard 内置)
虚拟子网 10.0.0.0/24
服务端虚拟 IP 10.0.0.1/24
监听端口 51820/udp
客户端 Windows / macOS / iOS / Android - 第一步:安装 WireGuard
Ubuntu 24.04 内核已内置 WireGuard 模块,只需安装用户态工具:
sudo apt update
sudo apt install wireguard wireguard-tools -y
验证内核支持:
modprobe wireguard && echo "OK" || echo "FAIL"
- 第二步:生成密钥对
WireGuard 的配对逻辑是公钥交换——和 SSH 的公钥认证思维一致。
服务端密钥对
wg genkey | tee /etc/wireguard/server_private_key | wg pubkey > /etc/wireguard/server_public_key
客户端密钥对
wg genkey | tee /etc/wireguard/client_private_key | wg pubkey > /etc/wireguard/client_public_key
每条隧道是两个公钥的绑定关系:服务端持有自己的私钥 + 客户端的公钥,客户端持有自己的私钥 + 服务端的公钥。双方没有证书链、没有 CA、没有信任链概念——就是两个密钥对的直接配对。
- 第三步:服务端配置
创建 /etc/wireguard/wg0.conf:
sudo nano /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <server_private_key>
客户端 1
[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.0.0.2/32
AllowedIPs 的含义
AllowedIPs 不是 IP 白名单,它是 WireGuard 的路由表。对服务端来说,AllowedIPs = 10.0.0.2/32 表示「发往 10.0.0.2 的包走这个 peer 的隧道」。对客户端来说,AllowedIPs = 0.0.0.0/0 表示「所有流量都路由进隧道(全局代理)」,AllowedIPs = 10.0.0.0/24 表示「只有内网流量走隧道(内网穿透模式)」。
- 第四步:开启内核转发 + BBR
sudo nano /etc/sysctl.conf
确保以下配置存在:
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
sudo sysctl -p
- 第五步:防火墙放行
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
Warning
MASQUERADE 是 WireGuard 组网能通的关键。 客户端通过隧道访问服务器后,服务器需要把来自 10.0.0.x 的包伪装成自己的 IP 发出去——否则回程包的路由不通。
如果你的系统没有 firewall-cmd,先参考 Firewalld 端口转发完全指南 安装。如果是腾讯云/阿里云 VPS,记得在控制台安全组里也放行 51820/UDP。
- 第六步:启动服务
sudo chmod 600 /etc/wireguard/*
sudo systemctl enable wg-quick@wg0 --now
sudo systemctl status wg-quick@wg0 --no-pager
查看隧道状态:
wg show
输出示例——latest handshake 和 transfer 是连接状态的直接证据:
interface: wg0
public key: <server_public_key>
private key: (hidden)
listening port: 51820
peer: <client_public_key>
allowed ips: 10.0.0.2/32
latest handshake: 22 seconds ago
transfer: 4.23 MiB received, 18.71 MiB sent
- 第七步:客户端配置
客户端下载
平台 下载
Windows WireGuard Windows 客户端
macOS Mac App Store
iOS App Store
Android Google Play / APK
客户端配置文件 /etc/wireguard/client.conf
两种模式的切换点就在 AllowedIPs:
0.0.0.0/0, ::/0 — VPN 全局代理,所有流量经服务器出去
10.0.0.0/24 — 内网穿透模式,只有内网 IP 段流量走隧道
PersistentKeepalive = 25 针对 NAT 后面的客户端——每 25 秒发一个 keepalive 包,维持 NAT 表项不过期。
快速导入(二维码)
iPhone/Android 扫码更方便:
sudo apt install qrencode -y
qrencode -t ansiutf8 < /etc/wireguard/client.conf
- 第八步:动态添加新客户端
方法一:命令行热添加(不中断服务)
wg genkey | tee /etc/wireguard/new_client_private_key | wg pubkey > /etc/wireguard/new_client_public_key
sudo wg set wg0 peer $(cat /etc/wireguard/new_client_public_key) allowed-ips 10.0.0.3/32
方法二:编辑配置文件
在 /etc/wireguard/wg0.conf 中追加新 [Peer] 块,然后:
sudo systemctl restart wg-quick@wg0
方法二会断开所有现有连接,如果服务正在承载生产流量,选方法一。
- 常用命令速查
动作 命令
启动 sudo systemctl start wg-quick@wg0
停止 sudo systemctl stop wg-quick@wg0
重启 sudo systemctl restart wg-quick@wg0
状态 sudo systemctl status wg-quick@wg0 --no-pager
隧道状态 wg show
日志 sudo journalctl -u wg-quick@wg0 -f - FAQ
Q: 连接后无法上网怎么办?
按顺序检查:
MASQUERADE 开了吗? firewall-cmd --list-all 确认 masquerade: yes
内核转发开了吗? sysctl net.ipv4.ip_forward 必须返回 1
客户端的 Endpoint 能 ping 通吗? 检查云厂商安全组是否放行了 51820/udp
MTU 值对吗? PPPoE 拨号宽带 MTU 通常是 1492,WireGuard 头部占 60 字节,设 MTU = 1420 或 MTU = 1280 可避免分片丢包
Q: WireGuard 和 Tailscale/ZeroTier 怎么选?
三者底层都是 WireGuard 协议。Tailscale 和 ZeroTier 的优势是自动 NAT 穿透 + Web 管理面板——省去了手动配公钥和 config 文件。代价是依赖官方的协调服务器(Coordination Server),并且 Tailscale 免费版限制 100 台设备。
如果你是个人工具链里的几台设备组网,WireGuard 原生部署更可控——不依赖第三方 SaaS。如果团队规模大、设备复杂、穿越多层 NAT,Tailscale 的管理开销更低。本站更推荐 WireGuard 原生——配置完成后几乎零运维,没有第三方依赖。
Q: 跨境 WireGuard 为什么会被阻断?
GFW 的深度包检测(DPI)能识别 WireGuard 的握手包特征:固定的 UDP 端口、固定的 Initiation 包长度(148 字节)、固定的加密套件协商模式。WireGuard 不做混淆是基于设计——它选择了加密强度而非伪装能力。如果需要跨墙通信,参考 Xray VLESS + REALITY 源码编译教程。
评论
暂无评论