分享技术 · 探索极限 · Code is Art
Linux 发布 2026-05-11 350阅读 约 18分钟阅读

OpenWrt 旁路由上部署 WireGuard:远程访问家庭内网与外出走家里代理

OpenWrt 旁路由上部署 WireGuard:远程访问家庭内网与外出走家里代理

上一篇文章已经完成了 OpenWrt 旁路由、OpenClash 全屋透明代理和可选 DNS 服务的基础配置。本文作为第二步,整理如何在 OpenWrt 上部署 WireGuard,让手机、笔记本在外网环境下安全连回家里。

本文目标不是做复杂的企业 VPN,而是实现几个常见家庭场景:

  • 外出访问家里的 OpenWrt、NAS、服务器、AdGuardHome 等内网服务。
  • 手机或笔记本在外面也可以走家里的 OpenClash 透明代理。
  • 家里内网可以反向访问已经连入 WireGuard 的笔记本,例如远程桌面。
  • 尽量避免和公司内网、已有 OpenVPN 网段冲突。

本文基于 OpenWrt 25 之后的 apk 包管理方式。如果你的 OpenWrt 仍然使用 opkg,把安装命令里的 apk add 换成对应的 opkg install 即可。

一、网络规划

示例拓扑如下:

主路由 / AP:192.168.1.1
OpenWrt 旁路由:192.168.1.2
可选 DNS / AdGuardHome:192.168.1.3
家庭内网网段:192.168.1.0/24
WireGuard 网段:10.7.0.0/24

示例值可以这样理解:

主路由 / AP:192.168.1.1
OpenWrt 旁路由:192.168.1.2
可选 DNS / AdGuardHome:192.168.1.3
家庭内网网段:192.168.1.0/24
WireGuard 网段:10.7.0.0/24

建议给 WireGuard 单独规划一个不会和已有网络冲突的网段。例如:

OpenWrt wg0:10.7.0.1
手机:10.7.0.2
笔记本:10.7.0.3
平板:10.7.0.4

如果你的环境里已经有 OpenVPN 使用 10.8.0.0/24,WireGuard 就不要再使用 10.8.0.0/24。保持不同 VPN 使用不同网段,后续排障会简单很多。

二、安装 WireGuard 组件

SSH 登录 OpenWrt:

ssh root@192.168.1.2

更新软件源并安装 WireGuard:

apk update
apk add wireguard-tools luci-proto-wireguard

如果软件源里有 LuCI 状态页,也可以安装:

apk add luci-app-wireguard

部分版本可能没有 luci-app-wireguard,这不影响使用。只要安装了 luci-proto-wireguard,LuCI 的“网络 → 接口”里就可以创建 WireGuard VPN 接口。

安装完成后,建议重启 LuCI 服务:

/etc/init.d/rpcd restart
/etc/init.d/uhttpd restart

三、生成服务端密钥

建议统一把 WireGuard 密钥放在 /etc/wireguard 目录下:

mkdir -p /etc/wireguard
chmod 700 /etc/wireguard

生成 OpenWrt 服务端密钥:

wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key

chmod 600 /etc/wireguard/server_private.key
chmod 644 /etc/wireguard/server_public.key

查看服务端私钥和公钥:

cat /etc/wireguard/server_private.key
cat /etc/wireguard/server_public.key

注意:

  • server_private.key 是服务端私钥,只填到 OpenWrt 的 wg0 接口里,不要公开。
  • server_public.key 是服务端公钥,需要填到手机、笔记本等客户端配置里。

四、创建 wg0 接口

进入 OpenWrt 管理界面:

网络 → 接口 → 添加新接口

填写:

名称:wg0
协议:WireGuard VPN

创建后,在“常规设置”中填写:

私钥:server_private.key 里的内容
监听端口:51820
IP 地址:10.7.0.1/24

“高级设置”建议保持简单:

MTU:1420
使用该接口的网关作为默认网关:不勾选
自定义 DNS:留空
IPv6:先不配置

如果你暂时没有专门规划 IPv6,建议先只跑 IPv4。等 IPv4 VPN 稳定后,再单独处理 IPv6。

五、配置防火墙区域

创建或选择一个新的防火墙区域,例如:

区域名称:wg
涵盖网络:wg0
输入:接受
输出:接受
转发:接受
IP 动态伪装:不勾选
TCP MSS 钳制:勾选

然后设置区域转发:

wg → lan:允许

这样外部设备连入 WireGuard 后,可以访问家庭内网,例如:

OpenWrt:192.168.1.2
DNS / AdGuardHome:192.168.1.3
NAS / 服务器:192.168.1.0/24 内的设备

如果还希望家庭内网主动访问已经连入 WireGuard 的笔记本,例如从家里电脑远程桌面连接外面的笔记本,还需要允许:

lan → wg:允许

是否开启 lan → wg 取决于你的需求。如果只需要“外面访问家里”,只开 wg → lan 就够了。如果需要“家里访问外面的 WireGuard 客户端”,就需要双向转发。

六、放行 WireGuard 端口

WireGuard 默认使用 UDP。本文使用端口:

51820/UDP

在 OpenWrt 中添加通信规则:

名称:Allow-WireGuard
协议:UDP
源区域:lan
目标区域:设备本身
目标端口:51820
动作:接受

因为本文场景是 OpenWrt 作为旁路由,主路由会把外部 UDP 51820 转发到 OpenWrt,进入 OpenWrt 时通常属于 lan 区域,所以源区域选择 lan

然后在主路由上添加端口转发:

协议:UDP
外部端口:51820
内部 IP:192.168.1.2
内部端口:51820

也就是:

UDP 51820 → 192.168.1.2:51820

如果没有公网 IP,端口转发不一定有用。此时需要考虑公网中转、Tailscale、ZeroTier、云服务器转发等方案。

七、添加客户端 Peer

每台设备都必须拥有独立的密钥和独立的 WireGuard IP。不要让手机和笔记本共用同一个配置。

推荐规划:

手机:10.7.0.2/32
笔记本:10.7.0.3/32

在 LuCI 中进入:

网络 → 接口 → wg0 → 对端 → 添加对端

以手机为例,填写:

描述:phone
公钥:手机客户端公钥
允许的 IP:10.7.0.2/32
为允许的 IP 创建路由:勾选
持续保持连接:25

如果你在 LuCI 里直接生成了客户端私钥和公钥,可以使用页面里的“生成配置”或二维码功能,让手机 WireGuard App 扫码导入。

为了先排除问题,第一次配置时可以不使用 PSK:

预共享密钥 PSK:留空

等确认连接稳定后,再考虑加入 PSK。需要注意的是,如果 OpenWrt 端配置了 PSK,客户端配置里也必须有完全相同的 PresharedKey,否则会出现“UDP 包到了但无法握手”的现象。

八、手机客户端配置示例

手机客户端安装 WireGuard 官方 App 后,可以使用如下配置。

只访问家庭内网的分流配置:

[Interface]
PrivateKey = 客户端私钥
Address = 10.7.0.2/32
DNS = 192.168.1.3

[Peer]
PublicKey = OpenWrt 服务端公钥
Endpoint = vpn.example.com:51820
AllowedIPs = 192.168.1.0/24, 10.7.0.0/24
PersistentKeepalive = 25

示例:

[Interface]
PrivateKey = 手机私钥
Address = 10.7.0.2/32
DNS = 192.168.1.3

[Peer]
PublicKey = OpenWrt 服务端公钥
Endpoint = vpn.example.com:51820
AllowedIPs = 192.168.1.0/24, 10.7.0.0/24
PersistentKeepalive = 25

如果没有独立 DNS / AdGuardHome,可以把 DNS 改成 OpenWrt 或其他可用 DNS:

DNS = 192.168.1.2

九、全局回家还是只访问内网

WireGuard 客户端里的 AllowedIPs 非常关键。它决定哪些目标流量走 VPN。

只访问家里内网

AllowedIPs = 192.168.1.0/24, 10.7.0.0/24

示例:

AllowedIPs = 192.168.1.0/24, 10.7.0.0/24

效果:

  • 访问家里内网时走 WireGuard。
  • 访问公司内网时不受影响。
  • 访问普通互联网时不经过家里的 OpenClash。

适合在公司环境使用,避免影响公司内网,例如:

192.168.74.0/24
192.168.75.0/24
192.168.79.0/24
10.0.0.0/8
10.1.0.0/16

所有 IPv4 流量都回家

AllowedIPs = 0.0.0.0/0

效果:

  • 手机或笔记本所有 IPv4 流量都会经过 WireGuard 回到家里。
  • 然后由家里的 OpenWrt / OpenClash 继续处理。
  • 外出时也可以使用家里的透明代理和 DNS 过滤。

适合公共 Wi-Fi、酒店、咖啡店、手机热点等场景。

但在公司网络中,全局回家可能导致公司内网访问异常。因为公司内网地址也可能被拉进 WireGuard 隧道。

建议建立两个 WireGuard 配置:

Home-LAN:只访问家里内网
Home-Full:所有流量回家走代理

公司环境用 Home-LAN,外出公共网络用 Home-Full

十、如何确认全局回家是否走 OpenClash

AllowedIPs = 0.0.0.0/0 只能说明客户端流量进了 WireGuard,不代表一定被 OpenClash 透明代理接管。

完整链路应该是:

外部客户端
  → WireGuard
  → OpenWrt wg0
  → OpenClash 透明代理
  → DIRECT / Proxy
  → 主路由出网

验证方法:

  1. 客户端开启 WireGuard。
  2. 访问 Google、GitHub、YouTube 等需要代理的服务。
  3. 打开 OpenClash 控制面板的 Connections 页面。
  4. 查看是否出现来源为 10.7.0.x 的连接。

如果能看到:

source: 10.7.0.2
host: google.com
rule: Proxy
chains: 代理节点

说明 WireGuard 客户端流量已经进入 OpenClash 透明代理。

如果看不到,可能需要检查 OpenClash 是否代理了 wg010.7.0.0/24 来源的流量,避免把 WireGuard 网段排除在透明代理之外。

十一、在家里内网测试时的注意事项

如果笔记本在家里局域网内测试 WireGuard,Endpoint 如果仍然写公网域名:

Endpoint = vpn.example.com:51820

可能会遇到 NAT 回环问题。很多家用路由器不支持或不稳定支持 NAT Loopback。

在家里测试时,可以临时把 Endpoint 改成:

Endpoint = 192.168.1.2:51820

外出使用时再改回公网域名或公网 IP。

也可以建立两个配置:

home-lan:Endpoint = 192.168.1.2:51820
home-wan:Endpoint = vpn.example.com:51820

十二、检查 WireGuard 是否生效

1. 检查是否监听 UDP 51820

netstat -lunp | grep 51820

正常会看到:

udp        0      0 0.0.0.0:51820           0.0.0.0:*
udp        0      0 :::51820                :::*

2. 检查防火墙规则

uci show firewall | grep -i wireguard
nft list ruleset | grep 51820

正常应该看到 UDP 51820 的 accept 规则。

3. 抓包确认外部请求是否到达

tcpdump -i br-lan udp port 51820

客户端在外网开启 WireGuard 后,如果端口转发正常,应该看到类似:

公网客户端IP.xxxxx > 192.168.1.2.51820: UDP, length 148

如果抓不到包,优先检查:

  • 主路由端口转发是否正确。
  • 公网 IP 或 DDNS 是否正确。
  • 运营商是否提供公网 IP。
  • 客户端 Endpoint 是否填错。

4. 查看握手状态

wg show

成功时应该看到:

peer: 客户端公钥
  endpoint: 客户端公网IP:随机端口
  allowed ips: 10.7.0.2/32
  latest handshake: 几秒前
  transfer: xxx received, xxx sent

如果只有 interface,没有任何 peer,说明 Peer 没有加载成功。

如果 tcpdump 能看到 UDP 包,但 latest handshake 仍然是 never,通常是:

  • 客户端公钥填错。
  • 客户端私钥和服务端 Peer 公钥不是一对。
  • PSK 两边不一致。
  • Allowed IP 没有填对。
  • 保存后没有应用或重启网络。

十三、内网反向访问外部笔记本

WireGuard 不只能让外部客户端访问家里,也可以让家里内网访问已经连入 WireGuard 的笔记本。

场景:

笔记本在外网,通过 WireGuard 连回家里
家庭内网电脑想远程桌面连接笔记本

假设笔记本 WireGuard IP 是:

10.7.0.3

需要确认:

  1. OpenWrt 上笔记本 Peer 的允许 IP 是:
10.7.0.3/32
  1. 为允许的 IP 创建路由 已勾选。

  2. 防火墙允许:

lan → wg
wg → lan
  1. 家庭内网设备的默认网关是 OpenWrt:
默认网关:192.168.1.2

如果某些内网设备的默认网关仍然是主路由,则需要在主路由上加静态路由:

目标网段:10.7.0.0/24
下一跳:192.168.1.2

然后家里内网电脑就可以访问:

10.7.0.3

如果要远程桌面连接 Windows 笔记本,连接地址就是:

10.7.0.3

而不是笔记本当前外部网络的 IP。

十四、Windows 远程桌面排查

如果能 ping 通 10.7.0.3,但远程桌面不通,说明 WireGuard 三层网络已经没问题,问题多半在 Windows RDP 服务或防火墙。

在笔记本上检查 3389 是否监听:

Test-NetConnection localhost -Port 3389

如果 TcpTestSucceededFalse,说明笔记本本机 RDP 服务没有正常监听。

检查远程桌面服务:

Get-Service TermService

检查 RDP-Tcp 配置:

Get-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' |
Select-Object fEnableWinStation, PortNumber, LanAdapter, UserAuthentication, SecurityLayer

常见正常值:

fEnableWinStation  : 1
PortNumber         : 3389
LanAdapter         : 0
UserAuthentication : 1
SecurityLayer      : 2

检查是否有 RDP 监听器:

qwinsta

正常应该看到类似:

rdp-tcp    Listen

检查监听端口:

netstat -ano | findstr LISTENING | findstr :3389

如果没有监听,先在 Windows 设置里确认“远程桌面”已经开启,并执行:

Enable-NetFirewallRule -DisplayGroup "Remote Desktop"

如果 WireGuard 网卡被识别为公用网络,可能需要把它改为专用网络:

Get-NetConnectionProfile

找到 WireGuard 对应接口后执行:

Set-NetConnectionProfile -InterfaceAlias "你的 WireGuard 接口名" -NetworkCategory Private

十五、常见问题整理

1. 手机只有发送,没有接收

表现:

  • tcpdump 能看到 UDP 51820 包到达 OpenWrt。
  • 手机 WireGuard 显示只有发送,没有接收。
  • wg show 没有 latest handshake。

优先检查:

  • OpenWrt Peer 公钥是否是客户端对应的公钥。
  • 客户端私钥和 OpenWrt 端公钥是否配对。
  • PSK 是否两边一致。
  • Allowed IP 是否是独立的 /32 地址。
  • Peer 是否真正加载到 wg show 中。

2. wg show 只有 interface,没有 peer

说明 wg0 启动了,但客户端 Peer 没有加载。

检查:

uci show network | grep -A20 wireguard_wg0

如果没有对应配置,说明 LuCI 里 Peer 没保存成功。

3. 在家里连公网域名失败

可能是主路由不支持 NAT 回环。局域网测试时临时改:

Endpoint = 192.168.1.2:51820

外出再改回公网域名。

4. 公司网络里使用全局模式导致内网异常

如果公司有内网地址,例如:

192.168.74.0/24
192.168.75.0/24
10.0.0.0/8

而客户端配置了:

AllowedIPs = 0.0.0.0/0

公司内网流量也会被拉回家里,导致公司系统访问异常。

公司环境建议使用分流:

AllowedIPs = 192.168.1.0/24, 10.7.0.0/24

需要外出全局代理时,再切换到另一份 0.0.0.0/0 配置。

十六、最终检查清单

OpenWrt 侧:

  • wg0 地址为 10.7.0.1/24
  • WireGuard 监听端口为 51820/UDP
  • 主路由已转发 UDP 51820 → 192.168.1.2:51820
  • OpenWrt 防火墙已放行 UDP 51820 到设备本身。
  • wg 防火墙区域已绑定 wg0
  • wg → lan 已允许。
  • 如需内网访问客户端,lan → wg 也要允许。
  • 每个客户端 Peer 都使用唯一的 10.7.0.x/32
  • wg show 能看到 peer 和 latest handshake。

客户端侧:

  • 每台设备使用独立配置,不共用私钥和 IP。
  • DNS 填写家庭 DNS,例如 192.168.1.3,如果没有独立 DNS 可填 OpenWrt。
  • 只访问内网时使用 192.168.1.0/24, 10.7.0.0/24
  • 需要全局走家里代理时使用 0.0.0.0/0
  • 在公司网络中谨慎使用全局模式,避免影响公司内网。

总结

WireGuard 部署本身并不复杂,真正容易出问题的地方通常是:

  • 旁路由场景下端口转发和防火墙区域。
  • 客户端 Peer 没有正确加载。
  • 手机和笔记本复用了同一份配置。
  • PSK 两边不一致。
  • AllowedIPs 误用导致公司内网或透明代理不符合预期。
  • Windows 远程桌面服务本身没有监听 3389。

如果目标只是远程访问家庭内网,使用分流配置最稳。如果目标是外出也走家里的 OpenClash 透明代理,则使用 0.0.0.0/0,并确认 OpenClash 已经接管 WireGuard 网段的流量。

建议同时保留两份配置:

Home-LAN:只访问家里内网
Home-Full:所有流量回家并走家里透明代理

这样在公司、公共 Wi-Fi、酒店、手机热点等不同环境下,可以灵活切换。

发表回复