WireGuard 极简 VPN 搭建指南:比 Shadowsocks 更优雅的远程组网方案
前两篇写了 SSH 隧道 和 FRP + Shadowsocks 两种内网穿透方案。这篇聊聊 WireGuard,一个 Kernel 级的 VPN 协议,配置比 OpenVPN 简单得多,性能却更好。
如果说 FRP + Shadowsocks 是「端口映射 + 加密代理」,那 WireGuard 就是「直接把外网设备拉进内网」。思路完全不同,但各有适用场景。
三种方案怎么选
| 方案 | 本质 | 优点 | 缺点 | 适合谁 |
|---|---|---|---|---|
| SSH 端口转发 | 单端口隧道 | 零配置、即开即用 | 只能一个端口、不稳定 | 临时救急 |
| FRP + Shadowsocks | 端口映射 + SOCKS5 代理 | 多端口、灵活、可控 | 配置分散、需要维护两套 | 精准控制每个服务 |
| WireGuard | Kernel VPN 组网 | 整网接入、性能最好、配置极简 | 需要内核支持、整网暴露 | 远程办公、多台设备组网 |
简单决策:
- 临时调试用 SSH
- 只想暴露几个端口用 FRP
- 多台设备需要像在内网一样互相访问,用 WireGuard
WireGuard 为什么快
传统 VPN(OpenVPN、IPSec)在用户态和内核态之间来回拷贝数据,还要处理复杂的握手和重连逻辑。WireGuard 直接跑在 Kernel 里,代码量只有 4000 多行(OpenVPN 几十万行),握手协议极简,连接恢复几乎是瞬时的。
实测数据:
- 同样 100M 带宽,WireGuard 能跑满,OpenVPN 大概 60-70M
- 手机切换 WiFi/4G 时,WireGuard 重连几乎没有感知
- 树莓派这种弱鸡设备也能轻松转发几百兆
环境准备
你需要:
- 一台有公网 IP 的服务器(作为 VPN 网关)
- 内网机器(家里或公司,想被远程访问的)
- 外网设备(手机、笔记本,想接入内网的)
本文示例:
- 公网服务器
vps.yolonote.cc(Ubuntu 22.04) - 内网机器
homelab.local(Ubuntu 22.04,内网 IP 192.168.1.100) - 外网笔记本
macbook.local - 组网网段:
10.200.200.0/24
第一步:服务端安装
Ubuntu/Debian 很简单:
# 安装 WireGuard
sudo apt update
sudo apt install wireguard wireguard-tools# 生成密钥对
wg genkey | tee privatekey | wg pubkey > publickey
# 查看密钥
cat privatekey # 私钥,保密
cat publickey # 公钥,给客户端用
服务端配置 `/etc/wireguard/wg0.conf`
[Interface]
# 服务器 VPN 地址
Address = 10.200.200.1/24
ListenPort = 51820
PrivateKey = <服务器私钥># 开启 IP 转发和 NAT
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -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# 第一个客户端:内网机器
[Peer]
PublicKey = <内网机器公钥>
AllowedIPs = 10.200.200.2/32, 192.168.1.0/24
# 第二个客户端:外网笔记本
[Peer]
PublicKey = <笔记本公钥>
AllowedIPs = 10.200.200.3/32
关键点解释:
AllowedIPs控制该客户端能访问什么。内网机器配了192.168.1.0/24,意味着连上 VPN 后,其他客户端可以访问它背后的整个内网网段。PostUp/PostDown是启动/关闭时自动执行的 iptables 规则,开启路由转发。
启动:
# 启用 IP 转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p# 启动 WireGuard
wg-quick up wg0
# 开机自启
systemctl enable wg-quick@wg0
防火墙放行 UDP 51820。
第二步:内网机器配置
同样安装 WireGuard,生成密钥对。
配置 /etc/wireguard/wg0.conf:
[Interface]
Address = 10.200.200.2/24
PrivateKey = <内网机器私钥>
ListenPort = 51820
[Peer]
PublicKey = <服务器公钥>
Endpoint = vps.yolonote.cc:51820
AllowedIPs = 10.200.200.0/24
PersistentKeepalive = 25
启动:
wg-quick up wg0
systemctl enable wg-quick@wg0这里 PersistentKeepalive = 25 意思是每 25 秒发一个心跳包,防止 NAT 超时断开。内网机器通常有路由器 NAT,必须开这个。
第三步:外网笔记本配置
macOS 客户端
App Store 搜 WireGuard,安装后导入配置:
[Interface]
PrivateKey = <笔记本私钥>
Address = 10.200.200.3/24
DNS = 192.168.1.1
[Peer]
PublicKey = <服务器公钥>
Endpoint = vps.yolonote.cc:51820
AllowedIPs = 10.200.200.0/24, 192.168.1.0/24
PersistentKeepalive = 25
点「Activate」就连上了。
Windows / Linux / Android / iOS
各平台都有官方客户端,配置格式完全一样。Android/iOS 可以扫二维码导入,很方便。
生成二维码:
qrencode -t ansiutf8 < /etc/wireguard/client.conf第四步:验证组网效果
笔记本连上 WireGuard 后:
# 看分配到的 VPN IP
ip addr show wg0 # 或 ifconfig wg0
# 应该看到 10.200.200.3# ping 服务器
ping 10.200.200.1# ping 内网机器
ping 10.200.200.2
# 直接访问内网机器背后的设备!
ssh 192.168.1.100 # 内网机器的 SSH
curl http://192.168.1.50 # 内网另一台设备的 Web
smbclient -L 192.168.1.10 # Samba 共享
注意:不需要记 FRP 的那一堆端口号了,直接走内网 IP 访问,就像坐在家里一样。
进阶:选择性路由 + 分流
默认配置里 AllowedIPs = 0.0.0.0/0 会让所有流量走 VPN,适合科学上网。但如果只想访问内网资源,不改其他流量:
# 笔记本配置 - 只走内网流量
AllowedIPs = 10.200.200.0/24, 192.168.1.0/24这样只有访问 VPN 网段和内网网段的流量走 WireGuard,上百度、刷抖音还是直连,不绕路。
如果想科学上网(所有流量走 VPN):
AllowedIPs = 0.0.0.0/0, ::/0配合服务端 PostUp 里的 MASQUERADE,公网服务器就成了你的流量出口。
进阶:多内网组网(Site-to-Site)
如果你有多个地点的内网需要互联——比如家里 192.168.1.0/24 和公司 10.0.0.0/24:
服务端配置:
[Interface]
...# 家里网关
[Peer]
PublicKey = <家里公钥>
AllowedIPs = 10.200.200.2/32, 192.168.1.0/24
# 公司网关
[Peer]
PublicKey = <公司公钥>
AllowedIPs = 10.200.200.3/32, 10.0.0.0/24
这样连上 VPN 后,笔记本可以同时访问家里和公司的内网,两个内网之间也能互通。这就是 WireGuard 相比 FRP 最大的优势:整网互通,不是单端口映射。
和 FRP 配合使用
两者不冲突,可以互补:
- WireGuard 作为「基础组网层」,让所有设备在同一个虚拟内网里
- FRP 作为「精准暴露层」,只把特定服务通过域名暴露出去给外人访问
比如:
- 你自己用 WireGuard 连回家,所有内网资源随便访问
- 给朋友的博客 demo 用 FRP 映射到
demo.yolonote.cc,不需要让他连进你的内网
安全建议
- 密钥保管:
privatekey文件权限设为 600,绝不要上传 Git - 限制 Peer:每个客户端配精确的
AllowedIPs,不要给0.0.0.0/0除非需要 - 防火墙:服务端只开 UDP 51820,其他端口靠 VPN 内网访问
- 定期轮换密钥:WireGuard 不支持自动轮换,建议半年手动更新一次
- 关闭不需要的 Peer:直接注释掉
[Peer]段,比改防火墙快
总结
| 场景 | 推荐方案 |
|---|---|
| 临时调试一个端口 | SSH 端口转发 |
| 暴露特定服务给公网 | FRP + Nginx/HTTPS |
| 多台设备远程组网、像在内网一样互访 | WireGuard |
| 既要内网互访又要暴露部分服务 | WireGuard + FRP 组合 |
WireGuard 最大的优势是「无感」。连上之后,你不会感觉自己在用 VPN,只是突然发现能访问内网资源了。配置极简,性能极高,这才是现代 VPN 该有的样子。
如果你还在用 OpenVPN 或者 IPSec,真的建议试试 WireGuard。迁移成本很低,体验提升很大。