如何在Debian10上使用DNSControl部署和管理您的DNS

来自菜鸟教程
跳转至:导航、​搜索

作者选择了 Electronic Frontier Foundation Inc 作为 Write for DOnations 计划的一部分来接受捐赠。

介绍

DNSControl 是一种 基础设施即代码 工具,可让您使用标准软件开发原则(包括版本控制、测试和自动化部署)来部署和管理 DNS 区域。 DNSControl 由 Stack Exchange 创建并用 Go 编写。

使用 DNSControl 消除了手动 DNS 管理的许多缺陷,因为区域文件以可编程格式存储。 这使您可以同时将区域部署到多个 DNS 提供商、识别语法错误并自动推出您的 DNS 配置,从而降低人为错误的风险。 DNSControl 的另一个常见用途是将您的 DNS 快速迁移到不同的提供商; 例如,在发生 DDoS 攻击或系统中断时。

在本教程中,您将安装和配置 DNSControl,创建基本的 DNS 配置,并开始将 DNS 记录部署到实时提供商。 作为本教程的一部分,我们将使用 DigitalOcean 作为示例 DNS 提供程序。 如果您希望使用 不同的提供程序 ,设置非常相似。 完成后,您将能够在安全的离线环境中管理和测试您的 DNS 配置,然后自动将其部署到生产环境中。

先决条件

在开始本指南之前,您需要以下内容:

  • 按照 使用 Debian 10 的初始服务器设置设置一台 Debian 10 服务器,包括 sudo 非 root 用户并启用防火墙以阻止非必要端口。 your-server-ipv4-address 是指您托管网站或域的服务器的 IP 地址。 your-server-ipv6-address 是指您托管网站或域的服务器的 IPv6 地址。
  • 由 支持的提供商 托管的具有 DNS 的完全注册域名。 本教程将始终使用 your_domain 并使用 DigitalOcean 作为服务提供者。
  • 具有读写权限的 DigitalOcean API 密钥(个人访问令牌)。 要创建一个,请访问 如何创建个人访问令牌。

准备好这些后,以非 root 用户身份登录到您的服务器即可开始。

第 1 步 — 安装 DNSControl

DNSControl 是用 Go 编写的,因此您将通过将 Go 安装到您的服务器并设置 GOPATH 来开始这一步。

Go 在 Debian 的默认软件存储库中可用,因此可以使用传统的包管理工具进行安装。

您还需要安装 Git,因为这是允许 Go 从 GitHub 上的存储库下载和安装 DNSControl 软件所必需的。

首先更新本地包索引以反映任何新的上游更改:

sudo apt update

然后,安装 golang-go 和 git 软件包:

sudo apt install golang-go git

确认安装后,apt 将下载并安装 Go 和 Git,以及它们所需的所有依赖项。

接下来,您将为 Go 配置所需的路径环境变量。 如果您想了解更多相关信息,可以阅读 Understanding the GOPATH 上的本教程。 首先编辑 ~/.profile 文件:

nano ~/.profile

将以下行添加到文件的最后:

~/.profile

...
export GOPATH="$HOME/go"
export PATH="$PATH:$GOPATH/bin"

将这些行添加到文件底部后,保存并关闭它。 然后通过注销并重新登录或再次获取文件来重新加载您的个人资料:

source ~/.profile

现在您已经安装并配置了 Go,您可以安装 DNSControl。

go get 命令可用于获取代码副本,自动编译,并将其安装到您的 Go 目录中:

go get github.com/StackExchange/dnscontrol

完成后,您可以检查已安装的版本以确保一切正常:

dnscontrol version

您的输出将类似于以下内容:

Outputdnscontrol 2.9-dev

如果您看到 dnscontrol: command not found 错误,请仔细检查您的 Go 路径设置。

现在您已经安装了 DNSControl,您可以创建一个配置目录并将 DNSControl 连接到您的 DNS 提供商,以允许它更改您的 DNS 记录。

第 2 步 — 配置 DNSControl

在此步骤中,您将为 DNSControl 创建所需的配置目录,并将其连接到您的 DNS 提供商,以便它可以开始对您的 DNS 记录进行实时更改。

首先,创建一个新目录,您可以在其中存储您的 DNSControl 配置,然后进入该目录:

mkdir ~/dnscontrol
cd ~/dnscontrol

注意:本教程将重点介绍DNSControl的初始设置; 但是对于生产用途,建议将您的 DNSControl 配置存储在版本控制系统 (VCS) 中,例如 Git。 这样做的优点包括完整的版本控制、与 CI/CD 集成以进行测试、无缝回滚部署等。


如果您打算使用 DNSControl 编写 BIND 区域文件,您还应该创建 zones 目录:

mkdir ~/dnscontrol/zones

BIND 区域文件 是一种原始的标准化方法,用于以纯文本格式存储 DNS 区域/记录。 它们最初用于 BIND DNS 服务器软件,但现在被广泛用作存储 DNS 区域的标准方法。 如果您想将 DNSControl 生成的 BIND 区域文件导入自定义或自托管 DNS 服务器,或用于审计目的,这些文件非常有用。

但是,如果您只想使用 DNSControl 将 DNS 更改推送到托管提供商,则不需要 zones 目录。

接下来,您需要配置 creds.json 文件,这将允许 DNSControl 向您的 DNS 提供商进行身份验证并进行更改。 creds.json 的格式因您使用的 DNS 提供商而略有不同。 请查看官方 DNSControl 文档中的 Service Providers 列表 以找到您自己的提供商的配置。

在~/dnscontrol目录下创建文件creds.json:

cd ~/dnscontrol
nano creds.json

将您的 DNS 提供商的示例 creds.json 配置添加到文件中。 如果您使用 DigitalOcean 作为您的 DNS 提供商,您可以使用以下内容:

~/dnscontrol/creds.json

{
"digitalocean": {
  "token": "your-digitalocean-oauth-token"
}
}

此文件告诉 DNSControl 您希望它连接到哪些 DNS 提供商。

您需要为您的 DNS 提供商提供某种形式的身份验证。 这通常是 API 密钥或 OAuth 令牌,但某些提供程序需要额外信息,如官方 DNSControl 文档中的 服务提供程序列表 中所述。

警告: 此令牌将授予对您的 DNS 提供商帐户的访问权限,因此您应该像保护密码一样保护它。 此外,如果您使用的是版本控制系统,请确保排除包含令牌的文件(例如 使用 .gitignore),或以某种方式安全加密。


如果您使用 DigitalOcean 作为您的 DNS 提供商,您可以在您作为先决条件的一部分生成的 DigitalOcean 帐户设置 中使用所需的 OAuth 令牌 。

如果您有多个不同的 DNS 提供程序(例如,多个域名或委托的 DNS 区域),您可以在同一个 creds.json 文件中定义所有这些。

您已经设置了初始 DNSControl 配置目录,并配置了 creds.json 以允许 DNSControl 向您的 DNS 提供商进行身份验证并进行更改。 接下来,您将为 DNS 区域创建配置。

第 3 步 — 创建 DNS 配置文件

在此步骤中,您将创建一个初始 DNS 配置文件,其中将包含您的域名或委派 DNS 区域的 DNS 记录。

dnsconfig.js 是 DNSControl 的主要 DNS 配置文件。 在此文件中,DNS 区域及其对应记录是使用 JavaScript 语法定义的。 这被称为 DSL 或领域特定语言。 官方 DNSControl 文档中的 JavaScript DSL 页面提供了更多详细信息。

首先,在 ~/dnscontrol 目录中创建 DNS 配置文件:

cd ~/dnscontrol
nano dnsconfig.js

然后,将以下示例配置添加到文件中:

~/dnscontrol/dnsconfig.js

// Providers:

var REG_NONE = NewRegistrar('none', 'NONE');
var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');

// Domains:

D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
  A('@', 'your-server-ipv4-address')
);

此示例文件定义了特定提供商的域名或 DNS 区域,在本例中为 DigitalOcean 托管的 your_domain。 还为区域根 (@) 定义了一个示例 A 记录,指向您托管域/网站的服务器的 IPv4 地址。

构成基本 DNSControl 配置文件的三个主要函数:

  • NewRegistrar(name, type, metadata):为您的域名定义域名注册商。 DNSControl 可以使用它来进行必要的更改,例如修改权威名称服务器。 如果您只想使用 DNSControl 来管理您的 DNS 区域,通常可以将其保留为 NONE。
  • NewDnsProvider(name, type, metadata):为您的域名或委托区域定义一个DNS服务提供商。 这是 DNSControl 将推送您所做的 DNS 更改的地方。
  • D(name, registrar, modifiers):定义一个域名或委托 DNS 区域供 DNSControl 管理,以及该区域中存在的 DNS 记录。

您应该使用官方 DNSControl 文档中的 服务提供商列表 相应地配置 NewRegistrar()、NewDnsProvider() 和 D()。

如果您使用 DigitalOcean 作为您的 DNS 提供商,并且只需要能够进行 DNS 更改(而不是权威名称服务器),那么前面代码块中的示例已经是正确的。

完成后,保存并关闭文件。

在此步骤中,您将为 DNSControl 设置一个 DNS 配置文件,并定义相关的提供程序。 接下来,您将使用一些有用的 DNS 记录填充该文件。

第 4 步 — 填充您的 DNS 配置文件

接下来,您可以使用 DNSControl 语法为您的网站或服务填充有用的 DNS 记录的 DNS 配置文件。

与传统的 BIND 区域文件不同,其中 DNS 记录以原始的逐行格式写入,DNSControl 中的 DNS 记录被定义为 D() 函数的函数参数(域修饰符),如下所示步骤 3。

每个标准 DNS 记录类型都有一个域修饰符,包括 A、AAAA、MX、TXT、NS、[ X133X],以此类推。 DNSControl 文档的 Domain Modifiers 部分提供了可用记录类型的完整列表。

单个记录的修饰符也可用(记录修饰符)。 目前,这些主要用于设置单个记录的 TTL(生存时间)。 DNSControl 文档的 Record Modifiers 部分提供了可用记录修饰符的完整列表。 记录修饰符是可选的,在大多数基本用例中可以省略。

每种记录类型的 DNS 记录设置语法略有不同。 以下是最常见记录类型的一些示例:

  • A 记录:
    • 目的:指向一个 IPv4 地址。
    • 语法:A('name', 'address', optional record modifiers)
    • 示例:A('@', 'your-server-ipv4-address', TTL(30))
  • AAAA 记录:
    • 目的:指向一个 IPv6 地址。
    • 语法:AAAA('name', 'address', optional record modifiers)
    • 示例:AAAA('@', 'your-server-ipv6-address')(省略记录修饰符,因此将使用默认 TTL)
  • CNAME 记录:
    • 目的:使您的域/子域成为另一个域的别名。
    • 语法:CNAME('name', 'target', optional record modifiers)
    • 示例:CNAME('subdomain1', 'example.org.')(请注意,如果值中有任何点,则必须包含尾随的 . ' )
  • MX 记录:
    • 目的:将电子邮件定向到特定的服务器/地址。
    • 语法:MX('name', 'priority', 'target', optional record modifiers)
    • 示例:MX('@', 10, 'mail.example.net')(请注意,如果值中有任何点,则必须包含尾随的 . ' )
  • TXT 记录:
    • 目的:添加任意纯文本,通常用于没有自己专用记录类型的配置。
    • 语法:TXT('name', 'content', optional record modifiers)
    • 示例:TXT('@', 'This is a TXT record.')
  • CAA 记录:
    • 目的:限制和报告可以为您的域/子域颁发 TLS 证书的证书颁发机构 (CA)。
    • 语法:CAA('name', 'tag', 'value', optional record modifiers)
    • 示例:CAA('@', 'issue', 'letsencrypt.org')

为了开始为您的域或委派的 DNS 区域添加 DNS 记录,请编辑您的 DNS 配置文件:

nano dnsconfig.js

接下来,您可以使用前面列表中描述的语法以及官方 DNSControl 文档的 Domain Modifiers 部分开始填充现有 D() 函数的参数。 必须在每条记录之间使用逗号 (,)。

作为参考,此处的代码块包含基本的初始 DNS 设置的完整示例配置:

~/dnscontrol/dnsconfig.js

...

D('your_domain', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
  A('@', 'your-server-ipv4-address'),
  A('www', 'your-server-ipv4-address'),
  A('mail', 'your-server-ipv4-address'),
  AAAA('@', 'your-server-ipv6-address'),
  AAAA('www', 'your-server-ipv6-address'),
  AAAA('mail', 'your-server-ipv6-address'),
  MX('@', 10, 'mail.your_domain.'),
  TXT('@', 'v=spf1 -all'),
  TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;')
);

完成初始 DNS 配置后,保存并关闭文件。

在此步骤中,您将设置初始 DNS 配置文件,其中包含您的 DNS 记录。 接下来,您将测试配置并进行部署。

第 5 步 — 测试和部署您的 DNS 配置

在此步骤中,您将对 DNS 配置运行本地语法检查,然后将更改部署到实时 DNS 服务器/提供程序。

首先,进入你的 dnscontrol 目录:

cd ~/dnscontrol

接下来,使用 DNSControl 的 preview 函数来检查文件的语法,并输出它将进行哪些更改(实际上不进行更改):

dnscontrol preview

如果您的 DNS 配置文件的语法正确,DNSControl 将输出其所做更改的概述。 这应该类似于以下内容:

Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE A your_domain your-server-ipv4-address ttl=300
#2: CREATE A www.your_domain your-server-ipv4-address ttl=300
#3: CREATE A mail.your_domain your-server-ipv4-address ttl=300
#4: CREATE AAAA your_domain your-server-ipv6-address ttl=300
#5: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
#6: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
#7: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
----- Registrar: none...0 corrections
Done. 8 corrections.

如果您在输出中看到错误警告,DNSControl 将提供有关错误在您的文件中的位置和位置的详细信息。

警告: 下一个命令将对您的 DNS 记录和可能的其他设置进行实时更改。 请确保您为此做好准备,包括备份现有 DNS 配置,并确保您有办法在需要时回滚。


最后,您可以将更改推送到您的实时 DNS 提供商:

dnscontrol push

您将看到类似于以下内容的输出:

Output******************** Domain: your_domain
----- Getting nameservers from: digitalocean
----- DNS Provider: digitalocean...8 corrections
#1: CREATE TXT _dmarc.your_domain "v=DMARC1; p=reject; rua=mailto:abuse@your_domain; aspf=s; adkim=s;" ttl=300
SUCCESS!
#2: CREATE A your_domain your-server-ipv4-address ttl=300
SUCCESS!
#3: CREATE AAAA your_domain your-server-ipv6-address ttl=300
SUCCESS!
#4: CREATE AAAA www.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#5: CREATE AAAA mail.your_domain your-server-ipv6-address ttl=300
SUCCESS!
#6: CREATE A www.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#7: CREATE A mail.your_domain your-server-ipv4-address ttl=300
SUCCESS!
#8: CREATE MX your_domain 10 mail.your_domain. ttl=300
SUCCESS!
----- Registrar: none...0 corrections
Done. 8 corrections.

现在,如果您在 DigitalOcean 控制面板中检查您的域的 DNS 设置,您将看到更改。

您还可以通过使用 dig 为您的域/委派区域运行 DNS 查询来检查记录创建。

如果您没有安装 dig,则需要安装 dnsutils 软件包:

sudo apt install dnsutils

安装 dig 后,您可以使用它为您的域进行 DNS 查找。 您会看到记录已相应更新:

dig +short your_domain

您将看到显示 IP 地址和相关 DNS 记录的输出,这些记录来自您使用 DNSControl 部署的区域。 DNS 记录可能需要一些时间才能传播,因此您可能需要等待并再次运行此命令。

在最后一步中,您运行了 DNS 配置文件的本地语法检查,然后将其部署到您的实时 DNS 提供商,并测试更改是否成功。

结论

在本文中,您设置了 DNSControl 并将 DNS 配置部署到实时提供商。 现在,您可以在安全的离线环境中管理和测试您的 DNS 配置更改,然后再将它们部署到生产环境。

如果您希望进一步探索此主题,DNSControl 旨在集成到您的 CI/CD 管道中,允许您运行深入的测试并更好地控制您的生产部署。 您还可以考虑将 DNSControl 集成到您的基础架构构建/部署过程中,从而允许您部署服务器并将它们完全自动添加到 DNS。

如果您希望进一步使用 DNSControl,以下 DigitalOcean 文章提供了一些有趣的后续步骤,以帮助将 DNSControl 集成到您的变更管理和基础设施部署工作流程中: