Cloudflare DDNS 动态域名解析脚本

本文最后更新于 2023年9月18日 上午

Cloudflare DDNS 动态域名解析脚本

一、前言

随着国内 IPv 6 网络的普及,现在普通家庭宽带基本上都能拿到公网 IPv 6 地址了。

有了公网 IPv 6 地址,也就可以在家里搭一个对外的服务了。

和以前的公网 IPv 4 地址一样,家庭宽带的公网 IPv 6 地址也不是固定的。所以我们必须把动态的 IPv 6 地址映射到一个静态的域名上,也就是使用 DDNS 服务。

本文将介绍如何利用 Cloudflare DNS API 来实现 IPv 6 DDNS。

二、示例环境

  • 操作系统:CentOS 7.5.1804
  • DDNS 域名:**ipv6-ddns.example.com**
  • 裸域名:**example.com**

三、操作步骤

3.1 获取裸域名的 Zone ID 及 API Key

在域名控制面板右下方的 API 一栏可直接获取到 Zone ID。API Key 则需要点击该栏下方的「Get your API key」,然后输入密码(可能还要验证码)确认才可获取。如下图:

说明
• 请妥善保管 API Key,防止泄露。

3.2 添加子域名的 AAAA 记录

点击域名控制面板的「DNS」选项卡,如下图:

image.png

然后在 DNS Records 这一栏的下方按下图提示添加相应的记录:

1、记录类型选择「AAAA」,也就是 IPv 6 地址记录。
2、Name 一栏填写子域名。例如 DDNS 域名是 ipv6-ddns.example.com 的话这里就填写 ipv6-ddns
3、IPv 6 address 一栏填写 ::1 即可。
4、TTL 选择 「2 minutes」。
5、由于这里不使用 CDN 功能,所以需要点击一下橙色的云图标让其变为灰色。
6、点击「Add Record」即可添加记录。

3.3 查询刚才添加的 AAAA 记录的 ID

按以下格式执行命令:

1
2
3
4
5
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/<刚才获取的 Zone ID>/dns_records?type=AAAA&name=<DDNS 域名>&content=127.0.0.1&page=1&per_page=100&order=type&direction=desc&match=any" \
-H "X-Auth-Email: <Cloudflare 账号的邮箱地址>" \
-H "X-Auth-Key: <刚才获取的 API Key>" \
-H "Content-Type: application/json" \
| python -m json.tool

例如

1
2
3
4
5
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/12345678901234567890/dns_records?type=AAAA&name=ipv6-ddns.example.com&content=127.0.0.1&page=1&per_page=100&order=type&direction=desc&match=any" \
-H "X-Auth-Email: mail@example.com" \
-H "X-Auth-Key: 11111111111111111111" \
-H "Content-Type: application/json" \
| python -m json.tool

运行结果

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
{
"errors": [],
"messages": [],
"result": [
{
"content": "::1",
"created_on": "2019-06-14T19:01:14.374270Z",
"id": "22222222222222222222", ← 22222222222222222222 就是刚才添加 AAAA 记录的 ID,请记下
"locked": false,
"meta": {
"auto_added": false,
"managed_by_apps": false,
"managed_by_argo_tunnel": false
},
"modified_on": "2019-06-14T19:01:14.374270Z",
"name": "ipv6-ddns.example.com",
"proxiable": true,
"proxied": false,
"ttl": 120,
"type": "AAAA",
"zone_id": "12345678901234567890",
"zone_name": "example.com"
}
],
"result_info": {
"count": 1,
"page": 1,
"per_page": 100,
"total_count": 1,
"total_pages": 1
},
"success": true
}

命令执行后会返回一段 JSON,找到 DDNS 域名对应的那个 Object,其中 id 的值就是刚才添加的 AAAA 记录的 ID。

3.4 创建 DDNS 脚本

请按实际情况修改以下内容,完成后粘贴到命令行窗口中按回车即可。

  1. sudo touch /etc/ipv6-ddns.sh
  2. sudo vim /etc/ipv6-ddns.sh
  3. 按实际内容修改下面的部分内容并复制粘贴进刚才创建的文件
    • 使用前请先安装 HTTPie
    • 这里获取的是你网卡中第一个 IPv6 地址,如需使用其他网络地址请自行修改此部分;
    • ttl1 时表示自动;
    • proxiedtrue 时表示开启 CDN 服务;
    • 若需要配置的是 IPv4 地址,请将 type=AAAA 修改为 type=A,以及修改 IP 地址获取部分修改为 ip -4
    • 更多配置信息请看 API 文档:Cloudflare API Documentation
1
2
3
4
5
6
#!/bin/sh
IP=$(ip -6 addr show dev <拥有公网 IPv6 地址的接口名> | grep global | awk '{print $2}' | awk -F "/" '{print $1; exit}')

[ -z $IP6 ] && exit

http --json --ignore-stdin PUT https://api.cloudflare.com/client/v4/zones/<刚才获取的 Zone ID>/dns_records/<刚才获取的 AAAA 记录 ID> X-Auth-Email:<Cloudflare 账号的邮箱地址> X-Auth-Key:<刚才获取的 API Key> type=AAAA name=<DDNS 域名> content=${IP} ttl:=1 proxied:=true

例如

1
2
3
4
5
6
#!/bin/sh
IP=$(ip -6 addr show dev ens160 | grep global | awk '{print $2}' | awk -F "/" '{print $1; exit}')

[ -z $IP6 ] && exit

http --json --ignore-stdin PUT https://api.cloudflare.com/client/v4/zones/12345678901234567890/dns_records/22222222222222222222 X-Auth-Email:mail@example.com X-Auth-Key:11111111111111111111 type=AAAA name=ipv6-ddns.example.com content=${IP} ttl:=1 proxied:=true
  1. sudo chmod +x /etc/ipv6-ddns.sh

使用 curl 的版本:

1
2
3
4
#!/bin/sh
IP6=$(ip -6 addr show dev <拥有公网 IPv6 地址的接口名> | grep global | awk '{print $2}' | awk -F "/" '{print $1; exit}')
[ -z $IP6 ] && exit
curl -X PUT "https://api.cloudflare.com/client/v4/zones/<刚才获取的 Zone ID>/dns_records/<刚才获取的 AAAA 记录 ID>" -H "X-Auth-Email: <Cloudflare 账号的邮箱地址>" -H "X-Auth-Key: <刚才获取的 API Key>" -H "Content-Type: application/json" --data '{"type":"AAAA","name":"<DDNS 域名>","content":"'"${IP6}"'","ttl":1,"proxied":true}'

3.5 试运行 DDNS 脚本

执行以下命令:

1
/etc/ipv6-ddns.sh | python -m json.tool

稍等片刻。如果执行结果中出现 "success":true 的话,说明域名的 AAAA 记录已经更新成功。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"errors": [],
"messages": [],
"result": {
"content": "1234:5678:9012:3456:7890:1234:5678:9012",
"created_on": "2019-06-14T22:20:51.008287Z",
"id": "22222222222222222222",
"locked": false,
"meta": {
"auto_added": false,
"managed_by_apps": false,
"managed_by_argo_tunnel": false
},
"modified_on": "2019-06-14T22:20:51.008287Z",
"name": "ipv6-ddns.example.com",
"proxiable": true,
"proxied": false,
"ttl": 120,
"type": "AAAA",
"zone_id": "12345678901234567890",
"zone_name": "example.com"
},
"success": true ← 更新成功
}

3.6 添加计划任务

下面我们设定每分钟执行一次 DDNS 脚本。

执行以下命令:

然后请在命令行窗口中按下 O(大写),将以下内容直接粘贴到命令行窗口中,再按下 ESC ,最后输入 :wq 按回车。

1
* * * * * /etc/ipv6-ddns.sh > /dev/null 2>&1

参考

  1. 基于 Cloudflare DNS API 部署 IPv6 DDNS - 知乎 (zhihu.com)
  2. ixinshang/Cloudflare-DDNS-Shell - 码云 - 开源中国 (gitee.com)
  3. Cloudflare搭建DDNS(脚本版) - BlogBackup (gitbook.io)
  4. 基于 Cloudflare DNS API 部署 IPv6 DDNS - 知乎 (zhihu.com)
  5. 使用cloudFlare实现动态DNS解析_cloudflare动态域名解析_WalkOnTwoLegs的博客-CSDN博客
  6. GitHub - imki911/DdnsOnCloudFlare: A shell script to automatic update cloudFlare dns record whit actual external ip address, leveraging the official CloudFlare api.
  7. Cloudflare-DDNS-Shell: Cloudflare 动态DNS Shell 脚本 (gitee.com)
  8. GitHub - wherelse/cloudflare-ddns-script: CloudFlare ddns / 树莓派IPV6 DDNS解决方案
  9. GitHub - xiaoduola99/Cloudflare_ddns: Cloudflare的动态域名解析脚本支持v4和v6
  10. Cloudflare API Documentation

Cloudflare DDNS 动态域名解析脚本
https://hexo.leelurker.com/posts/40910
作者
LeeLurker
发布于
2023年9月15日
许可协议