前言

总的来说就是想利用 CF 提供的dns记录操作 API ,为有动态公网IP的设备提供动态域名解析服务(DDNS),以方便使用域名实时更新公网IP的变动

注意,由于时间久远,cloudflare的api操作也发生了变动,请参考最新版的api文档

准备

首先说到 API ,具有操作权限的 Auth-key 是肯定需要提前准备好的,### 可以通过这个步骤来进行查看

  1. 首先访问到 Cloudflare官网
  2. 进行登陆
  3. 点击右上角头像并点击 My Profile (个人信息)
  4. 滚动到页面最下面,查看并记录 API Keys 中的 Global API Key ,他应该是一个由 0~9a~f 组成的字符串

如果没有 CF 账号的话请看这个步骤

  1. 首先访问到 Cloudflare官网
  2. 进行注册并完成邮箱认证
  3. 登陆域名控制台并点击 Add a Site 按钮添加一个域名的到 Cloudflare
  4. 按照提示完成域名 NS 的修改并等待 Cloudflare 进行认证
  5. 上述步骤完成后,点击右上角头像并点击 My Profile (个人信息)
  6. 滚动到页面最下面,查看并记录 API Keys 中的 Global API Key ,他应该是一个由 0~9a~f 组成的字符串

除了 Auth key ,大概还需要了解一下 CF 的 API 操作方法
基本方法就是看文档啦【直达链接】(咱知道一般来看 blog 的人都不会去看文档的。。。所以特意摘要了一下)

操作方法

  1. 请求地址:
    https://api.cloudflare.com/client/v4/
  2. 所有请求都必须包含 Auth-Key (就是之前让记下的 API-Key )和 Auth-Email 头以进行身份​​验证
  3. 通过 HTTPS 发送JSON格式的负载发送请求
  4. 通过 GET 方法访问想获取 ID 的位置可以获取想要的各种 ID

为了进行操作,还需要简单的了解一个工具: cURL

cURL 的简单使用说明

  • 基本格式
    curl [参数] 地址
  • 参数:
    -H ##设置请求头部
    -X ##使用指定的方法 比如 PUT GET POST
    --data ##上传数据
    -v ##显示详细过程
部分没有默认安装 curl 的 Linux 发行版 请自行决定如何安装 curl

还有一个方便在 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 ,然后赋予可执行权限后定期运行这个脚本就可以了