如何在 Ubuntu 18.04 上使用 DNSControl 部署和管理 DNS

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

介绍

DNSControl是一个 infrastructure-as-code工具,允许您使用标准软件开发原则部署和管理您的DNS区域,包括版本控制,测试和自动部署。

使用 DNSControl 可以消除许多手动 DNS 管理的陷阱,因为区域文件存储在可编程格式中,这允许您同时部署区域到多个 DNS 提供商,识别语法错误,并自动推出 DNS 配置,减少人为错误的风险。

在此教程中,您将安装并配置 DNS Control,创建基本的 DNS 配置,并开始将 DNS 记录部署到一个活的提供者. 作为这个教程的一部分,我们将使用 DigitalOcean 作为实例 DNS 提供者. 如果您想使用不同提供者,设置非常相近. 完成后,可以在安全,离线的环境中管理和测试自己的DNS配置,再自动部署到生产中.

前提条件

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

一旦你已经准备好了,登录你的服务器作为你的非根用户开始。

第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 设置,您将看到更改。

A screenshot of the DigitalOcean control panel, showing some of the DNS changes that DNSControl has made.

您还可以通过运行域名/授权区的 DNS 查询来检查创建记录,您将看到记录已相应更新:

1dig +short example.com

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

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

结论

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

如果您想进一步探索这个主题,DNSControl 旨在集成到您的 CI/CD 管道中,允许您进行深入的测试,并对您的部署进行更多控制,您还可以考虑将 DNSControl 集成到您的基础设施构建/部署流程中,允许您完全自动部署服务器并将其添加到 DNS。

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

Published At
Categories with 技术
Tagged with
comments powered by Disqus