有多个 域名 ,且分布在不同的商家时,更改 DNS 解析需要到不同的网站,比较麻烦,并且手动只能一条一条地添加和删除。这种机械重复的劳动可以使用工具自动化,比如 DNSControl。
请浏览一遍全文,熟悉到哪里找文档后再操作。
指标 | 描述 |
---|---|
适用系统 | Linux、Windows 等,只要是提供相应系统的程序文件即可,本文以 Debian 为例 |
走通流程时间 | 15 分钟 |
I might have made some mistakes, please let me know if I’ve gotten anything wrong!
DNSControl
DNSControl 是一个由 StackExchange 及开源社区开发的一款产品,能通过其设计的专用描述语言同时管理多个厂商的 DNS 记录。
GitHub: StackExchange/dnscontrol: Synchronize your DNS to multiple providers from a simple DSL (github.com)
DNSControl 是一个单文件程序,除此之外需要关注的就两个文件:一个是配置解析记录的 dnsconfig.js,另一个是保存域名商家 API token 的 creds.json。
安装
创建程序目录
myserve="dnscontrol"
mkdir -p ~/myserve/$myserve && cd ~/myserve/$myserve && mkdir zones
# `zones` is where the BIND provider writes the zonefiles it creates. Even if you don't use BIND for DNS service, it is useful for testing
下载和解压
arch=$(uname -m)
# CPU 架构存于 ARCHITECTURE 变量
if [[ $arch == "aarch64" ]]; then ARCHITECTURE="arm64"
elif [[ $arch == "x86_64" ]]; then ARCHITECTURE="amd64"
else echo "Unknown architecture: $arch", exit 1
fi
github_project="StackExchange/dnscontrol"
tag=$(curl -m 10 -sL "https://api.github.com/repos/${github_project}/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
# 下载
curl -L -O https://github.com/StackExchange/dnscontrol/releases/download/${tag}/dnscontrol_${tag:1}_linux_${ARCHITECTURE}.tar.gz && \
tar -z -xv -f dnscontrol_*.tar.gz && rm dnscontrol_*.tar.gz
配置解析记录
创建一个 dnsconfig.js
文件,该文件配置了域名的解析记录
vim ~/myserve/dnscontrol/dnsconfig.js
var REG_NONE = NewRegistrar("none");
// 以 CLOUDFLARE 为例,先创建一个它的实例 DSP_CLOUDFLARE
var DSP_CLOUDFLARE = NewDnsProvider("cloudflare");
// PORKBUN
var DSP_PORKBUN = NewDnsProvider("porkbun");
// 对 vfly2.com 的解析记录进行配置
D("vfly2.com", REG_NONE, DnsProvider(DSP_CLOUDFLARE),
A("@", "1.2.3.4"),
A("blog", "2.3.4.5"),
AAAA("blog", "2001:0db8:85a3:0000:0000:8a2e:0370:7334"),
CNAME("www", "blog"),
CNAME("another", "blog.vfly2.com."),
MX("mail", 10, "mailserver"),
MX("mail", 20, "mailqueue"),
TXT("the", "message"),
NS("department2", "ns1.dnsexample.com."),
NS("department2", "ns2.dnsexample.com.") // 注意最后一个不能有逗号
);
// 对在 porkbun 注册的 yanh.tech 的解析记录进行配置,DnsProvider 不同了
D("yanh.tech", REG_NONE, DnsProvider(DSP_PORKBUN),
A("@", "23.166.168.41"),
A("www", "23.166.168.41"),
TXT("@", "google-site-verification=xv5v0gAjsrs1r_XQReEz18a8-u5LW8ABZXuevWtVUEQ")
);
这里其实是 JavaScript 的代码,定义了 vfly2.com
的解析,它在 CloudFlare 注册。更多信息查看: JavaScript DSL – DNSControl
更多例子也可以看官方文档中的: Examples | DNSControl
配置 API
创建一个 creds.json
文件,该文件保存 DNS 厂商的 API 密钥(这个文件不要暴露出去,否则其他人可以随意修改域名的解析)
vim ~/myserve/dnscontrol/creds.json
{
"cloudflare": { // dnsconfig.js 中的厂商名称
"TYPE": "CLOUDFLAREAPI", // 厂商标识符
"accountid": "your-cloudflare-account-id", // 对应的凭据,不同的厂商名称可能不一样
"apitoken": "your-cloudflare-api-token" // 对应的凭据
},
"porkbun": {
"TYPE": "PORKBUN",
"api_key": "pk1_xxxxx516sdvdzfbf",
"secret_key": "sk1_xxxxx516sdvdzfbf"
}
}
creds.json
可以从环境变量里读取值,需要以 $
开头,如:
{
"apikey": "$GANDI_V5_APIKEY"
}
不同的厂商有不同的凭据要求,在每一个厂商的介绍页面里面都会有 creds.json
的写法例子和获取 API 的方法。
所有支持的域名商家: Providers – DNSControl ,点击具体一个商家后,还会有怎么获取 API token 的文档:
执行
先进到程序目录
cd ~/myserve/dnscontrol/
./dnscontrol preview
preview 是用来预览以当前的配置,域名解析和实际的差异,并不会真的执行相应的操作
./dnscontrol push
push 相当于是把本地的配置推给厂商,程序会找到两者的差异进行调整,该删除的删除,该修改的修改,该新增的新增。
原文链接: https://yanh.tech/2025/04/domain-management/
版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技焉洲 (yanh.tech) 。
保持更新 ٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,如果能留言互动就更好了。
可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。