在 OpenWRT 上设置 DDNS

1. DDNS 原理

家用路由器或设备定期向 DDNS 服务商发送并更新设备当前 IP 地址,并和指定域名进行绑定。在进行域名解析时, DDNS 服务器会自动解析出当前 IP ,将访问者引向设置的 IP 地址。

2. Cloudflare API 测试

  1. 不推荐使用 Cloudflare 的 global key ,最好创建仅限于修改指定域名的专用 token
  2. Cloudflare Token 测试

    curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
         -H "Authorization: Bearer <YOUR_API_TOKEN>" \
         -H "Content-Type:application/json"
    

    YOUR_API_TOKEN 设置为已经申请好的 cloudflare token.

  3. 获取 Cloudflare Zone id

    curl -X GET "https://api.cloudflare.com/client/v4/zones?name=<ZONE_NAME>" \
         -H "Authorization: Bearer <YOUR_API_TOKEN>" \
         -H "Content-Type: application/json"
    

    此处的 ZONE_NAME 我使用的是 autove.dev ,也即当前网站的二级域名。

  4. 获取指定域名 DNS record id

    curl -X GET "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/dns_records?name=<SUB_DOMAIN>&type=AAAA" \
         -H "Authorization: Bearer <YOUR_API_TOKEN>" \
         -H "Content-Type: application/json"
    

    此处的 SUB_DOMAIN 用需要更新的 IP 对应的目标三级域名替换,从结果中拿到 RECORD_ID ,从而使用下一步来进行更新 IPv6 的 API 测试。在实际 OpenWRT 设置时,指定三级域名即可。

  5. Update IPv6 API 测试

    curl -X PUT "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/dns_records/<RECORD_ID>" \
         -H "Authorization: Bearer <YOUR_API_TOKEN>" \
         -H "Content-Type: application/json" \
         --data '{ "type": "AAAA", "name": "<SUB_DOMAIN>", "content": "<NEW_IP>", "ttl": 1, "proxied": false }'
    
  6. Cloudflare DNS 解析记录更新验证

    _20241006_143502screenshot.png

3. Openwrt 设置及测试

3.1. 更新设置

Luci Web Interface -> Services -> Dynamic DNS -> Information -> Edit -> Basic Settings: _20241005_105148screenshot.png OpenWRT DDNS 基础设置

3.2. 接口设置

Luci Web Interface -> Services -> Dynamic DNS -> Information -> Edit -> Advanced Settings: _20241005_101802screenshot.png 选择需更新 IP 对应的 Interface

3.3. 验证

Luci Web Interface -> Services -> Dynamic DNS -> Information: _20241005_105416screenshot.png 确认手动 DDNS 更新测试成功

4. 更新局域网设备地址

当有了 IPv6 地址后,一个好的实践是将主机的全局 IPv6 地址使用 DDNS 更新到指定的域名上。 实现这点主要在于获取局域网内连接到该路由器的设备全局 IPv6 地址。如何获取呢? 通过 /usr/bin/ip -6 neigh | grep $MAC_ADDR | grep -v -E '^f' | grep REACHABLE | awk '{print $1}' 命令来获取。 其中 MAC_ADDR 是局域网设备 MAC 地址。

Luci Web Interface -> Services -> Dynamic DNS -> Information -> Edit -> Advanced Settings: _20241008_212600screenshot.png 使用 Script 方式来获取 IP address

5. 访问防火墙设置

一般需要访问已绑定域名的更新 IP ,同时需要打开 WAN 口防火墙,将 WAN interface reject 修改为 accept

Luci Web Interface -> Network -> Firewall: _20241005_102112screenshot.png 开放防火墙以在公网访问端口或服务