DNSControl 是一个由 StackExchange 及开源社区开发的一款产品,能通过 DSL(Domain Specific Language)同时管理多个厂商的 DNS 记录
代码地址:https://github.com/StackExchange/dnscontrol
官网地址:https://dnscontrol.org/
支持的 DNS 厂商列表:https://docs.dnscontrol.org/service-providers/providers
先来看一个最小的例子吧,更多例子也可以看官方文档中的 示例
D("example.com", REG_PORKBUN, DnsProvider(DSP_CLOUDNS),
A("@", "1.2.3.4"),
A("server1", "2.3.4.5"),
AAAA("wide", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"),
CNAME("www", "server1"),
CNAME("another", "service.mycloud.com."),
MX("mail", 10, "mailserver"),
MX("mail", 20, "mailqueue"),
TXT("the", "message"),
NS("department2", "ns1.dnsexample.com."),
NS("department2", "ns2.dnsexample.com.")
)
通过这个代码,我们能很方便的定义一个域名 example.com
,它在 Porkbun 注册,使用 ClouDNS 作为权威 DNS
当一切配置妥当,运行 dnscontrol push
时,程序首先会自动去 Porkbun 将这个域名的 NS 地址修改为 ClouDNS 的 NS 服务器地址
然后会根据配置文件中的定义,在 ClouDNS 生成对应的 A 记录、AAAA 记录、CNAME 记录等
这难道不是一个非常酷的事情吗?
畅想一下,你可以把这个配置放在 Git 仓库上,哪天不小心删了某个解析记录,你也能通过 git history 找回,并能快速回滚
再畅想一下,哪天你不想用 ClouDNS 了,转去用 Gcore DNS 了,你只需要将 DnsProvider
修改为 Gcore,再重新运行 push
一下,同样的记录就会完完整整的同步到 Gcore 上,省去了大量迁移解析记录的时间
接下来我们快速来过一下使用方法,可以参考官方的 Getting Started
- 下载安装
程序是 Go 写的,你可以从官方仓库中获取源代码自己构建,也可以去 GitHub 下载已经构建好的版本
当然部份发行版的软件仓库里直接就有了,可以直接从软件仓库中去安装
- 创建一个文件夹存放配置文件
- 创建一个
dnsconfig.js
文件,该文件放置了你的域名解析记录的定义,例如
var REG_NONE = NewRegistrar("none");
var DNS_CLOUDFLARE = NewDnsProvider("cloudflare");
D("example.com", REG_NONE, DnsProvider(DNS_CLOUDFLARE),
A("@", "1.2.3.4")
);
这里定义了一个 REG_NONE
空注册商,以及一个 DNS 服务器厂商
NewRegistrar
是域名注册商,是你购买域名的地方
NewDnsProvider
是 DNS 权威服务器厂商,是你平时解析记录的地方
详细的列表可以看上面的链接
- 创建一个
creds.json
文件,该文件放置了你 DNS 厂商的 API 密钥,例如
{
"cloudflare": { // dnsconfig.js 中的厂商名称
"TYPE": "CLOUDFLAREAPI", // 厂商标识符
"accountid": "your-cloudflare-account-id", // 对应的凭据
"apitoken": "your-cloudflare-api-token" // 对应的凭据
},
"namecom": { // dnsconfig.js 中的厂商名称
"TYPE": "NAMEDOTCOM", // 厂商标识符
"apikey": "key", // 对应的凭据
"apiuser": "username" // 对应的凭据
},
"none": { "TYPE": "NONE" } // 空 厂商
}
不同的厂商有不同的凭据要求,同样可以看最上面的链接,在每一个厂商的介绍页面里面都会有 creds.json
的写法例子
- 测试配置文件
dnscontrol preview
preview 是用来预览当前配置文件中,和线上厂商系统中的差异,注意这里只是单纯的展示差异,并不会执行相应的操作
Initialized 1 registrars and 1 dns service providers.
******************** Domain: example.com
----- Getting nameservers from: bind
----- DNS Provider: bind... 1 correction
#1: GENERATE_ZONEFILE: example.com
(2 records)
----- Registrar: none
Done. 1 corrections.
- 执行
dnscontrol push
push 相当于是把本地的配置推给厂商,程序会找到两者的差异进行调整,该删除的删除,该修改的修改,该新增的新增
Initialized 1 registrars and 1 dns service providers.
******************** Domain: example.com
----- Getting nameservers from: bind
----- DNS Provider: bind... 1 correction
#1: GENERATE_ZONEFILE: example.com
(2 records)
CREATING ZONEFILE: zones/example.com.zone
SUCCESS!
----- Registrar: none
Done. 1 corrections.
好,看到这里,你已经学会了,快自己来试一试吧。