本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode

New Agent

此规范描述了为 Designate 提出的一个服务,暂定名为“Agent”,不要与当前同名的组件混淆。

术语

术语

含义

AXFR

DNS 区域传输

NOTIFY

DNS 协议,用于通知区域更新

OPCODE

DNS 消息的一部分,告知操作 http://bit.ly/1pfG8Zp

后端

不同 DNS 服务器的代码路径

MiniDNS

Designate 组件,负责发送 NOTIFY,并响应 AXFR。

问题描述

MiniDNS 为许多 DNS 安装提供了一个非常优雅的解决方案。拥有 Designate 组件作为 DNS 主服务器,可以使 Designate 对 DNS 服务器拥有很大的控制权,并使跨后端实现某些过程变得更加容易。

然而,某些部署可能无法将 MiniDNS 作为真正的 DNS 主服务器使用,而是希望以某种形式保留当前的后端样式,同时获得 MiniDNS 的好处。他们可能需要 Designate 和 DNS 服务器之间更专业化的交互方式,从而使 Designate 更加灵活。此外,MiniDNS 及其数据库作为 DNS 基础设施的单点故障也存在潜在问题。

提议的变更

部署在主 DNS 服务器上的 Agent 可以解决这些问题。一个可插拔的后端,使用户能够使用任何后端与 MiniDNS 配合使用,并且能够在大型部署中将 MiniDNS 从主服务器中隔离,这些都通过 Agent 变得更加简单。

Agent 将是一个独立的服務,充当 MiniDNS 的镜像。它将接收 AXFR/IXFR、NOTIFY 和其他通知,并通过插件式后端对 DNS 服务器执行更改。

Pool Manager 变更

将为 Agent 创建一个新的 Pool Manager 后端。它应该发送“fire-and-forget” DNS 消息,其中包含用于私有用途的类和 RRTYPE,如下所示:http://bit.ly/1soCZTffor 在创建/删除时,并像往常一样调用 MiniDNS 进行更新。

Agent 变更

需要创建 Agent 服务(可能取代旧的“agent”)

该结构将与 MiniDNS 非常相似。一个服务(TCP,而不是 RPC)将监听 TCP 和 UDP 流量。将处理 NOTIFY 和 AXFR,以及常规 DNS 查询(通过传递到真实的 DNS 服务器),以及用于表示创建和删除的特殊 DNS 类和 RRDTYPE。DNS 流量将导致调用配置的后端。一个特殊的 OPCODE,14 将用于所有非标准操作,例如创建和删除区域。

配置

参数

默认值

必需

注意事项

backend_driver

‘None’

与 Agent 一起使用的后端驱动程序的名称

workers

要启动的 worker 进程数

masters

[]

Agent 将查询 AXFR 和 SOA 查询的主服务器的 IP/端口列表

allow-notify

[]

允许 NOTIFY/AXFR 与 Agent 通信的主服务器的 IP/端口列表

host

‘0.0.0.0’

Agent 的绑定主机

port

5354

绑定端口

tcp_backlog

100

Agent 的 TCP backlog

还将为不同的后端提供子配置部分,使用 [agent:backend_name] 的形式。这些将主要从当前的后端移植。

服务

服务的初始化,以及 TCP/UDP 流量的基本处理。对传入的流量进行一些验证,确保在发送到核心应用程序逻辑之前它是有效的。这应该主要来自 designate/mdns/service.py。由于 Agent 将仅与 mdns 通信,因此可以进行一些优化。

中间件

一个薄中间件,位于 TCP 消息接收和处理程序之间。允许将上下文或其他元数据附加到请求,然后再将其发送到处理程序。

处理程序

处理程序将接收 DNS 请求,并采取适当的操作。这将与 mdns/handler.py 非常相似

_handle_update(request, op)

参数

描述

必需

请求

来自 DNS 请求的序列化请求数据

op

正在发生更新还是创建

  1. 从请求中获取名称

  2. 确保请求者在允许的通知者列表中

  3. 调用后端的 find_domain,以查看消息是否针对 DNS 服务器上的区域。如果不是,则丢弃该消息

  4. 根据 RFC (????) 查询请求的 mdns (SOA)

  5. 异步调用 Agent 的 AXFR 模块,该模块将执行 AXFR,获取区域并根据操作调用后端的 create 或 update domain。

_handle_delete(request)

参数

描述

必需

请求

来自 DNS 请求的序列化请求数据

  1. 从请求中获取名称

  2. 确保请求者在允许的通知者列表中

  3. 调用后端的 delete_domain

_handle_record_query(request)

参数

描述

必需

请求

来自 DNS 请求的序列化请求数据

  1. 重新打包请求,将其发送到本地 DNS 服务器

  2. 返回结果

这可能是 Agent 在 MiniDNS 轮询更改时回答 DNS 查询的一种方式

AXFR

AXFR 模块将 AXFR 查询发送到配置中为区域名称指定的其中一个主服务器。根据调用 AXFR 的查询类型,将使用从 AXFR 收集的信息对后端进行调用。

_do_axfr(zone_name, action)

参数

描述

必需

zone_name

要请求 AXFR 的区域名称

new_domain

布尔值,告知 AXFR 区域是新区域还是不是。默认值为 False

  1. 从配置文件中选择一个主服务器

  2. 发送 AXFR 查询

  3. 将响应解析为 designate 域对象

  4. 调用后端执行指定的动作(创建、更新)

注意

最终,此模块可以重命名为“Transfer”并执行 IXFR。

后端

后端模块将包含一个基本插件,以及与 Pool Manager 类似的各种插件。目的是获取从 AXFR(或 IXFR)收集到的区域更改,并将其应用于 DNS 服务器。完成此操作的方式将因每个 DNS 服务器而异,您可能正在编辑一个平面文件,或者进行数据库调用,或者使用其他方法。以下方法将构成基本插件。

find_zone(zone_name)

参数

描述

必需

zone_name

要搜索的区域名称

当 NOTIFY 收到一个区域时,Agent 必须首先检查以确保该区域对 DNS 服务器有效。否则,它可能会执行 AXFR 并尝试更新服务器上不存在的区域。有可能此检查可以合并到 update_zone 函数中,但在这里执行似乎更有效。

create_zone(domain)

参数

描述

必需

domain

要在后端服务器上创建的 Designate 域对象,包括其记录集

采取适当的措施在 DNS 服务器上创建区域。此对象将包含服务该区域所需的所有必要信息。

update_zone(domain)

参数

描述

必需

domain

要在后端服务器上更新的 Designate 域对象,包括其记录集

采取适当的措施在 DNS 服务器上更新区域。如果无法区分此对象与服务器上的区域之间的差异,则这可能与 create_zone 逻辑非常相似。

delete_zone(zone_name)

参数

描述

必需

zone_name

标识为删除的区域名称

采取适当的措施在 DNS 服务器上删除区域,并理想情况下删除其所有子资源。

其他变更

这应该很好地适应 Designate 模式。对于 Pool Manager 和 MiniDNS 来说,Agent 与任何其他 DNS 服务器相同。MiniDNS 可以补充一些内容以与 Agent 一起使用,但不需要。

MiniDNS 用于实际 DNS 协议内容的大量代码将在 Agent 中以某种形式重用。开发 Agent 是一个将公共点移植到 Designate 的 dnsutils 模块的好时机。

好处

  • 可配置的后端,可以完成不同 DNS 服务器(RNDC、数据库添加)所需的工作,而无需直接连接到数据库

  • 可以使用 MiniDNS 的好处,同时保持传统的 Master/Slave DNS 设置是可能的

  • Designate 必须管理的 DNS 服务器更少

  • MiniDNS 和数据库之间的通信减少,因为 SOA 刷新和其他查询可以由主服务器处理

  • MiniDNS 对部署来说不那么重要,MiniDNS/数据库问题与 DNS 基础设施隔离

  • 具有直接控制 DNS 服务器的 Agent 增加了在纯 DNS 协议之外做事情的好处,例如定期同步等,这些都更容易实现

实现

负责人

主要负责人

tim-simmons-t

里程碑

完成目标里程碑

Kilo

工作项

  • 创建 Agent 服务

  • 添加支持接收 NOTIFY

  • 添加支持接收 AXFR

  • 确定并实现使用非标准 CLASS/RRDATA 接收消息

  • 添加一个基本类后端,该后端用于不同的操作

  • 移植一些现有的后端,或添加一些新的后端