前言
总的来说就是想利用 CF 提供的dns记录操作 API ,为有动态公网IP的设备提供动态域名解析服务(DDNS),以方便使用域名实时更新公网IP的变动
注意,由于时间久远,cloudflare的api操作也发生了变动,请参考最新版的api文档
准备
首先说到 API ,具有操作权限的 Auth-key 是肯定需要提前准备好的,### 可以通过这个步骤来进行查看
- 首先访问到 Cloudflare官网
- 进行登陆
- 点击右上角头像并点击 My Profile (个人信息)
- 滚动到页面最下面,查看并记录 API Keys 中的 Global API Key ,他应该是一个由 0~9a~f 组成的字符串
如果没有 CF 账号的话请看这个步骤
- 首先访问到 Cloudflare官网
- 进行注册并完成邮箱认证
- 登陆域名控制台并点击 Add a Site 按钮添加一个域名的到 Cloudflare
- 按照提示完成域名 NS 的修改并等待 Cloudflare 进行认证
- 上述步骤完成后,点击右上角头像并点击 My Profile (个人信息)
- 滚动到页面最下面,查看并记录 API Keys 中的 Global API Key ,他应该是一个由 0~9a~f 组成的字符串
除了 Auth key ,大概还需要了解一下 CF 的 API 操作方法
基本方法就是看文档啦【直达链接】(咱知道一般来看 blog 的人都不会去看文档的。。。所以特意摘要了一下)
操作方法
- 请求地址:
https://api.cloudflare.com/client/v4/
- 所有请求都必须包含 Auth-Key (就是之前让记下的 API-Key )和 Auth-Email 头以进行身份验证
- 通过 HTTPS 发送JSON格式的负载发送请求
- 通过 GET 方法访问想获取 ID 的位置可以获取想要的各种 ID
为了进行操作,还需要简单的了解一个工具: cURL
cURL 的简单使用说明
- 基本格式
curl [参数] 地址
- 参数:
-H ##设置请求头部 -X ##使用指定的方法 比如 PUT GET POST --data ##上传数据 -v ##显示详细过程
还有一个方便在 shell 环境下筛选出指定内容的工具 grep
大致上就是可以把输入的文本按照要求找到,支持正则表达式。。。具体的自己百度一下吧。。。本文就更多不赘述了。。。基本用法就是 grep [参数] [条件]。。。
实现
首先通过阅读 CF 的 API 得知,更新域名的操作方法是 PUT 到
https://api.cloudflare.com/client/v4/zones/[zone_id]/dns_records/[域名id]
然后通过阅读 CF 的 API 得知,获取各种ID的方法是直接 GET。。可以通过各种参数进行筛选。。
于是就可以知道 zone_id 可以通过
GET https://api.cloudflare.com/client/v4/zones
获得,并通过域名进行筛选,于是就变成了
GET https://api.cloudflare.com/client/v4/zones?name=[你的域名(不包括二级域名及之后的部分)]
执行后就会收到回复### 整理一下长这样:
{
"result":[{
"id":"//区域ID",
"name":"//域名",
"status":"active", //状态
"paused":false, //是否暂停
"type":"full",
"development_mode":0, //开发模式
"name_servers":[
"curt.ns.cloudflare.com",
"fiona.ns.cloudflare.com" //名称服务器
],
"original_name_servers":[
//原名称服务器
],
"original_registrar":原注册商,
"original_dnshost":原DNS主机,
"modified_on":"//最后修改时间",
"created_on":"//创建时间",
"activated_on":"激活时间",
"meta":{
标签
},
"owner":{
//所有者信息
},
"account":{
//账号相关的信息
},
"permissions":[
//各种权限
],
"plan":{
//每次冲多少钱
}
}],
"result_info":{
//结果信息
},
"success":true, //是否成功
"errors":[], //错误代码
"messages":[] //信息
}
然后获取想要的域名记录的id
GET https://api.cloudflare.com/client/v4/zones/[刚才获取的zone_id]/dns_records?name=[已添加的,预计用于ddns的子域名(包括二级域名及之后的主机名)]
然后就会收到回复啦
整理之后大概长这样
{
"result":[{
"id":"//这个子域名的记录id",
"type":"A", //记录类型(比如 A 就是IPv4记录)
"name":"//刚才指定的子域名",
"content":"//现在指向的地址",
"proxiable":true, //是否可代理
"proxied":false, //是否启用代理(也就是CDN啦)
"ttl":1, //TTL 生存时间(单位:秒) 取值范围:1 or [120,2147483647]
"locked":false, //锁定
"zone_id":"//区域id",
"zone_name":"区域名称(域名)",
"modified_on":"//修改于",
"created_on":"//创建于",
"meta":{
//标签
}
}],
"result_info":{
//结果信息
},
"success":true, //是否成功
"errors":[], //错误代码
"messages":[] //信息
}
然后就是检查公网IP地址。。。
比如直接
curl ip.sb
于是就可以直接发送请求啦
使用
总之。。。。简单的整理下就是。。。
#!/bin/bash
AuthKey="" ##在这里输入 API Key
AuthMail="" ##在这里输入在 Cloudflare 使用的邮箱
DDnsName="" ##在这里输入已经添加的,预计用于ddns的完整域名(完整的。。比如希望使用ddns.example.com作为ddns域名时,输入ddns.example.com)
domain="" ##在这里输入绑定到 Cloudflare 的域名(比如希望使用ddns.example.com作为ddns域名时,输入example.com)
new_ip=$(curl ip.sb)
zone_id=$(curl "https://api.cloudflare.com/client/v4/zones?name=$domain" -H "X-Auth-Email: $AuthMail" -H "X-Auth-Key: $AuthKey" | grep -oP "\"id\":\"[a-f\d]{32}"|grep -oP "[a-f\d]{32}"|head -n1)
dns_record_id=$(curl "https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records?name=$domain" -H "X-Auth-Email: $AuthMail" -H "X-Auth-Key: $AuthKey" | grep -oP "\"id\":\"[a-f\d]{32}"|grep -oP "[a-f\d]{32}"|head -n1)
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_id/dns_records/$dns_record_id" -H "X-Auth-Email: $AuthMail" -H "X-Auth-Key: $AuthKey" --data '{"type":"A","name":"'$DDnsName'","content":"'$new_ip'","ttl":600,"proxied":false}'
把这个保存到 yukiddns.sh ,然后赋予可执行权限后定期运行这个脚本就可以了