通过 CloudFlare 提供的 API 在群辉上实现 DDNS

这是一篇发布于 1599 天前的文章,部分信息可能已发生改变。

RT,这篇文章是我在群晖上实现 DDNS 的记录,主要是通过 CloudFlare 提供的 API 来实现的。

准备工作

首先,你需要有个域名,还得注册了 CF,最后将域名的 Name Server 更改为 Cloudflare 的地址。

获取各种API秘钥

在Cloudflare的域名右侧找到ZoneID记下 然后点击Get your API key
在Global API keys栏里 找到Global API key 点View查看记下

还需要获得上面要DDNS的域名的Record ID 这个用Cloudflare的API获取 用上面得到的API key和Zone ID 在终端执行一下代码 返回结果中的ID便是需要用到的域名Record ID

在官方文档中我们可以得知 使用以下命令来查询自己的Record ID

1
2
3
4
curl -X GET "https://api.cloudflare.com/client/v4/zones/[YOUR-ZONE-ID]/dns_records?type=A&name=example.com&content=127.0.0.1&page=1&per_page=20&order=type&direction=desc&match=all" \
-H "X-Auth-Email: [user@example.com]" \
-H "X-Auth-Key: [YOUR-API-KEY]" \
-H "Content-Type: application/json"

将上文中的 “[user@example.com]” 替换为你自己的注册邮箱 并将 “[YOUR-API-KEY]” 和 “[YOUR-ZONE-ID]” 替换为自己的key即可

在输入以上命令后 如果没出什么岔子的话 你会得到这样的回复,找到并记下 Record ID。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"success": true,
"errors": [],
"messages": [],
"result": [
{
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxx",
# 上面一行便是你的Record ID
"type": "A",
"name": "example.com",
"content": "198.51.100.4",
"proxiable": true,
"proxied": false,
"ttl": {},
"locked": false,
"zone_id": "YOUR_ZONE_ID",
"zone_name": "USER@example.com",
"created_on": "2014-01-01T05:20:00.12345Z",
"modified_on": "2014-01-01T05:20:00.12345Z",
"data": {}
}
]
}

配置DDNS

使用 Root 权限登陆群晖

输入以下两行命令 下载脚本到 /sbin 中

1
2
3
wget https://raw.githubusercontent.com/joshuaavalon/SynologyCloudflareDDNS/master/cloudflareddns.sh -O /sbin/cloudflaredns.sh
# 给与执行权限
chmod +x /sbin/cloudflaredns.sh

并修改其中的CloudFlare Config配置:

1
2
3
4
5
6
7
8
9
10
__RECTYPE__="A"
# DNS记录类型,IPv4 是 A,IPv6 是 AAAA
__RECID__=""
# 获取到的 Record ID
__ZONE_ID__=""
# Zone ID
__TTL__="1"
# TTL=1时为自动 这一行不用管
__PROXY__="ture"
# 是否使用CF的代理(小黄云)

修改群晖的DDNS配置文件 添加Cloudflare项 可以执行以下代码添加 也可以直接编辑/etc.defaults/ddns_provider.conf文件

1
2
3
4
5
cat >> /etc.defaults/ddns_provider.conf << 'EOF'
[Cloudflare]
modulepath=/sbin/cloudflaredns.sh
queryurl=https://www.cloudflare.com/
EOF

登陆群晖的Web -> 控制面板 -> 外部访问 -> DDNS,然后抄下面作业就行了

  • 服务提供商选Cloudflare
  • 主机名称是DDNS域名
  • 用户名是Cloudflare的注册邮箱
  • 密码是API key

脚本备份


如果你没有富强工具的话,你大概率连不上 raw.githubusercontent.com 吃枣药丸,这里作为一个备份给没有富强工具的小伙伴。

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/sh

# DSM Config
__USERNAME__="$(echo ${@} | cut -d' ' -f1)"
__PASSWORD__="$(echo ${@} | cut -d' ' -f2)"
__HOSTNAME__="$(echo ${@} | cut -d' ' -f3)"
__MYIP__="$(echo ${@} | cut -d' ' -f4)"

# log location
__LOGFILE__="/var/log/cloudflareddns.log"

# CloudFlare Config
__RECTYPE__="A"
__RECID__=""
__ZONE_ID__=""
__TTL__="1"
__PROXY__="true"

log() {
__LOGTIME__=$(date +"%b %e %T")
if [ "${#}" -lt 1 ]; then
false
else
__LOGMSG__="${1}"
fi
if [ "${#}" -lt 2 ]; then
__LOGPRIO__=7
else
__LOGPRIO__=${2}
fi

logger -p ${__LOGPRIO__} -t "$(basename ${0})" "${__LOGMSG__}"
echo "${__LOGTIME__} $(basename ${0}) (${__LOGPRIO__}): ${__LOGMSG__}" >> ${__LOGFILE__}
}

__URL__="https://api.cloudflare.com/client/v4/zones/${__ZONE_ID__}/dns_records/${__RECID__}"

# Update DNS record:
log "Updating with ${__MYIP__}..."
__RESPONSE__=$(curl -s -X PUT "${__URL__}" \
-H "X-Auth-Email: ${__USERNAME__}" \
-H "X-Auth-Key: ${__PASSWORD__}" \
-H "Content-Type: application/json" \
--data "{\"type\":\"${__RECTYPE__}\",\"name\":\"${__HOSTNAME__}\",\"content\":\"${__MYIP__}\",\"ttl\":${__TTL__},\"proxied\":${__PROXY__}}")

# Strip the result element from response json
__RESULT__=$(echo ${__RESPONSE__} | grep -Po '"success":\K.*?[^\\],')
echo ${__RESPONSE__}
case ${__RESULT__} in
'true,')
__STATUS__='good'
true
;;
*)
__STATUS__="${__RESULT__}"
log "__RESPONSE__=${__RESPONSE__}"
false
;;
esac
log "Status: ${__STATUS__}"

printf "%s" "${__STATUS__}"