在OpenWrt上配置WireGuard通道

摘要

本文将会简要说明讲wireguard部署到openwrt的方法,以实现:
局域网设备—>远端wireguard客户端
远端wireguard客户端—>局域网设备

无需配置静态ipv4

为了更直观的配置,wireguard服务端我使用的使wg-easy-15
openwrt可使用ImmortalWrt及其变种

本文以
家庭局域网:10.0.0.x
远端wg-easy:10.8.0.x(默认就是这个)
为例

建议使用固定IP作为WireGuard服务端,否则即使使用DDNS外加保活隧道容易断连,而且也必须设置DNS,不可控因素比较多。

当然,如果正好有公网IP而没有VPS,而且你有条件全天开启软路由或者本地服务器的话,其实折腾一下公网IP方案也不错,因为上下行带宽一般比较大,用起来更爽,看你的个人需求啦。

正文

下面按你目前的实际网络整理:

  • WireGuard 网段:10.8.0.0/24

  • VPS 隧道地址:10.8.0.1

  • OpenWrt 隧道地址:10.8.0.2

  • 家中局域网:10.0.0.0/24

  • OpenWrt LAN 地址:10.0.0.1【就是路由器IP】

  • 目标:手机、电脑等远端 WireGuard 客户端可以访问 10.0.0.x 的设备,反之亦然

  • 默认采用分流模式,家里正常上网不经过 WireGuard 通道


一、最终网络结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
远端手机/电脑
WireGuard: 10.8.0.3

│ UDP 51820

VPS / wg-easy
WireGuard: 10.8.0.1

│ WireGuard 隧道

OpenWrt
WireGuard: 10.8.0.2
LAN: 10.0.0.1


家中设备
10.0.0.2 ~ 10.0.0.254

箭头反向依然成立

这里最关键的不只是让 OpenWrt 连上服务器,还要告诉 wg-easy:

10.0.0.0/24 这个网段位于 OpenWrt 客户端后面。

在新版 wg-easy 中:

  • Allowed IPs:写进客户端配置,决定该客户端把哪些目标地址送入 VPN。

  • Server Allowed IPs:写在服务端对应 Peer 中,决定服务器把哪些目标地址发给该客户端。 (WG Easy)


二、wg-easy 服务端配置

1. 创建 OpenWrt 客户端

进入 wg-easy 管理页面,新建一个客户端,例如:

1
OpenWrt-Home

建议给它固定地址:

1
10.8.0.2

然后编辑这个客户端。

2. 填写 OpenWrt 客户端参数

Address

1
IPv4: 10.8.0.2

Allowed IPs

仅用于内网互通时填写:

1
10.8.0.0/24

这表示 OpenWrt 只把 WireGuard 虚拟网段流量发往 VPS,不会把家中普通上网流量也塞进 WireGuard。

不要在这里填写:

1
0.0.0.0/0

除非你明确想让整个家庭网络都通过 VPS 上网。

Server Allowed IPs

这是最关键的一项,填写:

1
10.8.0.2/32, 10.0.0.0/24

含义是:

  • 10.8.0.2/32:OpenWrt 自身的隧道地址。

  • 10.0.0.0/24:OpenWrt 后面的家庭局域网。

OpenWrt 官方的站点互联方案同样要求在服务端对应客户端 Peer 中加入客户端后方的 LAN 网段,并启用相关路由。 (OpenWrt)

Persistent Keepalive

填写:

1
25

OpenWrt 在 NAT、拨号宽带或校园网后面时,建议使用 25 秒保活,避免映射过期。OpenWrt 官方客户端示例也使用该值。 (OpenWrt)

保存后重新下载 OpenWrt 客户端配置文件。


三、检查下载的配置文件

下载的配置大概应当是:

1
2
3
4
5
6
7
8
9
10
11
12
[Interface]
PrivateKey = OPENWRT_PRIVATE_KEY
Address = 10.8.0.2/24
DNS = 1.1.1.1
MTU = 1420

[Peer]
PublicKey = SERVER_PUBLIC_KEY
PresharedKey = PRESHARED_KEY
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
Endpoint = VPS公网IP或域名:51820

注意:

  1. PrivateKey 是 OpenWrt 客户端私钥。

  2. PublicKey 是 VPS 服务端公钥。

  3. PresharedKey 如果配置里有,就必须填写。

  4. Address 必须带掩码,例如 /24。OpenWrt 官方文档特别提醒,不写掩码可能会默认变成 /32,造成路由异常。 (OpenWrt)

  5. DNS = 1.1.1.1 不需要照搬到 OpenWrt,分流互通模式下保持原有 DNS 即可。


四、OpenWrt 安装 WireGuard

SSH 登录 OpenWrt:

1
2
opkg update
opkg install wireguard-tools luci-proto-wireguard

一般会自动安装内核所需依赖。

安装完成后可以重启网络,或者直接重启路由器:

1
reboot

如果软件包已经存在,不需要重复安装。


五、通过 LuCI 配置 OpenWrt

进入:

1
网络 → 接口 → 添加新接口

1. 创建接口

填写:

1
2
名称:wg0
协议:WireGuard VPN

点击创建。

2. 常规设置

私钥

填写下载配置中的:

1
PrivateKey = ...

只复制等号后面的内容。

IP 地址

添加:

1
10.8.0.2/24

如果配置中还有类似下面的 IPv6:

1
fdcc:ad94:bacf:61a4::cafe:2/112

可以后续再添加。建议先只配置 IPv4,把基础互通跑通。

MTU

一般设置:1420,与远端一样就可以了


六、添加 WireGuard Peer

wg0 接口页面下方添加 Peer。

填写以下内容。

公钥

填写:

1
PublicKey = SERVER_PUBLIC_KEY

这是服务端公钥,不是 OpenWrt 自己的公钥。

预共享密钥

填写:

1
PresharedKey = PRESHARED_KEY

没有这一行就留空。

允许的 IP

分流互通模式填写:

1
10.8.0.0/24

不要填家里的:

1
10.0.0.0/24

因为 10.0.0.0/24 就在 OpenWrt 自己后面,不应该让 OpenWrt把它发向 VPS。

路由允许的 IP

勾选:

1
路由允许的 IP

这对应 OpenWrt 的:

1
route_allowed_ips = 1

它会为 Allowed IPs 自动建立路由。OpenWrt 官方配置同样启用了这一选项。 (OpenWrt)

Endpoint Host

填写 VPS 公网 IP 或解析到 VPS 的域名,例如:

1
192.69.93.32

或者:

1
wg.example.com

Endpoint Port

填写:

1
51820

持续保活

填写:

1
25

保存并应用。


七、OpenWrt 防火墙设置

对于你这种自己使用、所有 WireGuard Peer 都可信的情况,最简单的方法是:

1
网络 → 接口 → wg0 → 防火墙设置

wg0 分配到:

1
lan

也就是选择:

1
创建/分配防火墙区域:lan

这样 WireGuard 客户端就能访问:

  • OpenWrt 管理地址 10.0.0.1

  • 家里电脑、NAS、服务器等 10.0.0.x

  • 路由器自身的 SSH、LuCI 等服务

OpenWrt 官方站点互联说明也建议把可信的 WireGuard 私有网络接口加入 LAN 区域。 (OpenWrt)

是否需要开启 LAN 区域伪装

一般不需要

因为你的家中设备默认网关就是:

1
10.0.0.1

它们收到来自 10.8.0.x 的请求后,回包会交给 OpenWrt,再由 OpenWrt送回 WireGuard。

只有在以下情况才可能需要 NAT:

  • 家中设备默认网关不是这台 OpenWrt;

  • 某些设备写死了其他网关;

  • 某些设备防火墙不接受来自其他子网的访问。

优先解决路由或设备防火墙,不建议一开始就开启伪装。


八、配置远端手机或电脑客户端

例如手机的 WireGuard 地址是:

1
10.8.0.3

编辑手机客户端,在 wg-easy 中设置:

Allowed IPs

想访问 VPN 和家中局域网,但普通上网仍走手机本地网络:

1
10.8.0.0/24, 10.0.0.0/24

这样:

  • 访问 10.8.0.x:走 WireGuard。

  • 访问 10.0.0.x:走 WireGuard。

  • 访问普通互联网:走手机流量或当前 Wi-Fi。

全局通过 VPS 上网

手机想把所有流量都走 VPS,才改成:

1
0.0.0.0/0, ::/0

注意,这是修改手机客户端,不会让家里整个 OpenWrt 网络走 VPS。

wg-easy 的 Allowed IPs 本质上控制“客户端把哪些目的地址路由进入 VPN”。 (WG Easy)


九、命令行一键配置版本

不想通过 LuCI 手动填写,也可以 SSH 执行。

先替换下面这些变量:

  • OPENWRT_PRIVATE_KEY

  • SERVER_PUBLIC_KEY

  • PRESHARED_KEY

  • VPS_PUBLIC_IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uci -q delete network.wg0
uci -q delete network.wgserver

uci set network.wg0='interface'
uci set network.wg0.proto='wireguard'
uci set network.wg0.private_key='OPENWRT_PRIVATE_KEY'
uci add_list network.wg0.addresses='10.8.0.2/24'
uci set network.wg0.mtu='1420'

uci set network.wgserver='wireguard_wg0'
uci set network.wgserver.description='wg-easy-vps'
uci set network.wgserver.public_key='SERVER_PUBLIC_KEY'
uci set network.wgserver.preshared_key='PRESHARED_KEY'
uci set network.wgserver.endpoint_host='VPS_PUBLIC_IP'
uci set network.wgserver.endpoint_port='51820'
uci set network.wgserver.persistent_keepalive='25'
uci set network.wgserver.route_allowed_ips='1'
uci add_list network.wgserver.allowed_ips='10.8.0.0/24'

uci del_list firewall.lan.network='wg0'
uci add_list firewall.lan.network='wg0'

uci commit network
uci commit firewall

/etc/init.d/network restart
/etc/init.d/firewall restart

如果配置中没有预共享密钥,删除这一行:

1
uci set network.wgserver.preshared_key='PRESHARED_KEY'

十、检查是否成功

1. OpenWrt 查看握手

执行:

1
wg show

正常情况下会看到:

1
2
3
4
5
6
7
8
9
10
interface: wg0
public key: ...
private key: (hidden)

peer: ...
endpoint: VPS公网IP:51820
allowed ips: 10.8.0.0/24
latest handshake: 几秒或几分钟前
transfer: ...
persistent keepalive: every 25 seconds

只要出现近期的:

1
latest handshake

就说明 OpenWrt 到 VPS 的基础 WireGuard 通道已经建立。

2. OpenWrt ping VPS

1
ping -c 4 10.8.0.1

应当有回复。

3. 查看路由

1
ip route get 10.8.0.1

应当类似:

1
10.8.0.1 dev wg0

查看全部 WireGuard 路由:

1
ip route show dev wg0

4. VPS 检查 OpenWrt Peer

在 VPS 上:

1
docker exec -it wg-easy wg show

OpenWrt 对应 Peer 的 Allowed IPs 应当包含:

1
10.8.0.2/32, 10.0.0.0/24

如果只看到:

1
10.8.0.2/32

说明 wg-easy 的 Server Allowed IPs 没有正确加入 10.0.0.0/24

5. 手机测试

手机开启 WireGuard 后依次测试:

1
2
3
4
10.8.0.1
10.8.0.2
10.0.0.1
10.0.0.x

推荐顺序:

  1. 能访问 10.8.0.1:手机到 VPS 正常。

  2. 能访问 10.8.0.2:VPS 到 OpenWrt 正常。

  3. 能访问 10.0.0.1:OpenWrt 转发和防火墙正常。

  4. 能访问其他 10.0.0.x:完整局域网互通成功。


十一、和 OpenClash 共存的设置

你现在还在使用 OpenClash,这部分很重要。

WireGuard 的 VPS 公网地址和隧道流量必须避免再次进入 OpenClash,否则可能形成:

1
WireGuard → OpenClash → 代理节点 → WireGuard VPS

这会造成:

  • 握手不稳定;

  • 延迟突然变高;

  • 上传只有几百 KB/s;

  • UDP 丢包;

  • 隧道反复重连;

  • WireGuard 流量意外绕海外代理。

建议在 OpenClash 的本地绕过或自定义直连规则中加入:

1
2
3
10.8.0.0/24
10.0.0.0/24
VPS公网IP/32

例如 VPS 是:

1
192.69.93.32

则加入:

1
192.69.93.32/32

还要确保:

1
UDP 51820

不经过代理。

如果使用 Clash 规则,可以加入类似:

1
2
3
- IP-CIDR,10.8.0.0/24,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/24,DIRECT,no-resolve
- IP-CIDR,192.69.93.32/32,DIRECT,no-resolve

其中 VPS IP 按实际情况替换。


十二、常见问题定位

情况 1:完全没有握手

检查:

1
2
3
4
5
6
7
VPS 安全组是否放行 UDP 51820
VPS 系统防火墙是否放行 UDP 51820
wg-easy Docker 是否映射 51820:51820/udp
Endpoint IP 和端口是否正确
客户端私钥与服务端登记的公钥是否匹配
系统时间是否明显错误
OpenClash 是否代理了 VPS 公网 IP

情况 2:有握手,但 ping 不通 10.8.0.1

检查 OpenWrt Peer:

1
2
Allowed IPs: 10.8.0.0/24
路由允许的 IP:已勾选

然后执行:

1
2
ip route show dev wg0
wg show

情况 3:能访问 10.8.0.2,不能访问 10.0.0.1

大概率是 OpenWrt 防火墙。

检查:

1
2
3
wg0 是否加入 lan 防火墙区域
lan 区域 Input 是否为 ACCEPT
lan 区域 Forward 是否为 ACCEPT

查看配置:

1
uci show firewall | grep -E "lan|wg0"

情况 4:能访问 10.0.0.1,不能访问其他 10.0.0.x

这说明隧道和 OpenWrt 基本正常,问题通常在局域网设备:

  • 设备自身防火墙拒绝其他子网;

  • 设备默认网关不是 10.0.0.1

  • Windows 网络被设置成“公用网络”;

  • 服务只监听 127.0.0.1

  • 服务只允许同一局域网来源。

Windows 可以先测试关闭防火墙,确认是不是防火墙问题,再添加专门规则,不建议长期完全关闭。


情况 5:远端能 ping OpenWrt,但进不了局域网

重点查看 wg-easy 中 OpenWrt 客户端的:

1
Server Allowed IPs

必须是:

1
10.8.0.2/32, 10.0.0.0/24

这是最容易漏掉的一步。


情况 6:打开 WireGuard 后家里上不了网

检查 OpenWrt Peer 的 Allowed IPs 是否误写成:

1
0.0.0.0/0

分流模式应改回:

1
10.8.0.0/24

DNS 也不要随意改成只能通过 WireGuard 访问的地址。


情况 7:能用但速度非常慢

依次检查:

  1. OpenClash 是否代理 VPS 公网 IP。

  2. 是否误用了 0.0.0.0/0

  3. MTU 从 1420 改为 1380

  4. VPS 是否真有足够出入带宽。

  5. 家庭宽带上行是否达到预期。

  6. 是否存在 UDP 限速或丢包。

  7. 是否经过多层 NAT、代理或 TUN。

可以测试 MTU:

1
ping -c 4 -M do -s 1372 10.8.0.1

失败则逐步降低,例如:

1
ping -c 4 -M do -s 1332 10.8.0.1

十三、局域网地址冲突问题

你的家庭网段是:

1
10.0.0.0/24

这是比较常见的地址。

如果你在外面连接的 Wi-Fi 也使用:

1
10.0.0.0/24

手机或电脑可能无法判断访问的 10.0.0.x 是当前 Wi-Fi 的设备,还是家里的设备。

这种情况下最稳妥的长期方案是把家中 LAN 改成不常见的网段,例如:

1
10.23.50.0/24

对应:

1
OpenWrt: 10.23.50.1

然后把所有 WireGuard 配置里的:

1
10.0.0.0/24

替换为:

1
10.23.50.0/24

wg-easy 项目讨论中也记录过本地网络与远端私网地址重叠导致路由冲突的问题。 (GitHub)


十四、最终配置速查

位置 配置项
VPS wg-easy 隧道地址 10.8.0.1/24
OpenWrt 隧道地址 10.8.0.2/24
OpenWrt Peer Allowed IPs 10.8.0.0/24
OpenWrt Route Allowed IPs 开启
OpenWrt Keepalive 25
OpenWrt 防火墙区域 lan
wg-easy OpenWrt Peer Server Allowed IPs 10.8.0.2/32, 10.0.0.0/24
手机/电脑 分流 Allowed IPs 10.8.0.0/24, 10.0.0.0/24
手机/电脑 全局 Allowed IPs 0.0.0.0/0, ::/0
VPS 开放端口 51820/UDP
OpenClash 强制直连 10.8.0.0/24、VPS 公网 IP
推荐 MTU 初始值 1420
异常时 MTU 保守值 1380

按这套配置,最终应实现:

1
远端设备 → VPS wg-easy → OpenWrt → 家中 10.0.0.x

同时家里普通下载、上传、网页访问仍然走本地宽带,不会因为 WireGuard 意外绕到 VPS。