域名管理

有多个 域名 ,且分布在不同的商家时,更改 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 交流依文章步骤遇到的问题。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇