基于Cloudflare API的动态DNS(DDNS)Shell脚本

为什么要写这个

家里的网络环境是电信200M光纤,虽然很容易的拿到了公网IP,但是IP的变换速度很不规则。所以需要做DDNS实时把IP解析到自己的域名上。之前一直用DnsPod的免费版,好处是群晖的控制面板可以直接进行配置。最近由于做博客的需求,把NS记录改成了Cloudflare的以方便使用他家提供的CDN。那么问题就来了,群晖NAS本身不支持CF的DDNS服务,再加上网络上许多介绍Cloudflare DDNS脚本的文章没法用或者写的不详细。自己在aipeach/cloudflare-api-v4-ddns的基础上做了一些修改,产生了这篇文章。

更新

2020.5.23更新,修复了由于CloudflareAPI修改导致的脚本提示错误,但实际修改记录成功的bug。

首先,我也不经常写linux脚本,所以对于.sh文件就像看天书一样XD,通过查找很多资料然后添加断点,找出了原因:没有办法正常获取解析记录ID(在官方文档里面叫Record ID),初步感觉应该是脚本过于老旧,但是CloudflareAPI经常更新的缘故。
那么就有两个解决办法,直接手动获取Record ID填进去,或者改脚本。
但是Record ID这东西貌似删除记录然后重新创建就会变动,到时候要重新获取,就很麻烦,所以我采用了一劳永逸的办法。顺便给脚本加入了日志功能,把整个脚本汉化了一遍然后修复了一些小bug。

那么要怎么用呢?

首先下载这个脚本,如果你在linux环境下,且有条件“面对国内网络环境”,可以使用这个命令
使用它的前提是你有安装curl,如何安装curl

1
curl https://raw.githubusercontent.com/acha666/cloudflare-api-v4-ddns/master/cf-v4-ddns.sh > /usr/local/bin/cf-ddns.sh && chmod +x /usr/local/bin/cf-ddns.sh

或者通过我的博客下载(可能不会是最新版)

1
curl https://acha666.cn/contents/cloudflare-api-v4-ddns/cf-v4-ddns.sh > /usr/local/bin/cf-ddns.sh && chmod +x /usr/local/bin/cf-ddns.sh

在Windows环境下可以去我的项目地址直接下载
然后打开这个脚本,需要手动配置的地方已经使用注释标出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 你的Global API Key, 请见 https://dash.cloudflare.com/profile/api-tokens,
# 如果填写错误会造成请求错误
CFKEY="b8c657a9b6ca96ba9babfdd9fa8bfa9dba9bf"

# Cloudflare登录邮箱, 例如: user@example.com
CFUSER="username@example.com"

# 主域名,即二级域名,或者说站点名称, 例如: example.com
CFZONE_NAME="example.com"

# 想要进行ddns的域名, 例如: homeserver.example.com,也可以是二级域名如 example.com
# 请分别设置用于IPv4 DDNS 和 IPv6 DDNS 的域名。
# 当然,两者可以相同也可以其中一个不填(如果你用不着其中一项的话)
CFRECORD_NAMEV4="ddns.example.com"
CFRECORD_NAMEV6="ddnsv6.example.com"

# 记录类型, A(IPv4)|AAAA(IPv6), 默认 IPv4
CFRECORD_TYPE="A"

# TTL设置, 在 120 和 86400 秒之间
CFTTL=120

# 忽略本地ip文件,强制更新记录
FORCE=false

# 用于获取公网IP的地址, 可以换成其他的比如: bot.whatismyipaddress.com, https://api.ipify.org/ ...
# 请分别设置用于IPv4 DDNS 和 IPv6 DDNS 的参数。
# 当然,两者可以相同也可以其中一个不填(如果你用不着其中一项的话)
WANIPSITEV4="http://ipv4.icanhazip.com"
WANIPSITEV6="http://ipv6.icanhazip.com"

# 这个文件将会存储你的zoneid和recordid等信息,可以是绝对路径或者相对路径
# 请分别设置用于IPv4 DDNS 和 IPv6 DDNS 的路径。
# 当然,两者可以相同也可以其中一个不填(如果你用不着其中一项的话)
ID_FILEV4="cloudflare.v4.ids"
ID_FILEV6="cloudflare.v6.ids"

# 这个文件将会在每一次IPv4地址变更后存储下当前IP,作为对比
# 请分别设置用于IPv4 DDNS 和 IPv6 DDNS 的路径。
# 当然,两者可以相同也可以其中一个不填(如果你用不着其中一项的话)
WAN_IP_FILEV4="ipv4.txt"
WAN_IP_FILEV6="ipv6.txt"

# 日志文件路径,分别是IPv4和IPv6,可以为同一个,不会互相覆盖
LOG_FILEV4="cf_ddns.log"
LOG_FILEV6="cf_ddns.log"

当然,你也可以选择不使用默认配置,在shell中用参数提供这些信息

1
2
3
4
5
6
# 用法:
# cf-ddns.sh -k <你的cloudflare api key> \
# -u <Cloudflare登录邮箱> \
# -h <host.example.com> \ # 你想要DDNS的完整域名
# -z <example.com> \ # 主域名,即二级域名,或者说站点名称
# -t <A|AAAA> # IPv4模式或者IPv6模式;默认IPv4

配置完成后,运行bash cf-ddns.sh即可

设置crontab计划任务

十分简单,首先输入crontab -e
然后在文件中添加新的一行

1
*/1 * * * * "/usr/local/bin/cf-ddns.sh" >/dev/null 2>&1

这样将会每分钟执行一次这个脚本。把*/1改成*/10就是每10分钟执行一次。
如果你改变了cf-ddns.sh的所在位置,相应的,你也要把/usr/local/bin/cf-ddns.sh改变成正确的目录。
当然,你也可以在cf-ddns.sh之后添加相应的参数。
不过,如果你和我一样使用群晖,只需要在控制面板-计划任务中添加新项目,然后设置好时间就行

注意事项

1.不能同时存在两个记录名相同的记录(比如一个example.com的A记录和example.com的MX记录),会发生错误已经修复这个蛋疼的问题,现在有100个也没问题(话说哪里来的100种类型的记录啊= =)
2.脚本只在群晖DSM和Centos环境下测试,不过Ubuntu之类的也应该可以跑吧
3.如果要使用IPv6模式,当然首先你要保证你能够正常访问IPv6网站啦~测试一下吧
4.貌似没有了,因为我能发现的问题都修复完了

要是还是有BUG怎么办?

看下面↓↓↓,给我留言就好,有人回复你时你会收到邮件提醒。或者你也可以选择提交Issue,不过可能没那么快得到回复