侧边栏壁纸
  • 累计撰写 46 篇文章
  • 累计创建 23 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Openwrt中关于Cloudflare的DDNS设置问题

elthon
2021-07-01 / 1 评论 / 1 点赞 / 2480 阅读 / 2673 字

今天用cloudflare的DNS来解析我的域名,然后配合openwrt的DDNS来实现动态IP地址解析。

之前的域名使用的aliyun来解析的,在域名字段这个直接填写实际访问的域名就可以了,比如 www.elthon.me 。 然后用cloudflare的ddns脚本的时候,也想当然直接填了 www.elthon.me ,结果系统报错,如是开始查日志信息,发现报这个WARN:could not detect 'zone id' for domain.tld: 'www.elthon.me'
查看cloudflare的API文档,发现获取更新域名的时候,URL地址中需要拼接zoneID这个值,显然这里是没有获取到zone id 这个值了。于是开始找这个ddns的更新脚本,在oepnwrt的这个位置 /usr/lib/ddns/update_cloudflare_com_v4.sh
vi编辑器打开后:

#!/bin/sh
#.Distributed under the terms of the GNU General Public License (GPL) version 2.0
#.based on Ben Kulbertis cloudflare-update-record.sh found at http://gist.github.com/benkulbertis
#.and on George Johnson's cf-ddns.sh found at https://github.com/gstuartj/cf-ddns.sh
#.2016-2018 Christian Schoenebeck <christian dot schoenebeck at gmail dot com>
[ -z "$CURL" ] && [ -z "$CURL_SSL" ] && write_log 14 "Cloudflare communication require cURL with SSL support. Please install"
[ -z "$username" ] && write_log 14 "Service section not configured correctly! Missing key as 'username'"
[ -z "$password" ] && write_log 14 "Service section not configured correctly! Missing secret as 'password'"
[ $use_https -eq 0 ] && use_https=1
local __HOST __DOMAIN __TYPE __URLBASE __PRGBASE __RUNPROG __DATA __IPV6 __ZONEID __RECID __PROXIED
local __URLBASE="https://api.cloudflare.com/client/v4"
local __TTL=120
__HOST=$(printf %s "$domain" | cut -d@ -f1)
__DOMAIN=$(printf %s "$domain" | cut -d@ -f2)
[ -z "$__HOST" ] && __HOST=$__DOMAIN
[ "$__HOST" != "$__DOMAIN" ] && __HOST="${__HOST}.${__DOMAIN}"
[ $use_ipv6 -eq 0 ] && __TYPE="A" || __TYPE="AAAA"

可以看到这里有两个变量 __HOST _DOMAIN,
然后看这两个变量怎么来的

__HOST=$(printf %s "$domain" | cut -d@ -f1)
__DOMAIN=$(printf %s "$domain" | cut -d@ -f2)

原来是读取了域名字段的值,然后根据@字符分割,前部分就是HOST,后部分就是DOMAIN。
为什么要这样呢?
因为前面说了cloudflare的API需要用到zone id, 这个zone id又怎么来了,每个域名都不一样,不可能写死在脚本里面。幸好cloudflare的api有一个查询功能,可以根据根域名来查询zones,根据这个IP,传入你的根域名(比如我这里就是elthon.me),就可以查询到elthon.me的zone id了,这样后续增对elthon.me的域名更新操作就拿到了zone id。所以问题就回到了如何识别DOMAIN,从这个脚本来看,他就是通过人为添加分割符的方式来识别的,从而引起了我最前面遇到的这个问题。当然这个脚本可以实现直接根据用户输入的域名来识别DOMAIN,只是比较麻烦了(需要搜集所有的顶级域名)

image.png

1

评论区