zorun.nsd

NSD 的 Ansible 角色

这个 Ansible 角色安装和配置 NSD,一个权威的 DNS 服务器。 它还允许将 DNS 区域发布到 NSD。

安装

这个角色可以在 Ansible Galaxy 上找到。

特性

这个角色支持 NSD3 和 NSD4,允许管理 NSD 配置 和区域文件,可以以主模式或从模式运行,支持或不支持区域传输(TSIG)。

与其他 NSD 角色相比,它有以下特点:

  • 允许将区域数据存储在“经典”区域文件中,而不是像 这里 那样将区域写成 Ansible 变量
  • 区域文件被解析为 Jinja 模板,以防您需要动态内容
  • 支持主从场景,或两者的混合(同一 NSD 服务器上某些区域作为主,某些区域作为从运行)
  • 完全通用的 NSD 配置(您可以自由定义 NSD 支持的任何配置属性,角色中没有硬编码的列表)。这与 这里 相似,但语法更简单(自动扩展列表)
  • 支持区域传输:TSIG 密钥、通知从服务器等……
  • 希望灵活且易于使用!

但是,它不处理防火墙配置或邮件,并且目前只支持 Debian。

用例

注意:所有这些用例可以在每个区域中独立使用!也就是说,一个 NSD 服务器可以是 example.com 的主服务器,同时又是 example.org 的从服务器。

纯多主模式

如果您所有的 DNS 服务器都是通过 Ansible 配置的,这是最简单的设置: 所有服务器都是区域的主服务器,区域数据通过 Ansible 部署。

在这种设置中,无需基于 DNS 的区域传输。

带有额外从服务器的多主模式(未通过该角色配置)

在这个设置中,使用 Ansible 配置一个或多个主服务器,与之前的用例相同。然而,还设置了基于 DNS 的区域传输,以允许外部从服务器从主服务器获取区域数据。每当 Ansible 更新主服务器上的区域时,它会告诉 NSD 通知从服务器。

请注意,在此设置中,配置从服务器的职责在您自己(接受来自所有主服务器的通知,并从一个或多个主服务器获取区域数据)。

仅从服务器

在这个设置中,NSD 服务器仅配置为该区域的从服务器。 在这种情况下,不会将区域数据复制到服务器,因为数据将通过正常的 DNS 区域传输机制从外部主服务器获取。

请注意,在这种设置中,适当地配置主服务器的职责在于您自己(通知从服务器,并允许从服务器进行区域传输)。

要求

该角色在 Debian(wheezy、jessie、stretch、buster、bullseye)上进行了测试。 它可能在其他系统上工作,但需要一些调整,欢迎补丁。

该角色不设置 nsd-control,因为这已经由 Debian 包自动完成。 其他系统可能需要通过 Ansible 设置它。

角色变量

这部分记录了您可以在剧本中设置的所有角色变量。有关完整示例,请参见此 README 的末尾。

服务器配置

nsd_server_config [dict]

将添加到 NSD 的 server: 配置部分的键值对字典。值可以是字符串或列表。在后一种情况下,值将被扩展为多个配置项。

您可以在此字典中添加您想要的任何配置选项,但确保它是 NSD 理解的配置选项! 作为安全保障,该角色要求 NSD 在继续前验证生成的配置,但是在运行 ansible-playbook --check 时不会执行此操作。

nsd_local_server_config [dict]

nsd_server_config 具有相同的语法和语义。 提供这个第二个变量是为了让向单台机器添加特定配置更加方便。通常您会在 group_vars 或剧本中定义 nsd_server_config,而 nsd_local_server_config 则在 host_vars 中定义。

TSIG 密钥

nsd_tsig_keys [list of dict]

可选的 TSIG 密钥列表。每个 TSIG 密钥必须是具有以下属性的字典:

  • tsig_keyname:此 TSIG 密钥的名称。在主/从 DNS 配置中,主服务器和从服务器的 TSIG 密钥名称必须相同!此名称也用于从 nsd_primary_zonesnsd_secondary_zones 角色变量中引用 TSIG 密钥。 必填
  • tsig_secret:密钥的 base64 编码值。 必填
  • tsig_algorithm:密钥使用的算法,例如 hmac-md5必填

主区域

nsd_primary_zones [list of dict]

作为主服务器提供的区域列表。每个区域必须是具有以下属性的字典:

  • zone_name:区域的名称,例如 example.com8.b.d.0.1.0.0.2.ip6.arpa.必填
  • zone_filename:包含区域数据的文件名(将在 files/nsd/ 中搜索)。 必填
  • slaves:DNS 从服务器的列表,格式在下面描述。 可选

从服务器条目的格式如下:

  • ip:DNS 从服务器的 IPv4 或 IPv6 地址。将用来发送“通知”消息,并允许从此 IP 处进行区域传输。 必填
  • tsig_key:在与该从服务器通信时使用的 TSIG 密钥的名称。名称必须与之前定义的 TSIG 密钥的 tsig_keyname 字段匹配, 可选

从区域

nsd_secondary_zones [list of dict]

作为从服务器提供的区域列表。每个区域必须是具有以下属性的字典:

  • zone_name:区域的名称,例如 example.com8.b.d.0.1.0.0.2.ip6.arpa.必填
  • masters:DNS 主服务器的列表,格式在下面描述。 可选,但没有主服务器的从区域几乎没有用处。

主服务器条目的格式如下:

  • ip:DNS 主服务器的 IPv4 或 IPv6 地址。将用于请求区域传输,并允许通知消息。 必填
  • tsig_key:在与该主服务器通信时使用的 TSIG 密钥的名称。名称必须与之前定义的 TSIG 密钥的 tsig_keyname 字段匹配, 可选

高级配置变量

对于大多数情况,这些变量不需要更改。 变量以其默认值呈现。

nsd_local_zones_dir: files/nsd/

查找区域文件的本地目录(zone_filename 条目相对于该目录)。

nsd_version: 4

NSD 的版本。用于跳过不根据版本而有意义的任务或处理程序。

nsd_service_name: "nsd"

用于重新启动 NSD 的初始化服务名称。

nsd_pkg_name: "nsd"

要安装的包的名称。

nsd_control_program: "/usr/sbin/nsd-control"

用于控制 NSD 的程序,执行重新加载、重建、通知等。

nsd_config_dir: "/etc/nsd"

将存储 NSD 配置的目录。

nsd_zones_config_file: "/etc/nsd/zones.conf"

将包含区域配置的配置文件名称(然后从主 NSD 配置文件中包含)。

nsd_primary_zones_dir: "/etc/nsd/primary"

该角色将复制区域文件的目录。

nsd_secondary_zones_dir: "/etc/nsd/secondary"

从区域传输后 NSD 将放置从区域文件的目录。

示例剧本

这是一个完整的示例剧本,包含多个 TSIG 密钥和多个 DNS 区域: 第一个区域是没有从服务器的主区域,第二个区域有两个从服务器,第三个区域是具有两个主服务器的从区域。

- hosts: dnsservers
  roles:
    - nsd
  vars:
    nsd_server_config:
      verbosity: 2
      ip4-only: 'yes'
    nsd_tsig_keys:
      - tsig_keyname: "tsig-key.example.org"
        tsig_secret: "3znH//y866vzpOZdahYYUlWeiY4iidiJGFRX6CI6OkUBggRNYFpZAMvlYbtnUosiBVPsgghA6zT0TzOEX0vetQ=="
        tsig_algorithm: hmac-md5
      - tsig_keyname: "key-eu.org"
        tsig_secret: "t6ELXqsSLYl57iO2rxj+X9+DNpOV3exTBFWu9wS/3jI="
        tsig_algorithm: hmac-sha256
    nsd_primary_zones:
      - zone_name: "example.com."
        zone_filename: "example.com.zone"
      - zone_name: "example.org."
        zone_filename: "example.org.zone"
        slaves:
          - ip: 2001:db8:42:1337::1
            tsig_key: "tsig-key.example.org"
          - ip: 198.51.100.12
            tsig_key: "tsig-key.example.org"
          - ip: 203.0.113.8
    nsd_secondary_zones:
      - zone_name: "example.eu.org"
        masters:
          - ip: 192.0.2.42
          - ip: 2001:db8:1234:5678::9
            tsig_key: "key-eu.org"

host_vars/ns1.yml 中:

nsd_local_server_config:
  ip-address: ['2001:db8:ffff::42', '203.0.113.199']

两个主区域的数据需要存储在 nsd_local_zones_dir 中(默认位于您的 Ansible 目录根目录的 files/nsd/):

# ls files/nsd/
example.org.zone   example.com.zone
# head -3 files/nsd/example.org.zone
$ORIGIN example.org
$TTL 3h
@  IN  SOA  ns1 root.example.org. (2017090101 1d 2h 4w 1h)

您可以在区域文件中使用 Jinja 模板生成动态记录。

示例高级配置

如果您需要更高级的自定义,可以使用高级变量。例如,为了支持 Debian wheezy 上的 NSD3,适当的配置为:

nsd_version: 3
nsd_service_name: "nsd3"
nsd_pkg_name: "nsd3"
nsd_control_program: "/usr/sbin/nsdc"
nsd_config_dir: "/etc/nsd3"
nsd_zones_config_file: "/etc/nsd3/zones.conf"
nsd_primary_zones_dir: "/etc/nsd3/primary"
nsd_secondary_zones_dir: "/etc/nsd3/secondary"

这些可以放在 group_vars/wheezy.yml 文件或类似位置中。

限制

对于给定区域,使用此角色的所有机器必须全部是主服务器或全部是从服务器。

这大大简化了配置,并且通常不需要让同一区域的主机和从机通过 Ansible 处理,因为 Ansible 可以将区域数据推送到所有服务器(可以让它们都成为主服务器)。

您可以通过简单地多次调用此角色,使用不同的机器和不同的配置来绕过此限制。

有些情况下,多个主服务器的区域由 Ansible 推送可能并不理想:

  • 动态 DNS 记录(无论如何 NSD 不支持)
  • DNSSEC(我没有 DNSSEC 的经验,欢迎贡献)

许可证

MIT

关于项目

Configure NSD and DNS zones on Debian

安装
ansible-galaxy install zorun.nsd
许可证
mit
下载
2.9k
拥有者