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
→ 主路由出网验证方法:
- 客户端开启 WireGuard。
- 访问 Google、GitHub、YouTube 等需要代理的服务。
- 打开 OpenClash 控制面板的 Connections 页面。
- 查看是否出现来源为
10.7.0.x的连接。
如果能看到:
source: 10.7.0.2
host: google.com
rule: Proxy
chains: 代理节点说明 WireGuard 客户端流量已经进入 OpenClash 透明代理。
如果看不到,可能需要检查 OpenClash 是否代理了 wg0 或 10.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需要确认:
- OpenWrt 上笔记本 Peer 的允许 IP 是:
10.7.0.3/32为允许的 IP 创建路由已勾选。防火墙允许:
lan → wg
wg → lan- 家庭内网设备的默认网关是 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如果 TcpTestSucceeded 是 False,说明笔记本本机 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、酒店、手机热点等不同环境下,可以灵活切换。