2026最新零基础:WireGuard VPN旁路由异地组网超详细教程

## 前言

WireGuard 是目前最快的 VPN 协议,代码量只有 OpenVPN 的 1%,性能却更强。本教程教你用 WireGuard 在 OpenWrt 旁路由上搭建 VPN,实现异地组网——让你在外地也能访问家里的 NAS、摄像头、智能家居等设备,速度快到像在局域网一样。

本教程包含两个场景:① 家里软路由做 VPN 服务端 + 手机/电脑做客户端;② 两台软路由异地互联。

## 一、前期准备

### 你需要什么

| 项目 | 要求 | 说明 |
|——|——|——|
| 软路由 | OpenWrt 21.02+ | 需支持 WireGuard 内核模块 |
| 公网 IP 或 DDNS | 有公网 IP 最佳 | 没有公网 IP 可用 frp 内网穿透 |
| 客户端设备 | 手机/电脑/NAS | 安装 WireGuard 客户端 |
| SSH 工具 | PuTTY / Xshell | 命令行操作 |

### 软件下载

| 软件 | 下载地址 | 平台 |
|——|———|——|
| WireGuard Windows 客户端 | https://download.wireguard.com/windows-client/wireguard-installer.exe | Windows |
| WireGuard Mac 客户端 | App Store 搜索 “WireGuard” | macOS |
| WireGuard iOS 客户端 | App Store 搜索 “WireGuard” | iPhone/iPad |
| WireGuard Android 客户端 | Google Play / F-Droid 搜索 “WireGuard” | Android |
| WinSCP | https://winscp.net/eng/download.php | 文件传输 |

### 检查是否有公网 IP

“`bash
# 在软路由上执行
curl -s https://ipinfo.io/ip
“`

然后登录你的路由器,查看 WAN 口 IP 是否和上面返回的一致。一致则有公网 IP,不一致则没有(运营商机顶盒 NAT 了)。

## 二、安装 WireGuard

### 在 OpenWrt 上安装

“`bash
# 更新软件源
opkg update

# 安装 WireGuard 内核模块和工具
opkg install wireguard-tools
opkg install kmod-wireguard
opkg install luci-proto-wireguard

# 如果上面的内核模块安装失败,尝试
opkg install kmod-wireguard-core

# 重启使模块生效
reboot
“`

### 验证安装

“`bash
# 检查内核模块是否加载
lsmod | grep wireguard

# 应该输出类似:
# wireguard 110592 0
# ip6_udp_tunnel 16384 1 wireguard
# udp_tunnel 20480 1 wireguard
“`

## 三、生成密钥对

WireGuard 使用非对称加密,每个节点都需要一对密钥。

### 服务端密钥

“`bash
# 创建配置目录
mkdir -p /etc/wireguard

# 生成服务端私钥和公钥
cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key

# 查看密钥(后面要用)
echo “服务端私钥:”
cat server_private.key
echo “服务端公钥:”
cat server_public.key
“`

> **重要**:私钥绝对不要泄露!公钥可以随便分享。

### 客户端密钥(每个客户端都需要一对)

“`bash
# 生成客户端1的密钥
wg genkey | tee client1_private.key | wg pubkey > client1_public.key

# 生成客户端2的密钥(手机用)
wg genkey | tee client2_private.key | wg pubkey > client2_public.key

# 查看客户端密钥
echo “客户端1 公钥:”
cat client1_public.key
echo “客户端2 公钥:”
cat client2_public.key
“`

## 四、配置 OpenWrt 服务端

### 第1步:创建 WireGuard 接口

1. 进入 OpenWrt 管理页面
2. **网络 → 接口 → 添加新接口**
3. 填写:

“`
名称:wg0
协议:WireGuard VPN
“`

4. 点击 **创建接口**

### 第2步:配置接口参数

在刚创建的 wg0 接口中设置:

“`
私钥:[粘贴服务端私钥]
监听端口:51820
IP 地址:10.0.0.1/24 # VPN 内网地址段,可自定义
“`

### 第3步:添加 Peer(客户端)

在 wg0 接口设置页面的 **Peers** 部分,逐个添加客户端:

**Peer 1(电脑):**

“`
公钥:[粘贴客户端1的公钥]
允许的 IP:10.0.0.2/32 # 分配给此客户端的 VPN IP
“`

**Peer 2(手机):**

“`
公钥:[粘贴客户端2的公钥]
允许的 IP:10.0.0.3/32 # 分配给此客户端的 VPN IP
“`

### 第4步:配置防火墙

1. 进入 **网络 → 防火墙**
2. 添加一个新的区域:

“`
名称:wg
入站:接受
出站:接受
转发:接受
IP 动态伪装:勾选
涵盖的网络:选择 wg0
允许转发到目标:选择 lan
“`

3. 保存并应用

### 第5步:开放防火墙端口

“`bash
# 允许 UDP 51820 端口入站
uci add firewall rule
uci set firewall.@rule[-1].name=’Allow-WireGuard’
uci set firewall.@rule[-1].src=’wan’
uci set firewall.@rule[-1].dest_port=’51820′
uci set firewall.@rule[-1].proto=’udp’
uci set firewall.@rule[-1].target=’ACCEPT’
uci commit firewall
“`

### 第6步:启动 WireGuard

“`bash
# 重启网络使接口生效
/etc/init.d/network restart

# 检查 WireGuard 状态
wg show
“`

应该看到 wg0 接口信息,包括 listening port 和 peer 列表。

## 五、配置客户端

### Windows 客户端配置

1. 安装 WireGuard Windows 客户端
2. 点击 **添加隧道 → 添加空隧道**
3. 填写配置:

“`ini
[Interface]
PrivateKey = [客户端1的私钥]
Address = 10.0.0.2/24
DNS = 223.5.5.5

[Peer]
PublicKey = [服务端的公钥]
Endpoint = 你的公网IP或域名:51820
AllowedIPs = 0.0.0.0/0 # 所有流量走 VPN(远程网关模式)
# 或者只访问家里设备:
# AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25
“`

4. 点击 **连接**

### 手机客户端配置

1. 安装 WireGuard App
2. 点击 **+ → 从剪贴板粘贴** 或手动添加
3. 配置内容:

“`ini
[Interface]
PrivateKey = [客户端2的私钥]
Address = 10.0.0.3/24
DNS = 223.5.5.5

[Peer]
PublicKey = [服务端的公钥]
Endpoint = 你的公网IP:51820
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25
“`

> **PersistentKeepalive = 25** 非常重要!它保证 NAT 映射不会过期,手机从休眠恢复后能立即重连。

## 六、验证连接

### 检查握手状态

“`bash
# 在软路由上执行
wg show
# 查看 latest handshake 时间,应该在过去几十秒内
“`

### Ping 测试

“`bash
# 从客户端 ping 软路由 VPN IP
ping 10.0.0.1

# 从客户端 ping 软路由局域网 IP
ping 192.168.1.2

# 从客户端 ping 局域网其他设备(如 NAS)
ping 192.168.1.100
“`

### 访问 NAS 测试

浏览器输入 `http://192.168.1.100:5000`(你的 NAS 地址),能打开即组网成功。

## 七、没有公网 IP 的解决方案

### 方案一:DDNS + 端口映射

1. 登录路由器,设置端口映射:外网 51820 → 软路由 51820/UDP
2. 配置 DDNS 绑定域名
3. 客户端 Endpoint 填 DDNS 域名

### 方案二:frp 内网穿透

“`bash
# 在有公网 IP 的 VPS 上部署 frps
# 在软路由上部署 frpc,转发 UDP 51820

# frpc.ini 配置
[wireguard]
type = udp
local_ip = 127.0.0.1
local_port = 51820
remote_port = 51820
“`

frp 服务端下载:https://github.com/fatedier/frp/releases

### 方案三:Tailscale 零配置组网

如果嫌 WireGuard 配置麻烦,可以用 Tailscale(基于 WireGuard):

“`bash
opkg install tailscale
tailscale up
“`

注册地址:https://login.tailscale.com/start

## 八、性能优化

### 1. 调整 MTU

“`bash
# WireGuard 默认 MTU 1420,网络不佳时可降低
# 在接口设置中修改:
MTU:1280
“`

### 2. 多线程优化

“`bash
# 增加 WireGuard 的并发连接数
echo 32768 > /proc/sys/net/core/somaxconn
“`

### 3. 开启 BBR 拥塞控制

“`bash
echo “net.core.default_qdisc=fq” >> /etc/sysctl.conf
echo “net.ipv4.tcp_congestion_control=bbr” >> /etc/sysctl.conf
sysctl -p
“`

## 九、常见报错解决

| 报错 | 原因 | 解决方案 |
|——|——|———|
| `Cannot find device “wg0″` | 内核模块未加载 | 执行 `modprobe wireguard` 或重启 |
| `Handshake did not complete` | 端口不通或密钥错误 | 检查防火墙端口、重新核对密钥 |
| `能连上但访问不了局域网` | 防火墙未放行转发 | wg 区域允许转发到 lan |
| `手机锁屏后断开` | 缺少 Keepalive | 添加 `PersistentKeepalive = 25` |
| `连接后无法上网` | AllowedIPs = 0.0.0.0/0 但没配 NAT | 开启 IP 动态伪装 |
| `速度很慢` | MTU 太大 | 降低 MTU 到 1280 |
| `端口映射不生效` | 运营商封锁 UDP | 换端口或用 frp 穿透 |
| `wg genkey 命令不存在` | wireguard-tools 未装 | `opkg install wireguard-tools` |

## 十、避坑总结

1. 私钥绝对不要发给别人,也不要填错位置
2. 服务端配客户端的公钥,客户端配服务端的公钥——别搞反了
3. PersistentKeepalive 是手机客户端的必填项
4. 没有公网 IP 必须做内网穿透,否则外网连不回来
5. 防火墙区域必须允许 wg → lan 转发
6. MTU 设 1280 最稳妥,避免包分片
7. WireGuard 是 UDP 协议,端口映射要选 UDP 不是 TCP

本文由技术保姆网 JSBMW.CN 原创,转载请注明出处。

发表回复