本作品采用知识共享署名 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 |
正在发生更新还是创建 |
是 |
从请求中获取名称
确保请求者在允许的通知者列表中
调用后端的 find_domain,以查看消息是否针对 DNS 服务器上的区域。如果不是,则丢弃该消息
根据 RFC (????) 查询请求的 mdns (SOA)
异步调用 Agent 的 AXFR 模块,该模块将执行 AXFR,获取区域并根据操作调用后端的 create 或 update domain。
_handle_delete(request)¶
参数 |
描述 |
必需 |
|---|---|---|
请求 |
来自 DNS 请求的序列化请求数据 |
是 |
从请求中获取名称
确保请求者在允许的通知者列表中
调用后端的 delete_domain
_handle_record_query(request)¶
参数 |
描述 |
必需 |
|---|---|---|
请求 |
来自 DNS 请求的序列化请求数据 |
是 |
重新打包请求,将其发送到本地 DNS 服务器
返回结果
这可能是 Agent 在 MiniDNS 轮询更改时回答 DNS 查询的一种方式
AXFR¶
AXFR 模块将 AXFR 查询发送到配置中为区域名称指定的其中一个主服务器。根据调用 AXFR 的查询类型,将使用从 AXFR 收集的信息对后端进行调用。
_do_axfr(zone_name, action)¶
参数 |
描述 |
必需 |
|---|---|---|
zone_name |
要请求 AXFR 的区域名称 |
是 |
new_domain |
布尔值,告知 AXFR 区域是新区域还是不是。默认值为 False |
否 |
从配置文件中选择一个主服务器
发送 AXFR 查询
将响应解析为 designate 域对象
调用后端执行指定的动作(创建、更新)
注意
最终,此模块可以重命名为“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 接收消息
添加一个基本类后端,该后端用于不同的操作
移植一些现有的后端,或添加一些新的后端