异地访问(安全)家中计算机-(OpenWRT+No-IP+WireGuard)

What-is-this-Talking-About

这是一份我的工作笔记,几乎没有进行润色,AI帮助我把思考过程和尝试过程,包括弯路和最终解法都整理出来,写成文档的格式。
其实,自从我在Github Pages开通了博客,我就很自然的也很乐此不疲的多增加一步的工作,把记录从Obsidian里搬进我的Github Blog。

环境: OpenWrt 23.05 目标: 实现外网通过 WireGuard 访问内网资源,并确保公网 IP 变动后自动同步。


要求

要用到异地访问内网,必须要有两个东西

    1. 我们的ISP提供一个公网IP给我们的宽带(动态变化也可以),并且主路由器需直接获取该公网 IP 作为 WAN 口地址,避免因光猫 NAT 转发导致的多重路由嵌套。
    1. 我们需要有一个域名,能够绑定在我们的公网IP上。

第1部分:DDNS 环节的回顾与复盘

1. 遇到的 Bug (故障点)

  • 现象: 点击 “Update DDns Services List” 永远显示 NO_LIST,导致无法在下拉菜单中选择 no-ip.com
  • 根本原因 (推测):
    • OpenWrt 固件由于精简或网络原因,缺少 HTTPS 根证书 (ca-certificates)。
    • 或者路由器的 DNS 尚未配置好,无法解析下载列表的服务器地址。
    • 这导致 wgetcurl 命令无法从 OpenWrt 官方源下载服务商数据包。

2. 挽救措施 (Workaround)

  • 我们做了什么: 放弃了“依赖预设列表”的自动化路径,转而使用“手动挡” (Custom Mode)。
  • 关键操作:
    1. 将服务商设为 -- custom --
    2. 手动构造了 No-IP 的 API 更新链接:http://[USERNAME]:[PASSWORD]@dynupdate.no-ip.com...
    3. 关键修正: 考虑到可能存在的证书问题,我们使用了 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
  • 坑 2:DNS 导致的握手失败 (玄学但真实)

    • 现象: 如果 DNS 填入 192.168.0.1,在 5G 网络下无法建立连接;如果填入 8.8.8.8,偶发连接慢。
    • 最终方案: 生成二维码时,DNS 一栏留空 (或直接手机端清空)。
    • 原理: 留空则使用手机运营商的 DNS 解析域名,握手速度最快。连接建立后,访问内网不受影响。

3. 多设备管理逻辑

  • 误区: 曾尝试给一个 Peer 分配多个 IP (.2, .3) 让多台设备共用。
  • 结论: 不可行。 WireGuard 依靠公钥识别身份,多台设备共用同一私钥/配置会导致“路由摆动”,互相顶号。
  • 正确做法: 一个设备 = 一个 Peer = 一个独立 IP。如果有 10 台设备,就需新建 10 个 Peer (Phone1, Phone2, Laptop…)。

第四部分:维护备忘 (血泪经验)

  1. 关于密钥更新: wg0 接口主界面 (General Settings) 里的 “Generate new key pair” 按钮是自毁按钮。一旦手滑点击并保存,路由器公钥变更,所有已分发的手机客户端将全部断连,必须全部重新扫码。 操作原则: 除非为了重置安全,否则永不点击该按钮。

  2. 关于配置生效: 添加新 Peer 后,如果手机扫码后无法通过握手(无数据接收),不要死磕配置。 动作: 去 Interfaces 列表,对 wg0 执行 Stop -> (等3秒) -> Start。这能强制刷新内存中的 Peer 列表。

  3. 当前拓扑:

    • Router IP: 10.0.10.1
    • Phone2 (Peer 1): 10.0.10.3 (正常)
    • Phone3 (Peer 2): 10.0.10.5 (DNS留空配置,正常)