南琴浪博客

使用 CloudFlare 实现 DDNS (动态域名解析)

09/28/2017

动态 DNS(英语:Dynamic DNS,简称 DDNS)是域名系统(DNS)中的一种自动更新名称服务器(Name server)内容的技术。根据互联网的域名订立规则,域名必须跟从固定的IP地址。但动态DNS系统为动态网域提供一个固定的名称服务器(Name server),通过即时更新,使外界用户能够连上动态用户的网址。摘自 维基百科-动态DNS

当你需要使用你的域名指向一个动态 ip 时,就需要有一个支持动态 dns 的域名托管商。
CloudFlare 是非常有名的域名托管商和 CDN 提供商,提供高质量的免费服务,拥有国内外大量用户。本文就将讲解如何使用 CloudFlare 实现 DDNS (动态域名解析)

开始操作

CloudFlare 提供有非常强大的 API ,具体可以参看 Cloudflare API documentation v4
为了实现 DDNS ,需要使 A记录指向的 ip 的能够动态变化,我们这里利用 API 进行定时操作

获取帐号信息

首先要 获取你的 CloudFlare 帐号的相关信息

1.邮箱
就是你的 CloudFlare 帐号的邮箱
进入 “https://www.cloudflare.com/a/profile“ 就能看到
这是你的 CloudFlare 帐号的邮箱

2.zone_id
这个位于 “https://www.cloudflare.com/a/overview“ 的第二块区域 “Domain Summary” 的右侧
下滑到第二块区域 "Domain Summary" 的右侧就能看到

3.api_key
找到 zone_id 后,点击 “Get your API key” ,往下滑动到第四块区域 “API Key” ,点击第一行 “Global API Key” 后面的 “View API Key”
找到这个菜单
这就是你的 api_key

创建 DNS Record

example:

[email protected]:~ 
#执行
    curl -X POST "https://api.cloudflare.com/client/v4/zones/8ee1be75cxxxx(我的zone_id)/dns_records" \
    -H "X-Auth-Email: xxxx(我的帐号的邮箱)" \
    -H "X-Auth-Key: 8405868bdxxxx(我的api_key)" \
    -H "Content-Type: application/json" \
    --data '{"type":"A","name":"test.nanqinlang.com(指定要创建记录的域名)","content":"127.0.0.1(指定A记录指向的ip)","ttl":120(指定ttl),"proxied":false}'
#返回结果
{"result":{"id":"3abbbaba2xxxx(这条创建的dns记录的id)","type":"A","name":"test.nanqinlang.com(创建记录的域名)","content":"127.0.0.1(A记录指向的ip)","proxiable":false,"proxied":false,"ttl":120,"locked":false,"zone_id":"8ee1be75cxxxx(我的zone_id)","zone_name":"nanqinlang.com","modified_on":"2017-09-27T16:38:18.430924Z","created_on":"2017-09-27T16:38:18.430924Z","meta":{"auto_added":false}},"success":true(命令执行成功),"errors":[],"messages":[]}

执行成功后,创建的记录如图
记录创建成功后,就能在 DNS Records 中看到了

查看 DNS Record 列表

执行下面这个命令后,shell 窗口中会列出你的帐号上的所有 dns 记录(不仅仅是A记录)
在 cloudflare ,每一条解析记录都有对应的一个固定的 id
为了能够通过 API 修改解析记录,我们需要通过此步骤来获取这个 id
example:

[email protected]:~ 
#执行
    curl -X GET "https://api.cloudflare.com/client/v4/zones/8ee1be75cxxxx(我的zone_id)/dns_records" \
    -H "X-Auth-Email: xxxx(我的帐号的邮箱)" \
    -H "X-Auth-Key: 8405868bdxxxx(我的api_key)" \
    -H "Content-Type: application/json"
#返回结果
{"result":[{"id":"3625aca17xxxx(这条被查看的dns记录的id)","type":"A","name":"nanqinlang.com(域名)","content":"xx.xx.xx.xx(A记录指向的ip)","proxiable":true,"proxied":true(启用cloudflare反代与否的状态值),"ttl":1(1 表示 auto ttl),"locked":false,"zone_id":"8ee1be75cxxxx(我的zone_id)","zone_name":"nanqinlang.com(根域名)","modified_on":"2017-09-26T15:24:00.567936Z","created_on":"2017-09-26T15:24:00.567936Z","meta":{"auto_added":false}}}

其中的 "id":"3625aca17xxxx" 就是你需要的 dns 记录的 id

更新 DNS Record

当创建好解析记录,并获取了这条记录的 id 之后,
为了实现动态解析,每当你的公网 ip 发生变化,就需要更新 dns 记录,将A记录指向你的新 ip
example:

[email protected]:~ 
#执行
    curl -X PUT "https://api.cloudflare.com/client/v4/zones/8ee1be75cxxxx(我的zone_id)/dns_records/3abbbaba2xxxx(这条dns记录的id)" \
    -H "X-Auth-Email: xxxx(我的帐号的邮箱)" \
    -H "X-Auth-Key: 8405868bdxxxx(我的api_key)" \
    -H "Content-Type: application/json" \
    --data '{"type":"A","name":"test.nanqinlang.com(指定要更新记录的域名)","content":"110.119.120.233(指定A记录指向的ip)","ttl":180(指定ttl),"proxied":false}'
#返回结果
{"result":{"id":"3abbbaba2xxxx(这条要更新的dns记录的id)","type":"A","name":"test.nanqinlang.com(更新了记录的域名)","content":"110.119.120.233(更新后的指向ip)","proxiable":true,"proxied":false,"ttl":180(更新后的ttl),"locked":false,"zone_id":"8ee1be75cccxxxx(我的zone_id)","zone_name":"nanqinlang.com","modified_on":"2017-09-27T16:58:23.547640Z","created_on":"2017-09-27T16:58:23.547640Z","meta":{"auto_added":false}},"success":true(命令执行成功),"errors":[],"messages":[]}

将此命令进行定时任务后,就实现了 DDNS 域名动态解析 了。

我的脚本

https://github.com/nanqinlang-script/CloudFlare_DNSRecord_Modifier
写了一个脚本用于实现此目的,配合定时任务食用即可
请注意,本文所讲的方法并不仅仅能用于 DDNS 的配置,
也能单纯的用于对某条 dns 记录的单一次的创建和修改