异地访问(安全)家中计算机-(OpenWRT+No-IP+WireGuard)
2 分钟阅读
What-is-this-Talking-About
这是一份我的工作笔记,几乎没有进行润色,AI帮助我把思考过程和尝试过程,包括弯路和最终解法都整理出来,写成文档的格式。
其实,自从我在Github Pages开通了博客,我就很自然的也很乐此不疲的多增加一步的工作,把记录从Obsidian里搬进我的Github Blog。
环境: OpenWrt 23.05 目标: 实现外网通过 WireGuard 访问内网资源,并确保公网 IP 变动后自动同步。
要求
要用到异地访问内网,必须要有两个东西
- 我们的ISP提供一个公网IP给我们的宽带(动态变化也可以),并且主路由器需直接获取该公网 IP 作为 WAN 口地址,避免因光猫 NAT 转发导致的多重路由嵌套。
- 我们需要有一个域名,能够绑定在我们的公网IP上。
第1部分:DDNS 环节的回顾与复盘
1. 遇到的 Bug (故障点)
- 现象: 点击 “Update DDns Services List” 永远显示
NO_LIST,导致无法在下拉菜单中选择no-ip.com。
- 根本原因 (推测):
- OpenWrt 固件由于精简或网络原因,缺少 HTTPS 根证书 (
ca-certificates)。 - 或者路由器的 DNS 尚未配置好,无法解析下载列表的服务器地址。
- 这导致
wget或curl命令无法从 OpenWrt 官方源下载服务商数据包。
- OpenWrt 固件由于精简或网络原因,缺少 HTTPS 根证书 (
2. 挽救措施 (Workaround)
- 我们做了什么: 放弃了“依赖预设列表”的自动化路径,转而使用“手动挡” (Custom Mode)。
- 关键操作:
- 将服务商设为
-- custom --。 - 手动构造了 No-IP 的 API 更新链接:
http://[USERNAME]:[PASSWORD]@dynupdate.no-ip.com... - 关键修正: 考虑到可能存在的证书问题,我们使用了
http://而不是https://,并取消了 “Use HTTP Secure” 的勾选,确保在证书环境不完善的情况下也能成功握手。
3. 经验总结
在 OpenWrt 中,“预设列表” 只是一个为了方便的快捷方式,并不是必须的。 只要知道服务商的 API 格式,用 Custom 模式往往比修补系统环境(安装证书、排查网络)来得更快、更直接。
第二部分:WireGuard 服务端配置
1. 接口设置 (Interface)
- 名称:
wg0 - 私钥 (Private Key): 点击 Generate 生成一次。(注意: 此按钮之后严禁再点,否则所有已配对客户端全部失效)。
- 监听端口 (Listen Port):
51820 - IP 地址:
10.0.10.1/24(VPN 专用网段)
2. 防火墙设置 (Firewall) - 踩坑重点
这是最容易漏配导致“连不上”的地方,必须配置两处:
A. 区域 (Zone) 设置:
- 创建一个名为
vpn的区域,包含接口wg0。 - 入站/出站/转发 (Input/Output/Forward): 全部设为
Accept。 - Masquerading (伪装): 必须勾选(防止内网设备没回程路由)。
- MSS clamping: 建议勾选(解决部分网页打不开的问题)。
- 转发权限 (Forwarding): 必须允许转发到
wan(上外网) 和lan(访问内网)。
B. 通信规则 (Traffic Rules) - 开门规则:
如果不加这条,外网流量会被直接拦截。
- 协议: UDP
- 源区域: WAN
- 目标区域: Device (Input) <– 注意是 Device 不是 LAN
- 目标端口: 51820
- 动作: Accept
第三部分:客户端 (Peer) 配置与排错复盘
1. 添加 Peer 的标准流程
在 OpenWrt 界面添加客户端时,必须遵循以下规范,否则连不上:
- Public/Private Key: 在新建 Peer 时点击 Generate 生成。
- Allowed IPs: 分配固定 IP,例如
10.0.10.5/32。注意: 输入完必须回车或点击绿色的+号,使其变成灰色胶囊状,否则保存无效。 - Route Allowed IPs: 必须勾选 (否则路由表不生效)。
- Persistent Keep Alive: 必须填 25 (解决 NAT 环境下几分钟后断流问题)。
2. 生成二维码的“陷阱”与修正
点击 “Generate configuration” 生成二维码时,遇到了两个大坑:
坑 1:Endpoint 格式报错
- 现象: 在 Endpoint 栏填入
域名:51820,OpenWrt 报错 “Invalid hostname”,无法生成。 - 解决: 生成时只填纯域名
xxxx.ddns.net,生成二维码。 - 补救: 手机扫码后,必须手动编辑配置,在 Endpoint 域名后补上
:51820。
- 现象: 在 Endpoint 栏填入
坑 2:DNS 导致的握手失败 (玄学但真实)
- 现象: 如果 DNS 填入
192.168.0.1,在 5G 网络下无法建立连接;如果填入8.8.8.8,偶发连接慢。 - 最终方案: 生成二维码时,DNS 一栏留空 (或直接手机端清空)。
- 原理: 留空则使用手机运营商的 DNS 解析域名,握手速度最快。连接建立后,访问内网不受影响。
- 现象: 如果 DNS 填入
3. 多设备管理逻辑
- 误区: 曾尝试给一个 Peer 分配多个 IP (
.2,.3) 让多台设备共用。 - 结论: 不可行。 WireGuard 依靠公钥识别身份,多台设备共用同一私钥/配置会导致“路由摆动”,互相顶号。
- 正确做法: 一个设备 = 一个 Peer = 一个独立 IP。如果有 10 台设备,就需新建 10 个 Peer (Phone1, Phone2, Laptop…)。
第四部分:维护备忘 (血泪经验)
关于密钥更新:
wg0接口主界面 (General Settings) 里的 “Generate new key pair” 按钮是自毁按钮。一旦手滑点击并保存,路由器公钥变更,所有已分发的手机客户端将全部断连,必须全部重新扫码。 操作原则: 除非为了重置安全,否则永不点击该按钮。关于配置生效: 添加新 Peer 后,如果手机扫码后无法通过握手(无数据接收),不要死磕配置。 动作: 去 Interfaces 列表,对
wg0执行 Stop -> (等3秒) -> Start。这能强制刷新内存中的 Peer 列表。当前拓扑:
- Router IP: 10.0.10.1
- Phone2 (Peer 1): 10.0.10.3 (正常)
- Phone3 (Peer 2): 10.0.10.5 (DNS留空配置,正常)





