本文最后更新于 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」选项卡,如下图:
然后在 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: [email protected]" \ -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 脚本
请按实际情况修改以下内容,完成后粘贴到命令行窗口中按回车即可。
sudo touch /etc/ipv6-ddns.sh
sudo vim /etc/ipv6-ddns.sh
- 按实际内容修改下面的部分内容并复制粘贴进刚才创建的文件
- 使用前请先安装
HTTPie
- 这里获取的是你网卡中第一个
IPv6
地址,如需使用其他网络地址请自行修改此部分;
ttl
为 1
时表示自动;
proxied
为 true
时表示开启 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:[email protected] X-Auth-Key:11111111111111111111 type=AAAA name=ipv6-ddns.example.com content=${IP} ttl:=1 proxied:=true
|
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
|
参考
- 基于 Cloudflare DNS API 部署 IPv6 DDNS - 知乎 (zhihu.com)
- ixinshang/Cloudflare-DDNS-Shell - 码云 - 开源中国 (gitee.com)
- Cloudflare搭建DDNS(脚本版) - BlogBackup (gitbook.io)
- 基于 Cloudflare DNS API 部署 IPv6 DDNS - 知乎 (zhihu.com)
- 使用cloudFlare实现动态DNS解析_cloudflare动态域名解析_WalkOnTwoLegs的博客-CSDN博客
- GitHub - imki911/DdnsOnCloudFlare: A shell script to automatic update cloudFlare dns record whit actual external ip address, leveraging the official CloudFlare api.
- Cloudflare-DDNS-Shell: Cloudflare 动态DNS Shell 脚本 (gitee.com)
- GitHub - wherelse/cloudflare-ddns-script: CloudFlare ddns / 树莓派IPV6 DDNS解决方案
- GitHub - xiaoduola99/Cloudflare_ddns: Cloudflare的动态域名解析脚本支持v4和v6
- Cloudflare API Documentation