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

  1. 下载安装

程序是 Go 写的,你可以从官方仓库中获取源代码自己构建,也可以去 GitHub 下载已经构建好的版本

当然部份发行版的软件仓库里直接就有了,可以直接从软件仓库中去安装

Packaging status

  1. 创建一个文件夹存放配置文件
  2. 创建一个 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 权威服务器厂商,是你平时解析记录的地方

详细的列表可以看上面的链接

  1. 创建一个 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 的写法例子

  1. 测试配置文件 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.
  1. 执行 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.

好,看到这里,你已经学会了,快自己来试一试吧。