欢迎光临
我们一直在努力

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

作者选择电子前沿基金会作为Write for DOnations计划的一部分接受捐赠。

介绍

OctoDNS是一种基础架构即代码工具,允许您使用标准软件开发原则部署和管理DNS区域,包括版本控制,测试和自动部署。 OctoDNS由GitHub创建,用Python编写。

使用OctoDNS消除了手动DNS管理的许多缺陷,因为区域文件以结构化格式( YAML )存储。 这允许您同时将区域部署到多个DNS提供程序,识别语法错误,并自动推出DNS配置,从而降低人为错误的风险。 OctoDNS的另一个常见用法是在不同的提供程序(例如测试和生产系统)之间或实时和故障转移环境之间同步DNS配置。

OctoDNS类似于DNSControl,它是由Stack Exchange创建并用Go编写的等效工具。 与OctoDNS不同,DNSControl使用基于JavaScript的配置语言来定义DNS区域,这允许您使用高级编程功能(如循环)在同一区域中指定多个类似的记录。 在Ubuntu 18.04上使用DNSControl如何部署和管理DNS的文章介绍了DNSControl的基本设置和配置。

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

先决条件

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

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

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

第1步 – 安装OctoDNS

OctoDNS作为Python pip包分发,并在Python虚拟环境( virtualenv )中运行,因此您将通过安装此所需的软件包开始此步骤。 virtualenv是一个独立的Python环境,可以拥有自己的库和配置,与主系统范围的Python安装分开。 Python和virtualenv可以在Ubuntu的默认软件存储库中使用,从而可以使用传统的包管理工具进行安装。

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

sudo apt update

然后,安装pythonvirtualenv包:

sudo apt install python virtualenv

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

接下来,您将为OctoDNS创建所需的目录,其中将存储您的DNS和程序配置。 首先创建~/octodns~/octodns/config目录:

mkdir ~/octodns ~/octodns/config

现在进入~/octodns

cd ~/octodns

接下来,您需要创建Python虚拟环境 – 一个独立的Python环境,它有自己的库和配置来运行OctoDNS:

virtualenv env

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

source env/bin/activate

这将输出类似于以下内容:

Running virtualenv with interpreter /usr/bin/python2New python executable in /home/user/octodns/env/bin/python2Also creating executable in /home/user/octodns/env/bin/pythonInstalling setuptools, pkg_resources, pip, wheel...done.

您的Bash shell提示符现在也将以虚拟环境的名称为前缀。 这表明您目前在virtualenv

(env) [email protected]:~/octodns$

如果要退出virtualenv ,可以随时使用deactivate命令。 但是,您应该继续使用virtualenv继续本教程。

现在您已经安装并配置了Python和virtualenv ,您可以安装OctoDNS。 OctoDNS作为Python pip包发布,它是Python包和库的标准包管理工具。

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

pip install octodns

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

octodns-sync --version

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

octoDNS 0.9.6

如果您看到octodns-sync: command not found错误,请仔细检查您是否仍在virtualenv

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

第2步 – 配置OctoDNS

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

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

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

config.yaml的格式略有不同,具体取决于您使用的DNS提供程序。 请参阅官方OctoDNS文档中的Supported Providers列表 ,以查找您自己的提供商的配置。 查看此超链接时,配置详细信息将作为代码注释显示在提供程序的实际Python代码中,该代码注释链接在表的“提供程序”列中。 找到供应商的Python代码后,例如cloudflare.pyroute53.py ,可以直接在ProviderName Provider class下找到相关的代码注释。 例如:

octodns / provider / route53.py的摘录
class Route53Provider(BaseProvider):    '''    AWS Route53 Provider    route53:        class: octodns.provider.route53.Route53Provider        # The AWS access key id        access_key_id:        # The AWS secret access key        secret_access_key:        # The AWS session token (optional)        # Only needed if using temporary security credentials        session_token:

进入~/octodns/config目录:

cd ~/octodns/config

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

nano config.yaml

将DNS提供程序的示例config.yaml配置添加到该文件。 如果您使用DigitalOcean作为DNS提供商,则可以使用以下内容:

〜/ octodns /配置/ config.yaml
---providers:  config:    class: octodns.provider.yaml.YamlProvider    directory: ./config    default_ttl: 300    enforce_order: True  digitalocean:    class: octodns.provider.digitalocean.DigitalOceanProvider    token: your-digitalocean-oauth-tokenzones:  your-domain.:    sources:      - config    targets:      - digitalocean

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

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

如果您不希望在配置文件中以纯文本格式存储访问令牌,则可以在程序运行时将其作为环境变量传递。 为此,您应该使用以下token: line而不是config.yaml

〜/ octodns /配置/ config.yaml
token: env/DIGITALOCEAN\_OAUTH\_TOKEN

然后,在运行OctoDNS之前,将相关环境变量设置为您的访问令牌,OctoDNS将在运行时从那里读取它:

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

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

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

如果您有多个不同的DNS提供程序 – 例如,对于多个域名或委派的DNS区域 – 您可以在同一个config.yaml文件中定义所有这些。

您已设置初始OctoDNS配置文件,以允许程序向DNS提供程序进行身份验证并进行更改。 接下来,您将为DNS区域创建配置。

第3步 – 创建DNS配置文件

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

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

首先,进入~/octodns/config目录:

cd ~/octodns/config

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

nano your-domain.yaml

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

〜/ octodns /配置/你的-domain.yaml
---'':  - type: A    value: your-server-ipv4-addresswww:  - type: A    value: your-server-ipv4-address

此示例文件为your-domain定义了一个DNS区域,其中包含两条A记录,指向您托管域或网站的IPv4地址。 一个A记录用于根域(例如, your-domain ),另一个用于www子域(例如www. your-domain )。

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

您已为OctoDNS设置了基本DNS区域配置文件,其中两个基本A记录指向您的域或网站的IPv4地址。 接下来,您将使用一些有用的DNS记录扩展该文件。

第4步 – 填充DNS配置文件

接下来,您可以使用YAML结构化配置语言,使用一组实用的DNS记录填充DNS配置文件。

与传统的BIND区域文件 (其中DNS记录以原始的逐行格式写入)不同,OctoDNS中的DNS记录被定义为YAML密钥和具有多个关联值的子密钥,如第3步中简要所示。

顶级键通常是'name' ,它本质上是记录标识符。 wwwsubdomain1mail都是DNS’name 'name'例子。 在OctoDNS中,有两个特殊用途名称,对于根记录(通常称为@ )是'*' ,对于通配符记录是'*' 每个密钥(DNS记录)的必需值是type 这定义了您在该YAML顶级键中定义的DNS记录类型。 每种标准DNS记录类型都有一种类型,包括AAAAAMXTXTNSCNAME等。 OctoDNS文档的“ 记录”部分提供了可用记录类型的完整列表。

DNS记录的值可以直接定义为顶级键的值(如果只有一个值),也可以定义为列表(如果有多个值,例如多个IP地址或MX地址)。

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

〜/ octodns /配置/你的-domain.yaml
'www':  type: A  value: 203.0.113.1

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

〜/ octodns /配置/你的-domain.yaml
'www':  type: A  values:  - 203.0.113.1  - 203.0.113.2

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

记录:

目的:指向IPv4地址。

句法:

'name':  type: A  value: ipv4-address

例:

'www':  type: A  value: your-server-ipv4-address

AAAA记录:

目的:指向IPv6地址。

句法:

'name':  type: AAAA  value: ipv6-address

例:

'www':  type: AAAA  value: your-server-ipv6-address

CNAME记录:

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

句法:

'name':  type: CNAME  value: fully-qualified-domain-name

例:

'www':  type: CNAME  value: www.example.org

MX记录:

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

句法:

'name':  type: MX  value:    exchange: mail-server    preference: priority-value

请注意尾随. 如果MX值中有任何点,则必须包括在内。

例:

'':  type: MX  value:    exchange: mail.your-domain.    preference: 10

TXT记录:

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

句法:

'name':  type: TXT  value: content

例:

'':  type: TXT  value: This is a TXT record.

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

cd ~/octodns/confignano your-domain.yaml

接下来,您可以使用上一个列表中描述的语法以及官方OctoDNS文档的“ 记录”部分开始填充DNS区域。

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

〜/ octodns /配置/你的-domain.yaml
---'':  - type: A    value: your-server-ipv4-address  - type: AAAA    value: your-server-ipv6-address  - type: MX    value:      exchange: mail.your-domain.      preference: 10  - type: TXT    value: v=spf1 -all_dmarc:  type: TXT  value: v=DMARC1\; p=reject\; rua=mailto:[email protected]your-domain\; aspf=s\; adkim=s\;mail:  - type: A    value: your-server-ipv4-address  - type: AAAA    value: your-server-ipv6-addresswww:  - type: A    value: your-server-ipv4-address  - type: AAAA    value: your-server-ipv6-address

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

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

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

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

首先,进入你的octodns目录:

cd ~/octodns

通过在Bash提示符之前查找它的名称,仔细检查您是否仍在Python virtualenv运行:

(env) [email protected]:~/octodns$

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

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

如果DNS配置文件的YAML语法正确,则OctoDNS将返回,但不输出。

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

接下来,您可以执行DNS配置的干运行推送,该配置将输出将进行的更改,而不实际进行:

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

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

********************************************************************************* your-domain.********************************************************************************* digitalocean (DigitalOceanProvider)*   Create <ARecord A 300, mail.your-domain., ['your-server-ipv4-address']> (config)*   Create <AaaaRecord AAAA 300, mail.your-domain., ['your-server-ipv6-address']> (config)*   Create <TxtRecord TXT 300, your-domain., ['v=spf1 -all']> (config)*   Create <AaaaRecord AAAA 300, your-domain., ['your-server-ipv6-address']> (config)*   Create <ARecord A 300, your-domain., ['your-server-ipv4-address']> (config)*   Create <ARecord A 300, www.your-domain., ['your-server-ipv4-address']> (config)*   Create <MxRecord MX 300, your-domain., [''10 mail.your-domain.'']> (config)*   Create <TxtRecord TXT 300, _dmarc.your-domain., ['v=DMARC1\; p=reject\; rua=mailto:[email protected]your-domain\; aspf=s\; adkim=s\;']> (config)*   Create <AaaaRecord AAAA 300, www.your-domain., ['your-server-ipv6-address']> (config)*   Summary: Creates=9, Updates=0, Deletes=0, Existing Records=2********************************************************************************

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

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

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

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

在这一步中你会看到类似干运行的输出,但是添加了类似于以下内容的东西:

2019-07-07T23:17:27 INFO  DigitalOceanProvider[digitalocean] apply: making changes2019-07-07T23:17:30 INFO  Manager sync:   9 total changes

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

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

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

dig +short your-domain

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

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

结论

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

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

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

赞(0) 打赏
未经允许不得转载:老赵部落 » 如何在Ubuntu 18.04上使用OctoDNS部署和管理DNS

评论 抢沙发