如何在 Debian 10 上使用 OctoDNS 部署和管理 DNS

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

介绍

OctoDNS是一个 infrastructure-as-code工具,允许您使用标准的软件开发原则部署和管理您的DNS区域,包括版本控制,测试和自动部署。 OctoDNS由 GitHub创建,并以Python编写。

使用OctoDNS消除了手动DNS管理的许多陷阱,因为区文件被以结构化格式存储(YAML. 这使得您可以同时向多个 DNS 提供者部署区域,识别语法错误,并自动推出您的 DNS 配置,降低人为出错的风险. OctoDNS的另一种常见用法是在不同的提供者之间,例如测试和生产系统,或者在活到故障环境之间,同步您的 DNS 配置.

OctoDNS与DNS Control相似,是Stack Exchange创建并用Go来书写的一个等效工具. 与OctoDNS不同,DNS Control使用基于JavaScript的配置语言来定义DNS区,这使得您可以使用循环等高级程序特性来指定同区内的多个类似记录. 文章[如何在Debian 10上使用 DNS Control来部署和管理您的 DNS (https://andsky.com/tech/tutorials/how-to-deploy-and-manage-your-dns-using-dnscontrol-on-debian-10) 涵盖了 DNS Control 的基本设置和配置.

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

前提条件

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

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

第1步:安装OctoDNS

OctoDNS以 Python pip 包的形式分发,并在 Python 虚拟环境中运行(virtualeenv),所以您会从此步骤开始安装为此所需的包. `virtualeenv'是一个孤立的Python环境,可以有自己的库和配置,与全系统主要的Python安装分离. Python和'virtualeenv'在Debian默认的软件存储器内可以使用,从而有可能使用常规的软件包管理工具来安装.

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

1sudo apt update

然后,安装pythonvirtualenv包:

1sudo apt install python virtualenv

确认安装后,apt 将下载并安装 Python、virtualenv 和所有所需的依赖。

接下来,您将创建所需的 OctoDNS 目录,在那里存储您的 DNS 和程序配置. 开始创建 ~/octodns~/octodns/config 目录:

1mkdir ~/octodns ~/octodns/config

现在进入~/octodns:

1cd ~/octodns

接下来,您需要创建 Python 虚拟环境 - 一个具有自己的库和配置的孤立 Python 环境,以在:

1virtualenv env

用以下命令激活您的环境:

1source env/bin/activate

这将产生类似于以下的东西:

1[secondary_label Output]
2Running virtualenv with interpreter /usr/bin/python2
3New python executable in /home/user/octodns/env/bin/python2
4Also creating executable in /home/user/octodns/env/bin/python
5Installing setuptools, pkg_resources, pip, wheel...done.

您的 Bash shell 提示也将以虚拟环境的名称为前缀,这表明您目前在virtualenv中运行:

1(env) user@digitalocean:~/octodns$

如果你想退出virtualenv,你可以随时使用禁用命令,但是,你应该留在你的virtualenv继续这个教程。

现在你已经安装和配置了Python和virtualenv,你可以安装OctoDNS。

您可以使用以下命令在您的virtualenv中安装 OctoDNS pip 包:

1pip install octodns

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

1octodns-sync --version

您的输出将看起来如下:

1[secondary_label Output]
2octoDNS 0.9.9

如果您看到octodns-sync:命令未找到错误,请双重检查您是否仍然在您的virtualenv中。

现在您已经安装了 OctoDNS,您可以创建所需的配置文件,将 OctoDNS 连接到您的 DNS 提供商,以允许它对您的 DNS 记录进行更改。

步骤 2 — 配置 OctoDNS

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

<$>[注] 注: 本教程将专注于OctoDNS的初始设置;然而,对于生产使用,建议将您的OctoDNS配置存储在版本控制系统(VCS)中,如 Git

首先,您需要配置 config.yaml 文件,该文件定义了 OctoDNS 要管理的 DNS 区域,并允许它对您的 DNS 提供商进行身份验证并进行更改。

),以找到您自己的提供商的配置. 在查看此超链接时,配置细节作为代码注释在您提供者的实际Python代码中显示,该代码在表格"提供"一栏中链接. 一旦找到供货商的Python代码,如cloudflare.py'或route53.py',相关代码注释可直接从class'下找到。 提供者名称 ' 。 例如:

 1[label Excerpt of octodns/provider/route53.py]
 2class Route53Provider(BaseProvider):
 3  '''
 4  AWS Route53 Provider
 5  route53:
 6      class: octodns.provider.route53.Route53Provider
 7      # The AWS access key id
 8      access_key_id:
 9      # The AWS secret access key
10      secret_access_key:
11      # The AWS session token (optional)
12      # Only needed if using temporary security credentials
13      session_token:

移动到~/octodns/config目录:

1cd ~/octodns/config

然后创建并打开config.yaml来编辑:

1nano config.yaml

如果您正在使用 DigitalOcean 作为您的 DNS 提供商,您可以使用以下方法:

 1[label ~/octodns/config/config.yaml]
 2---
 3providers:
 4  config:
 5    class: octodns.provider.yaml.YamlProvider
 6    directory: ./config
 7    default_ttl: 300
 8    enforce_order: True
 9  digitalocean:
10    class: octodns.provider.digitalocean.DigitalOceanProvider
11    token: your-digitalocean-oauth-token
12
13zones:
14  your-domain.:
15    sources:
16      - config
17    targets:
18      - digitalocean

该文件告诉OctoDNS您希望它连接到哪些DNS提供商,以及它应该为这些提供商管理哪些DNS区域。

您需要为您的 DNS 提供商提供某种形式的身份验证,这通常是 API 密钥或 OAuth 代币。

如果您不希望在配置文件中以简单文本存储您的访问代码,则可以在程序运行时将其作为环境变量传递给您。

1[label ~/octodns/config/config.yaml]
2token: env/DIGITALOCEAN\_OAUTH\_TOKEN

然后,在运行 OctoDNS 之前,将相应的环境变量设置为您的访问代币,并且在运行时,OctoDNS 将从那里读取:

1export DIGITALOCEAN\_OAUTH\_TOKEN=your-digitalocean-oauth-token

<$>[警告] 警告: 此代码将允许访问您的 DNS 提供商帐户,因此您应该像使用密码一样保护它。

如果您正在使用DigitalOcean作为您的DNS提供商,您可以使用所需的OAuth代币(在您的DigitalOcean帐户设置中)(https://cloud.digitalocean.com/settings/applications)作为前提条件的一部分。

如果您有多个不同的 DNS 提供商 - 例如,用于多个域名或授权 DNS 区域 - 您可以在相同的 config.yaml 文件中定义所有这些。

您已经设置了最初的 OctoDNS 配置文件,以允许该程序对您的 DNS 提供商进行身份验证并进行更改。

第3步:创建 DNS 配置文件

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

您想要使用 OctoDNS 管理的每个 DNS 区域都有自己的文件,例如 your-domain.yaml. 在此文件中,该区域的 DNS 记录是使用 YAML定义的。

要开始,请进入 ~/octodns/config 目录:

1cd ~/octodns/config

然后创建并打开your-domain.yaml进行编辑:

1nano your-domain.yaml

将以下样本配置添加到文件中:

1[label ~/octodns/config/your-domain.yaml]
2---
3'':
4  - type: A
5    value: your-server-ipv4-address
6
7www:
8  - type: A
9    value: your-server-ipv4-address

此样本文件定义了一个 DNS 区域为),另一个记录为).

一旦完成,保存并关闭文件。

您已经为 OctoDNS 设置了一个基本的 DNS 区域配置文件,其中有两个基本的A记录指向您的域或网站的 IPv4 地址。

步骤 4 — 普及您的 DNS 配置文件

接下来,您可以将 DNS 配置文件填充到您的网站或服务的实际 DNS 记录集中,使用 YAML 结构配置语言。

與傳統的 BIND 區域檔案不同,在 DNS 記錄是以原始的,一行一行格式寫的,在 OctoDNS 內的 DNS 記錄被定義為 YAML 鑰匙和子鑰匙,有幾個相關的值,正如在步驟 3 中簡要顯示的。

顶级密钥通常为"'name'",本质上是记录标识符. www'、subdomain1'和mail'都是DNS'名称'的例子。 在"OctoDNS"中,有两种特殊用名,即""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 每个密钥(DNS记录)的必要值为"类型". 此定义您正在定义的 YAML 顶级密钥中的 DNS 记录类型 。 每个标准DNS记录类型都存在 " 类型 " ,包括 " A " 、 " AAAA " 、 " M " 、 " TXT " 、 " NS " 、 " CNAME " 等。 OctoDNS文档的记录部分载有一份完整的现有记录类型清单.

DNS 记录的值被定义为直接为顶级密钥的值(如果您只有一个值),或者作为列表(如果您有多个值,例如多个 IP 地址或 MX 地址)。

例如,要定义单个值,您可以使用以下配置:

1[label ~/octodns/config/your-domain.yaml]
2'www':
3  type: A
4  value: 203.0.113.1

或者,为单个记录定义多个值:

1[label ~/octodns/config/your-domain.yaml]
2'www':
3  type: A
4  values:
5  - 203.0.113.1
6  - 203.0.113.2

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

A记录:

目的:指向 IPv4 地址。

语法:

1'name':
2  type: A
3  value: ipv4-address

例子:

1'www':
2  type: A
3  value: your-server-ipv4-address

AAAA记录:

目的:指向 IPv6 地址。

语法:

1'name':
2  type: AAAA
3  value: ipv6-address

例子:

1'www':
2  type: AAAA
3  value: your-server-ipv6-address

CNAME记录:

目的:使您的域名/子域名成为另一个域名的名称。

语法:

1'name':
2  type: CNAME
3  value: fully-qualified-domain-name

例子:

1'www':
2  type: CNAME
3  value: www.example.org

MX记录:

目的:向特定服务器/地址发送电子邮件。

语法:

1'name':
2  type: MX
3  value:
4    exchange: mail-server
5    preference: priority-value

请注意,如果 MX 值中有任何点,则必须包含后续 . **。

例子:

1'':
2  type: MX
3  value:
4    exchange: mail.your-domain.
5    preference: 10

TXT记录:

目的:添加任意的简单文本,通常用于没有自己的专用记录类型的配置。

语法:

1'name':
2  type: TXT
3  value: content

例子:

1'':
2  type: TXT
3  value: This is a TXT record.

要开始为您的域或授权 DNS 区域添加 DNS 记录,请编辑您的 DNS 配置文件:

1cd ~/octodns/config
2nano your-domain.yaml

接下来,您可以使用前面列表中描述的语法开始填充您的 DNS 区域,以及官方 OctoDNS 文档的 Records部分。

作为参考,这里的代码块包含一个初始 DNS 设置的完整样本配置:

 1[label ~/octodns/config/your-domain.yaml]
 2---
 3'':
 4  - type: A
 5    value: your-server-ipv4-address
 6
 7  - type: AAAA
 8    value: your-server-ipv6-address
 9
10  - type: MX
11    value:
12      exchange: mail.your-domain.
13      preference: 10
14
15  - type: TXT
16    value: v=spf1 -all
17
18_dmarc:
19  type: TXT
20  value: v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;
21
22mail:
23  - type: A
24    value: your-server-ipv4-address
25
26  - type: AAAA
27    value: your-server-ipv6-address
28
29www:
30  - type: A
31    value: your-server-ipv4-address
32
33  - type: AAAA
34    value: your-server-ipv6-address

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

在此步骤中,您将设置最初的 DNS 配置文件,其中包含您的 DNS 记录。

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

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

首先,进入您的octodns目录:

1cd ~/octodns

通过在您的Bash提示之前搜索其名称来双重检查您是否仍然在Python中的virtualenv中运行:

1(env) user@digitalocean:~/octodns$

接下来,使用octodns-validate命令来检查您的配置文件的语法,您需要指定到您的配置文件的路径:

1octodns-validate --config=./config/config.yaml

如果您的 DNS 配置文件的 YAML 语法正确,OctoDNS 将无输出而返回. 如果您在输出中看到错误或警告,OctoDNS 将提供错误所在位置的详细信息。

接下来,您可以执行DNS配置的干式推移,这将输出哪些更改将进行,而实际上不会进行这些更改:

1octodns-sync --config=./config/config.yaml

这应该产生类似于以下的产出:

 1[secondary_label Output]
 2********************************************************************************
 3* your-domain.
 4********************************************************************************
 5* digitalocean (DigitalOceanProvider)
 6*   Create <ARecord A 300, mail.your-domain., ['your-server-ipv4-address']> (config)
 7*   Create <AaaaRecord AAAA 300, mail.your-domain., ['your-server-ipv6-address']> (config)
 8*   Create <TxtRecord TXT 300, your-domain., ['v=spf1 -all']> (config)
 9*   Create <AaaaRecord AAAA 300, your-domain., ['your-server-ipv6-address']> (config)
10*   Create <ARecord A 300, your-domain., ['your-server-ipv4-address']> (config)
11*   Create <ARecord A 300, www.your-domain., ['your-server-ipv4-address']> (config)
12*   Create <MxRecord MX 300, your-domain., [''10 mail.your-domain.'']> (config)
13*   Create <TxtRecord TXT 300, _dmarc.your-domain., ['v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;']> (config)
14*   Create <AaaaRecord AAAA 300, www.your-domain., ['your-server-ipv6-address']> (config)
15*   Summary: Creates=9, Updates=0, Deletes=0, Existing Records=2
16********************************************************************************

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

最后,您可以将更改推到您的直播DNS提供商:

1octodns-sync --config=./config/config.yaml --doit

注意:在某些情况下,如果 OctoDNS 正在进行大量调整,OctoDNS 将拒绝推动更改。 这是一个自动保护功能,以防止意外错误配置。 如果您遇到这种拒绝,您可以使用--force选项重新运行octodns-sync,但请确保您准备好这样做。

在此步骤中早些时候,您将看到一个类似于干运行的输出,但添加了类似于以下的东西:

1[secondary_label Output]
22019-07-07T23:17:27 INFO DigitalOceanProvider[digitalocean] apply: making changes
32019-07-07T23:17:30 INFO Manager sync:   9 total changes

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

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

您还可以通过使用挖掘来对您的域/授权区运行 DNS 查询来检查创建记录。

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

1sudo apt install dnsutils

一旦你安装了挖掘,你可以使用它来为你的域进行DNS搜索,你会看到记录已相应地更新:

1dig +short your-domain

您将看到输出显示 IP 地址和您使用 OctoDNS 部署的区域的相关 DNS 记录。

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

结论

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

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

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

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