为 Openwrt 配置 ddns-go

看了网上的教程,配置动态 DNS 非常简单。当时还是遇到了一些问题,故此记录一下。

1. 安装 ddns-go

在 Openwrt 的 Web 界面中,进入 系统 -> 软件包,使用链接进行安装

luci-app-ddns-go

在 Release 中找到最新版本,安装本体,luci,语言包

2. 配置防火墙

网上很多配置 DDNS-Go 的教程都没有提到防火墙的配置,或许是因为教程大多是19年22年的,那个时候 Openwrt 的主流版本是 19.x 和 21.x

现在我使用的是 23.x 的版本,防火墙的配置和之前的版本有些不同

在 Openwrt 的 Web 界面中,进入 网络 -> 防火墙

点击暴露至公网,添加自定义的端口,以及勾选暴露后台至公网,协议:TCP

也可以手动编写通行规则

手动编写通信规则

我发现上面的这种方法不是所有固件都适用,所以还有一种手动编写防火墙规则的方法

/etc/config/uhttpd 找到以下内容

1
2
3
config uhttpd 'main'
...
option listen_https '[::]:443'

把443改成你的端口号,然后重启 /etc/init.d/uhttpd restart

然后编写防火墙规则 vi /etc/config/firewall

1
2
3
4
5
6
7
config rule
option name 'Allow-HTTPS-from-WAN-443'
option src 'wan'
option dest_port '443'
option proto 'tcp'
option family 'ipv6'
option target 'ACCEPT'

dest_port 改成你设置的端口号

然后重启防火墙 /etc/init.d/firewall restart

为啥要改掉 443 呢?因为 ISP 封禁了 80、443、8080 端口的访问,导致无法访问 Openwrt 的后台,所以需要改成其他端口

3. 配置 Cloudflare

在 Cloudflare 的后台,添加一个新的域名解析记录

  • 类型:AAAA

  • 名称:自定义

  • IPv6 地址:随便,填写 fe80::1 或者 ::1 都可以

  • TTL:自动

  • 代理状态:关闭

然后退出域名,在个人中心的 API Tokens 中,点击 Create Token,选择 Edit zone DNS 的模板,指定你的域名,点击 Continue to summary,然后点击 Create Token

4. 配置 ddns-go

在 Openwrt 的 Web 界面中,进入 服务 -> DDNS-Go,点击启用

跳过证书验证,配置完成后,点击 保存并应用

打开 ddns-go 的后台,设置账号密码

  • DNS 服务商:Cloudflare

  • 填入CloudFlare提供的Token

  • IPv4 地址: 取消勾选

  • IPv6 地址: 通过命令获取

    1
    ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '$3 == "::1" { next;} $3 ~ /^fe80::/ { next;} /inet6/ {print $3}' | head -n 1 | awk '{print "[" $1 "]:你的端口号"}'

这条命令会获取本机的 IPv6 地址,格式为 [IPv6地址]:端口号,但是好像又多此一举了,CF的后台并没有变化,可以使用前两种方式获取IP地址。

5. 测试

先ping域名,若无IP返回,检查DNS配置,如果没问题,

访问 域名:端口号,如果能访问到 Openwrt 的后台,说明配置成功;

否则检查防火墙配置。

因为大部分 CF 都配置了强制 HTTPS,所以访问时需要使用 HTTPS 协议。

参考

  • OpenWrt配置和使用DDNS-GO

  • 正确地配置 IPv6 防火墙和 DDNS 以在公网访问设备