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

DNSControl是一种基础架构即代码工具,允许您使用标准软件开发原则部署和管理DNS区域,包括版本控制,测试和自动部署。在本教程中,您将安装和配置DNSControl,创建基本DNS配置,并开始将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配置,然后自动将其部署到生产环境中。

先决条件

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

  • 一个Ubuntu 18.04服务器通过遵循Ubuntu 18.04的初始服务器设置来设置 ,包括一个sudo非root用户和启用防火墙来阻止非必要端口。 your-server-ip是指您托管网站或域名的服务器的IP地址。
  • 支持的提供商托管的DNS完全注册的域名。 本教程将使用example.com ,DigitalOcean作为服务提供者。
  • 具有读写权限的DigitalOcean API密钥(个人访问令牌)。 要创建一个,请访问如何创建个人访问令牌

准备好后,以非root用户身份登录服务器。

第1步 - 安装DNSControl

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

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

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

sudo apt update

然后,安装golang-go包:

sudo apt install golang-go

确认安装后, apt将下载并安装Go及其所有必需的依赖项。

接下来,您将为Go配置所需的路径环境变量。 如果您想了解更多相关信息,可以阅读本教程“ 理解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

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

dnscontrol 0.2.8-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导出到自定义或自托管DNS服务器,或者出于审计目的,则DNSControl生成的BIND区域文件非常有用。

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

接下来,您需要配置creds.json文件,这将允许DNSControl向您的DNS提供程序进行身份验证并进行更改。 creds.json的格式略有不同,具体取决于您使用的DNS提供程序。 请参阅官方DNSControl文档中的服务提供商列表 ,以查找您自己的提供商的配置。

~/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文件中定义这些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('example.com', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
    A('@', 'your-server-ip')
);

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

构成基本DNSControl配置文件有三个主要功能:

  • NewRegistrar(name, type, metadata) :定义域名的域名注册商。 DNSControl可以使用它来进行必要的更改,例如修改权威的Nameservers。 如果您只想使用DNSControl来管理DNS区域,通常可以保留为NONE

  • NewDnsProvider(name, type, metadata) :为您的域名或委派区域定义DNS服务提供商。 这是DNSControl将推动您所做的DNS更改的地方。

  • D(name, registrar, modifiers) :为要管理的DNSControl定义域名或委派的DNS区域,以及区域中存在的DNS记录。

您应该使用官方DNSControl文档中的Service Providers列表相应地配置NewRegistrar()NewDnsProvider()D()

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

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

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

第4步 - 填充DNS配置文件

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

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

每个标准DNS记录类型都存在域修饰符,包括AAAAAMXTXTNSCAA等。 DNSControl文档的“ 域修改器”部分提供了可用记录类型的完整列表。

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

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

  • 记录:

    • 目的:指向IPv4地址。
    • 语法: A(' name ', ' address ', optional record modifiers)
    • 示例: A(' @ ', ' your-server-ip ', TTL( 30 ))
  • AAAA记录:

    • 目的:指向IPv6地址。
    • 语法: AAAA(' name ', ' address ', optional record modifiers)
    • 示例: AAAA(' @ ', ' 2001:db8::1 ') (记录修饰符省略,因此将使用默认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配置文件:

cd ~/dnscontrol
nano dnsconfig.js

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

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

〜/ dnscontrol / dnsconfig.js
...

D('example.com', REG_NONE, DnsProvider(DNS_DIGITALOCEAN),
    A('@', 'your-server-ip'),
    A('www', 'your-server-ip'),
    A('mail', 'your-server-ip'),
    AAAA('@', '2001:db8::1'),
    AAAA('www', '2001:db8::1'),
    AAAA('mail', '2001:db8::1'),
    MX('@', 10, 'mail.example.com.'),
    TXT('@', 'v=spf1 -all'),
    TXT('_dmarc', 'v=DMARC1; p=reject; rua=mailto:abuse@example.com; aspf=s; adkim=s;')
);

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

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

第5步 - 测试和部署DNS配置

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

首先,进入你的dnscontrol目录:

cd ~/dnscontrol

接下来,使用DNSControl的preview功能检查文件的语法,并输出它将进行的更改(不实际制作):

dnscontrol preview

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

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

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

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

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

dnscontrol push

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

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

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

DigitalOcean控制面板的屏幕截图,显示DNSControl所做的一些DNS更改。

您还可以通过为域/委派区域运行DNS查询来检查记录创建。 您将看到记录已相应更新:

dig +short example.com

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

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

结论

在本文中,您设置DNSControl并将DNS配置部署到实时提供程序。 现在,您可以在将其部署到生产环境之前,在安全的脱机环境中管理和测试DNS配置更改。

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

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