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

- 原文地址：https://www.kuddy.cn/archives/216
- 发布时间：2026-05-11 00:14:36
- 更新时间：2026-05-18 02:42:17
- 分类：网络
- 标签：OpenWrt, VPN, WireGuard

> # OpenWrt 旁路由上部署 WireGuard：远程访问家庭内网与外出走家里代理 上一篇文章已经完成了 OpenW...

---

# 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 是否代理了 `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
```


需要确认：

1. OpenWrt 上笔记本 Peer 的允许 IP 是：


```
10.7.0.3/32
```


2. `为允许的 IP 创建路由` 已勾选。

3. 防火墙允许：


```
lan → wg
wg → lan
```


4. 家庭内网设备的默认网关是 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:SystemCurrentControlSetControlTerminal ServerWinStationsRDP-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、酒店、手机热点等不同环境下，可以灵活切换。