作者选择了 Electronic Frontier Foundation Inc作为 Write for Donations计划的一部分接受捐款。
介绍
DNSControl是一个 infrastructure-as-code工具,允许您使用标准软件开发原则部署和管理您的DNS区域,包括版本控制,测试和自动部署。
使用 DNSControl 可以消除许多手动 DNS 管理的陷阱,因为区域文件存储在可编程格式中,这允许您同时部署区域到多个 DNS 提供商,识别语法错误,并自动推出 DNS 配置,减少人为错误的风险。
在此教程中,您将安装并配置 DNS Control,创建基本的 DNS 配置,并开始将 DNS 记录部署到一个活的提供者. 作为这个教程的一部分,我们将使用 DigitalOcean 作为实例 DNS 提供者. 如果您想使用不同提供者,设置非常相近. 完成后,可以在安全,离线的环境中管理和测试自己的DNS配置,再自动部署到生产中.
前提条件
在您开始本指南之前,您将需要以下内容:
- 一个Ubuntu 18.04服务器通过跟随与Ubuntu 18.04的初始服务器设置而设置,包括一个sudo非root用户并允许防火墙来屏蔽非必要的端口. ‘您服务器- ipv4- 地址' 是指您托管您的网站或域名的服务器的 IP 地址 。
- 由[支持的提供商]托管的DNS全注册域名(https://github.com/StackExchange/dnscontrol# dnscontrol). 该教程将使用`example.com' 和数字海洋作为服务提供者。
- DigitalOcean API密钥(个人访问托肯),有读写权限. 要创建一个,请访问[如何创建个人访问Token] (https://www.digitalocean.com/docs/api/create-personal-access-token/). .
一旦你已经准备好了,登录你的服务器作为你的非根用户开始。
第1步:安装DNSControl
DNSControl 写在 Go 中,所以您将通过安装 Go 到您的服务器并设置您的GOPATH
来开始此步骤。
Go在Ubuntu的默认软件存储库中可用,可以使用传统的包管理工具进行安装。
首先,更新本地包索引,以反映任何新的上游变化:
1sudo apt update
然后,安装golang-go
包:
1sudo apt install golang-go
确认安装后,apt
将下载并安装Go和所有所需的依赖性。
接下来,您将为 Go 配置所需的路径环境变量. 如果您想更多地了解这一点,您可以阅读本教程在 理解 GOPATH 。
1nano ~/.profile
将以下行添加到您的文件的尽头:
1[label ~/.profile]
2...
3export GOPATH="$HOME/go"
4export PATH="$PATH:$GOPATH/bin"
一旦您将这些行添加到文件的底部,保存并关闭它,然后通过退出和重新登录或重新源文件来重新加载您的个人资料:
1source ~/.profile
现在你已经安装并配置了Go,你可以安装DNSControl。
可以使用go get
命令来获取代码的副本,自动编译并安装到您的Go目录中:
1go get github.com/StackExchange/dnscontrol
一旦完成,您可以检查已安装的版本,以确保一切正常工作:
1dnscontrol version
您的输出将看起来如下:
1[secondary_label Output]
2dnscontrol 0.2.8-dev
如果您看到dnscontrol:命令未找到
错误,请双重检查 Go 路径设置。
现在你已经安装了 DNSControl,你可以创建一个配置目录,并将 DNSControl 连接到你的 DNS 提供商,以允许它对你的 DNS 记录进行更改。
第2步:设置DNSControl
在此步骤中,您将创建 DNSControl 所需的配置目录,并将其连接到您的 DNS 提供商,以便它可以开始对您的 DNS 记录进行实时更改。
首先,创建一个新的目录,您可以在其中存储您的 DNSControl 配置,然后进入它:
1mkdir ~/dnscontrol
2cd ~/dnscontrol
<$>[注] 注: 本教程将专注于DNSControl的初始设置;然而,对于生产使用,建议将DNSControl配置存储在版本控制系统(VCS)中,如 Git。
如果您打算使用 DNSControl 编写 BIND 区域文件,您还应该创建区域
目录:
1mkdir ~/dnscontrol/zones
BIND區域檔案是儲存DNS區域/記錄以簡單文本格式的原始標準化方法,最初用於BIND DNS伺服器軟體,但現在被廣泛採用為儲存DNS區域的標準方法。DNSControl生產的BIND區域檔案如果您想將其輸入到自訂或自訂的DNS伺服器,或為審核目的,是有用的。
但是,如果您只想使用 DNSControl 将 DNS 更改推向受管理的提供商,则不需要区域
目录。
接下来,您需要配置 creds.json
文件,这将允许 DNSControl 对您的 DNS 提供商进行身份验证并进行更改。 creds.json
的格式略有不同,取决于您正在使用的 DNS 提供商。 请参阅官方 DNSControl 文档中的 服务提供商列表以找到您自己的服务提供商的配置。
在~/dnscontrol
目录中创建creds.json
文件:
1cd ~/dnscontrol
2nano creds.json
如果您正在使用 DigitalOcean 作为您的 DNS 提供商,您可以使用以下方法:
1[label ~/dnscontrol/creds.json]
2{
3 "digitalocean": {
4 "token": "your-digitalocean-oauth-token"
5 }
6}
这个文件告诉DNSControl您希望它连接到哪个DNS提供商。
您需要为您的 DNS 提供商提供某种形式的身份验证,这通常是 API 密钥或 OAuth 代码,但一些提供商需要额外的信息,如官方 DNSControl 文档中的 服务提供商列表 所记录的。
<$>[警告] 警告: 此代码将允许访问您的 DNS 提供商帐户,因此您应该像使用密码一样保护它。
如果您正在使用DigitalOcean作为您的DNS提供商,您可以使用所需的OAuth代币(在您的DigitalOcean帐户设置中)(https://cloud.digitalocean.com/settings/applications)作为前提条件的一部分。
如果您有多个不同的 DNS 提供商 - 例如,用于多个域名或授权 DNS 区域 - 您可以在相同的 creds.json
文件中定义所有这些。
您已设置初始 DNSControl 配置目录,并配置了creds.json
,以允许 DNSControl 对您的 DNS 提供商进行身份验证并进行更改。
第3步:创建 DNS 配置文件
在此步骤中,您将创建一个初始的 DNS 配置文件,该文件将包含您的域名或授权 DNS 区域的 DNS 记录。
「dnsconfig.js」是 DNSControl 的主要 DNS 配置文件. 在此文件中,使用 JavaScript 语法定义了 DNS 区域及其相应的记录。这被称为 DSL 或域特定语言。官方 DNSControl 文档中的 JavaScript DSL页面提供了更多细节。
首先,在~/dnscontrol
目录中创建 DNS 配置文件:
1cd ~/dnscontrol
2nano dnsconfig.js
然后,将以下样本配置添加到文件中:
1[label ~/dnscontrol/dnsconfig.js]
2// Providers:
3
4var REG_NONE = NewRegistrar('none', 'NONE');
5var DNS_DIGITALOCEAN = NewDnsProvider('digitalocean', 'DIGITALOCEAN');
6
7// Domains:
8
9D('example.com', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
10 A('@', 'your-server-ipv4-address')
11);
此示例文件定义了特定提供商的域名或DNS区域,在这种情况下是),指向您托管域名/网站的服务器的IPv4地址。
有三个主要功能构成一个基本的 DNSControl 配置文件:
NewRegistrar(名称、类型、元数据)':定义域名的域名登记员。 DNS Control可以使用它来进行所需的修改,例如修改权威的命名服务器. 如果您只想要使用 DNS 控制来管理您的 DNS 区域, 这通常可以留作
无 ` 。- `NewDnsProvider(名称、类型、元数据)':为您的域名或授权区定义一个DNS服务提供商。 DNS Control将在此推动您所做的 DNS 更改 。
- `D(名称、登记员、修改者)':定义DNS控制管理的一个域名或授权DNS区,以及该区现有的DNS记录。 .
您应该根据官方 DNSControl 文档中的 服务提供者列表配置 NewRegistrar()
, NewDnsProvider()
和 D()
。
如果您正在使用DigitalOcean作为您的DNS提供商,并且只需要能够进行DNS更改(而不是权威的名称服务器),则上一个代码块中的样本已经正确。
一旦完成,保存并关闭文件。
在此步骤中,您将为 DNSControl 设置一个 DNS 配置文件,并定义相关提供商。
步骤 4 — 普及您的 DNS 配置文件
接下来,您可以用 DNSControl 语法填充 DNS 配置文件,为您的网站或服务提供有用的 DNS 记录。
與傳統的 BIND 區域檔案不同,其中 DNS 記錄是以原始的,一行一行格式寫的,DNSControl 內的 DNS 記錄被定義為函數參數 (域變更器) 到 D() 函數,正如在步驟 3 中簡略顯示的。
每个标准的DNS记录类型都有域编辑器,包括)部分,可以找到可用的记录类型的完整列表。
目前,这些更改器主要用于设置个别记录的 TTL(存活时间)。在 DNSControl 文档中的 Record Modifiers部分,可以找到可用的更改器的完整列表。
设置 DNS 记录的语法为每个记录类型略有不同,以下是最常见的记录类型的一些示例:
- `A ' 记录: -目的:指IPv4地址.
- 语法: )
,
- 示例:
A('@',
你的服务器-ipv4-地址',TTL(30)),
- `AAA ' 记录:
- 目的:指IPv6地址。
- 语法:
AAAA'()
, ` - 示例:
AAAA ('@',
你的服务器-ipv6-地址')' (记录修改器被忽略, 因此默认 TTL 将被使用)
- `CNAME ' 记录:
- 目的:使您的域/子域成为另一个域的别名。
- 语法:)
,
- 示例:`CNAME('subdomain1','example.org.')' (注意如果值中存在任何点,则必须加上后缀 ". " ****)
MX
-记录:
- 目的:将电子邮件传送给特定的服务器/地址。
- 语法: )
,
- 示例:)
- " TXT " 记录:
- 目的:添加任意的纯文本,经常用于没有自己专用记录类型的配置.
- 语法: )
,
- 示例:
TXT ('''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
, `
- " CAA " 记录:
- 目的:限制并报告可以为您的域/子域签发TLS证书的证书当局。
- 语法: CAA( )
,
- 示例:)
,
要开始为您的域或授权 DNS 区域添加 DNS 记录,请编辑您的 DNS 配置文件:
1cd ~/dnscontrol
2nano dnsconfig.js
接下来,您可以使用前面列表中描述的语法,以及官方 DNSControl 文档中的 Domain Modifiers部分开始填充现有 D() 函数的参数。 必须在每个记录之间使用一个字节(
,`)。
作为参考,这里的代码块包含一个基本的初始 DNS 设置的完整样本配置:
1[label ~/dnscontrol/dnsconfig.js]
2...
3
4D('example.com', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
5 A('@', 'your-server-ipv4-address'),
6 A('www', 'your-server-ipv4-address'),
7 A('mail', 'your-server-ipv4-address'),
8 AAAA('@', 'your-server-ipv6-address'),
9 AAAA('www', 'your-server-ipv6-address'),
10 AAAA('mail', 'your-server-ipv6-address'),
11 MX('@', 10, 'mail.example.com.'),
12 TXT('@', 'v=spf1 -all'),
13 TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:[email protected]; aspf=s; adkim=s;')
14);
完成初始 DNS 配置后,保存并关闭文件。
在此步骤中,您将设置最初的 DNS 配置文件,其中包含您的 DNS 记录。
第5步:测试和部署您的DNS配置
在此步骤中,您将对您的 DNS 配置运行本地语法检查,然后将更改部署到现场 DNS 服务器/提供商。
首先,进入您的dnscontrol
目录:
1cd ~/dnscontrol
接下来,使用DNSControl的):
1dnscontrol preview
如果您的 DNS 配置文件的语法正确,DNSControl 将输出对其所做的更改的概述。
1[secondary_label Output]
2******************** Domain: example.com
3----- Getting nameservers from: digitalocean
4----- DNS Provider: digitalocean...8 corrections
5#1: CREATE A example.com your-server-ipv4-address ttl=300
6#2: CREATE A www.example.com your-server-ipv4-address ttl=300
7#3: CREATE A mail.example.com your-server-ipv4-address ttl=300
8#4: CREATE AAAA example.com your-server-ipv6-address ttl=300
9#5: CREATE TXT _dmarc.example.com "v=DMARC1; p=reject; rua=mailto:[email protected]; aspf=s; adkim=s;" ttl=300
10#6: CREATE AAAA www.example.com your-server-ipv6-address ttl=300
11#7: CREATE AAAA mail.example.com your-server-ipv6-address ttl=300
12#8: CREATE MX example.com 10 mail.example.com. ttl=300
13----- Registrar: none...0 corrections
14Done. 8 corrections.
如果您在输出中看到错误警告,DNSControl 将提供有关错误在您的文件中所在位置的详细信息。
警告: 下一个命令将对您的 DNS 记录和可能的其他设置进行实时更改. 请确保您为此做好准备,包括备份现有 DNS 配置,并确保您有可能在需要时返回。
最后,您可以将更改推到您的直播DNS提供商:
1dnscontrol push
你会看到一个类似于以下的输出:
1[secondary_label Output]
2******************** Domain: example.com
3----- Getting nameservers from: digitalocean
4----- DNS Provider: digitalocean...8 corrections
5#1: CREATE TXT _dmarc.example.com "v=DMARC1; p=reject; rua=mailto:[email protected]; aspf=s; adkim=s;" ttl=300
6SUCCESS!
7#2: CREATE A example.com your-server-ipv4-address ttl=300
8SUCCESS!
9#3: CREATE AAAA example.com your-server-ipv6-address ttl=300
10SUCCESS!
11#4: CREATE AAAA www.example.com your-server-ipv6-address ttl=300
12SUCCESS!
13#5: CREATE AAAA mail.example.com your-server-ipv6-address ttl=300
14SUCCESS!
15#6: CREATE A www.example.com your-server-ipv4-address ttl=300
16SUCCESS!
17#7: CREATE A mail.example.com your-server-ipv4-address ttl=300
18SUCCESS!
19#8: CREATE MX example.com 10 mail.example.com. ttl=300
20SUCCESS!
21----- Registrar: none...0 corrections
22Done. 8 corrections.
现在,如果您在 DigitalOcean 控制面板中检查您的域的 DNS 设置,您将看到更改。
您还可以通过运行域名/授权区的 DNS 查询来检查创建记录,您将看到记录已相应更新:
1dig +short example.com
您将看到输出显示的 IP 地址和相关的 DNS 记录从使用 DNSControl 部署的区域. DNS 记录可能需要一些时间来传播,所以您可能需要等待并再次运行此命令。
在此最后一步中,您运行了 DNS 配置文件的本地语法检查,然后将其部署到您的直播 DNS 提供商,并测试了更改是否成功。
结论
在本文中,您设置了 DNSControl,并向现场提供商部署了 DNS 配置,现在您可以在安全的离线环境中管理和测试 DNS 配置更改,然后将其部署到生产中。
如果您想进一步探索这个主题,DNSControl 旨在集成到您的 CI/CD 管道中,允许您进行深入的测试,并对您的部署进行更多控制,您还可以考虑将 DNSControl 集成到您的基础设施构建/部署流程中,允许您完全自动部署服务器并将其添加到 DNS。
如果您想进一步使用 DNSControl,以下 DigitalOcean 文章提供一些有趣的下一步步骤,以帮助将 DNSControl 集成到您的更改管理和基础设施部署工作流程中:
- [关于持续一体化、交付和部署的入 (https://andsky.com/tech/tutorials/an-introduction-to-continuous-integration-delivery-and-deployment)
- CI/CD工具比较:Jenkins、GitLab CI、Buildbot、Drone和Concour
- [开始配置管理] (https://www.digitalocean.com/community/tutorial_series/getting-started-with-configuration-management)