跳转到主要内容

Bind9区域文件的预处理器

项目描述

bindtool

bind9区域文件的预处理器。

此工具对于管理bind9 DNS服务器的区域文件非常有用。它提供了基本的变量替换和自动生成多种类型的DNS记录,特别是基于外部资源(如公钥)的记录。当密钥更改时,无需编辑区域文件,这极大地简化了保持DNS区域更新的过程。

安装

需要Python3.7以上。

sudo pip3 install bindtool

可选地创建一个虚拟环境并在其中安装。

配置

示例配置文件列出了所有可能的选项及其默认值。只需列出与默认值不同的值。

配置文件bindtool.json可以放置在当前工作目录中、/etc/bindtool或与bindtool工具安装在同一目录下。可以在命令行上指定不同的配置文件名。如果指定的文件名不是绝对路径,它将在相同的位置中搜索,例如,bindtool --config config.json将加载./config.json/etc/bindtool/config.json<install-dir>/config.json。文件必须遵循标准的JSON格式。

特定区域的配置文件可以放置在具有名称bindtoool.<zone-name>.json的配置文件旁边。如果存在,特定区域的配置文件中的值将覆盖处理该区域时配置文件中的值。

默认值

默认值部分指定了各种记录命令的所有参数的默认值。

例如,要更改SOA记录的默认expire值:

"defaults": {
    "soa": {
        "expire": "7d",
    }
},
...

LDAP

LDAP部分指定了LDAP记录的连接和搜索参数。

目录

目录部分指定了寻找各种文件类型的目录。

目录值可能包括用于变量替换的Python格式字符串。所有目录类型都接受{name}字段。证书和私钥目录也接受{key_type}、{suffix}和{username}字段。DKIM目录接受{selector}和{domain}字段。

密钥类型后缀

每个证书和密钥文件都将有一个后缀,位于文件扩展名之前,指示文件的密钥类型。

可以在key_type_suffixes部分覆盖每种密钥类型默认的后缀。如果您只使用一种密钥类型,或者想省略一种密钥类型的后缀,将其设置为空字符串。请注意,如果使用多种密钥类型,后缀必须唯一,否则文件将被覆盖。

文件名

可以使用标准的Python格式字符串覆盖所有输出文件名。所有文件名类型都接受{name}字段。证书和私钥文件名也接受{key_type}、{suffix}和{username}字段。DKIM文件名接受{selector}和{domain}字段。

用法

运行以下命令

bindtool <zone-file> [<output-directory-or-file>]

该工具将处理源区域文件并输出一个供DNS服务器使用的区域文件。

最好将源区域文件保存在DNS服务器使用的区域文件不同的目录中。例如,将源文件保存在/etc/bind/zones中,并配置DNS服务器从/var/cache/bind加载区域文件。当更改区域时,编辑/etc/bind/zones中的文件,删除服务器的日志文件,然后运行命令

bindtool /etc/bind/zones/myzone.com /var/cache/bind

提供的脚本reload-zone.sh(位于此存储库中)可以用来自动化此过程,并在成功运行后重新配置和重新启动DNS服务器。

变量替换

可以通过以下语法在源文件中声明变量:

{{name=value}}

并通过以下语法进行替换:

{{name}}

例如

{{ip4=192.0.2.0}}

@   A   {{ip4}}
www A   {{ip4}}

变为

@   A   192.0.2.0
www A   192.0.2.0

变量在其声明后可随时使用。

包含文件

可以通过以下语法包含额外的源文件:

{{include:file_path:local_variable=value:...}}

位于file_path的文件将被包含在输出中,就好像该文件的正文被内联包含一样。文件路径将相对于包含include命令的文件、主区域文件或配置的include目录进行搜索。包含文件可以包含额外的文件。文件路径可以包含标准的glob模式,所有匹配该模式的文件都将被包含。在包含文件中定义的变量可以在包含include命令的文件中随时使用。

可以在包含文件路径之后跟有额外的命名参数,这些参数将定义仅在内联文件或由该文件包含的文件内部可用的局部变量。局部变量将覆盖具有相同名称的正常变量。

记录生成

该工具还可以自动生成几种类型的资源记录。这些记录的格式如下:

{{type:arg1:arg2:arg3}}

可以省略可选参数,但是如果省略所有参数,至少必须在记录类型后面跟一个冒号,以将其与变量区分开来。可以通过名称指定参数,以跳过可选参数,例如。

{{tlsa:443:ttl=300}}

如果需要包含冒号、等号或引号的参数值,可以使用反斜杠进行转义,例如\\:,或者值可以包含在双引号中。

可以通过在记录类型前加上-来禁用记录。

SOA记录

SOA记录的指定方式如下:

{{soa:primary_server:admin:refresh:retry:expire:minimum:master_server:ttl}}

必需参数为 primary_serveradmin,其他参数为可选。请注意,区域序列号未指定,工具将自动使用格式 YYYYMMDD## 生成序列号,并确保生成的序列号至少比区域当前部署的序列号大1。

  • primary_server 是该区域的主要名称服务器的名称。
  • admin 是区域管理员的电子邮件地址。它可以指定为 bind 格式或标准电子邮件格式,例如:admin.example.comadmin@example.com
  • refresh 是从主服务器刷新从服务器的时刻。默认值是 4h
  • retry 是从主服务器刷新失败时从服务器重试的间隔。默认值是 1h
  • expire 是从主服务器刷新后,从服务器保持区域文件的时间长度。默认值是 14d
  • minimum 是从服务器缓存区域文件的最短时间。默认值是 10m
  • master_server 是查询除 primary_server 以外的现有 SOA 序列号的服务器。默认值是区域的主要服务器名称。如果主服务器不可公开访问,因此不是 primary_server,则此选项很有用。如果 primary_server 不是主服务器,请确保设置此值,以便更新后正确执行从服务器区域传输。
  • ttl 是 SOA 记录的 TTL 值。默认值为空。

示例

{{soa:ns1.example.com:admin@example.com}}

变为

@   SOA ns1.example.com. admin.example.com. 2016120900 4h 1h 14d 5m

SSHFP 记录

SSHFP 记录的指定如下

{{sshfp:hostname:key_file:ttl:type}}

所有参数都是可选的。

  • hostname 是 SSHFP 记录的域名。默认值是 @
  • key_file 是 SSH 主机密钥文件的名称。密钥文件名可以是绝对路径或相对路径。如果文件名是绝对路径,则将按原样使用,否则文件路径将相对于配置的 ssh 目录(默认为 /etc/ssh)并且文件名将传递给 ssh 文件名格式字符串,添加密钥类型和扩展名。默认值是 ssh_host。如果使用绝对路径,则还必须指定 type
  • ttl 是 SSHFP 记录的 TTL 值。默认值为空。
  • type 为空白或以下之一:rsadsaecdsaed25519。如果 type 为空白,将为可以找到公钥文件的密钥类型生成 SSHFP 记录,否则只为指定的密钥类型生成记录。

对于每个现有的密钥文件,将生成两个 SSHFP 记录,一个带有 SHA1 摘要,一个带有 SHA256 摘要。

示例

{{sshfp:}}

变为

@   SSHFP   1 1 8e97a98a87d8e88f17e9100ed1dc852d0b65dea7
@   SSHFP   1 2 cae4c8dc466978685915a030cdd518df707b4aa2cdaec6bb60b5b303b9d65207
@   SSHFP   3 1 04224f436dafa603aa7d335dd59cb03514bcb224
@   SSHFP   3 2 44cd6dd4363ab585280904ad41013de13eaba4d35842cd2d8c25778b1defc2d9

TLSA 记录

TLSA 记录的指定如下

{{tlsa:port:host:cert_file:usage:selector:proto:ttl:type:pass}

必需参数是 port,其他参数为可选。

  • port 是服务的 TCP 端口。
  • host 是服务的域名。默认值是 @
  • cert_file 是用于保护服务的证书或私钥的文件名。如果文件名是绝对路径,则将按原样使用,否则文件路径将相对于配置的 certificateprivate_keybackup_keyprevious_key 目录,并且文件名将传递给相应的文件名格式字符串。私钥将在每个密钥目录中查找。默认值是源区域文件的名称。
  • 使用方式为以下之一:pkix-tapkix-eedane-tadane-ee。默认值是 pkix-ee
  • selectorcertspki。对于 cert 选择器,cert_file 必须是证书;对于 spki 选择器,cert_file 可以是证书或私钥。默认值是 spki
  • proto 为以下之一:tcpudpsctpdccp。默认值是 tcp
  • ttl 是 TLSA 记录的 TTL 值。默认值为空。
  • type 为空或以下之一:rsaecdsa。如果指定,它将限制 TLSA 记录为该密钥类型,否则将生成所有可用的密钥的 TLSA 记录。密钥将通过在 cert_file 的名称后附加 .rsa.ecdsa 来定位(在文件扩展名之前,例如 example.com.ecdsa.key)。RSA 密钥的 .rsa 后缀是可选的。
  • pass 是加密私钥文件的密码。默认值为空。

对于每种可用的密钥类型,将生成两个 TLSA 记录,一个使用 SHA256 摘要,一个使用 SHA512 摘要。当使用 spki 选择器时,工具还将查找备份和以前的密钥文件。如果找到备份或以前的密钥,将为这些密钥生成额外的 TLSA 记录。

示例

{{tlsa:443:www}}

变为

_443._tcp.www   TLSA    1 1 1 90cebb19a148038c14e875153311bfc27603cbc64c78c9e9432114dd76425ab4
_443._tcp.www   TLSA    1 1 2 0f5ccb1dc77b699281c671976991acd6b597f42265329921d3273a9fcf71f599e1c6c7e15da4689a239eed9dbad0fbdfc0279ddefcf93a8f40680172ea60c4e0

TLSA 证书记录

TLSA 证书记录指定如下

{{tlsa_cert:port:cert_file:usage:selector:proto:ttl:type}

必需参数是 port,其他参数为可选。

  • port 是服务的 TCP 端口。
  • cert_file 是用于保护服务的证书的文件名。如果文件名是绝对路径,则将原样使用,否则文件路径将相对于配置的 certificate 目录,文件名将传递给相应的文件名格式字符串。默认值是源区域文件的名称。
  • 使用方式为以下之一:pkix-tapkix-eedane-tadane-ee。默认值是 pkix-ee
  • selectorcertspki。默认值是 spki
  • proto 为以下之一:tcpudpsctpdccp。默认值是 tcp
  • ttl 是 TLSA 记录的 TTL 值。默认值为空。
  • type 为空或以下之一:rsaecdsa。如果指定,它将限制 TLSA 记录为该密钥类型,否则将为所有可用的密钥生成 TLSA 记录。密钥将通过在 cert_file 的名称后附加 .rsa.ecdsa 来定位(在文件扩展名之前,例如 example.com.ecdsa.pem)。RSA 密钥的 .rsa 后缀是可选的。

用于 TLSA 记录的主机名将来自证书文件中的主题备用名称。对于证书中每个存在的主题备用名称以及每个可用的密钥类型,将生成两个 TLSA 记录,一个使用 SHA256 摘要,一个使用 SHA512 摘要。证书不得包含包含通配符的主题备用名称。

示例

{{tlsa_cert:443}}

变为

_443._tcp.www   TLSA    1 1 1 90cebb19a148038c14e875153311bfc27603cbc64c78c9e9432114dd76425ab4
_443._tcp.www   TLSA    1 1 2 0f5ccb1dc77b699281c671976991acd6b597f42265329921d3273a9fcf71f599e1c6c7e15da4689a239eed9dbad0fbdfc0279ddefcf93a8f40680172ea60c4e0

SMIMEA 记录

SMIMEA 记录指定如下

{{smimea:user:host:cert_file:usage:selector:ttl:type:pass}

user 参数是必需的,其余参数都是可选的。

  • user 是用户电子邮件地址的左侧(在 @ 之前)或 *
  • host 是电子邮件地址的主机名。默认值是 @
  • cert_file 是用于用户 S/MIME 电子邮件的证书或私钥的文件名。如果文件名是绝对路径,则将原样使用,否则文件路径将相对于配置的 certificateprivate_keybackup_keyprevious_key 目录,文件名将传递给相应的文件名格式字符串。私钥将在每个密钥目录中搜索。默认值是源区域文件的名称。默认情况下,将 user 参数 + @ 预先附加到文件名,例如,{{smimea:user}} 将搜索 user@example.com.rsa.pem 等。
  • 使用方式为以下之一:pkix-tapkix-eedane-tadane-ee。默认值是 pkix-ee
  • selectorcertspki。对于 cert 选择器,cert_file 必须是证书,对于 spki 选择器,cert_file 必须是私钥。默认值是 cert
  • ttl 是 SMIMEA 记录的 TTL 值。默认值是空的。
  • type 为空或以下之一:rsaecdsa。如果指定,它将限制 TLSA 记录为该密钥类型,否则将生成所有可用的密钥的 TLSA 记录。密钥将通过在 cert_file 的名称后附加 .rsa.ecdsa 来定位(在文件扩展名之前,例如 example.com.ecdsa.key)。RSA 密钥的 .rsa 后缀是可选的。
  • pass 是加密私钥文件的密码。默认值为空。

对于每种可用的密钥类型,将生成两个 SMIMEA 记录,一个使用 SHA256 摘要,另一个使用 SHA512 摘要。对于 cert 选择器,将生成一个包含证书全部内容的附加记录。当使用 spki 选择器时,工具还将查找备份和旧密钥文件。如果找到备份或旧密钥,将为这些密钥生成额外的 SMIMEA 记录。

示例

{{smimea:username}}

变为

16f78a7d6317f102bbd95fc9a4f3ff2e3249287690b8bdad6b7810f8._smimecert SMIMEA  1 0 1 90cebb19a148038c14e875153311bfc27603cbc64c78c9e9432114dd76425ab4
16f78a7d6317f102bbd95fc9a4f3ff2e3249287690b8bdad6b7810f8._smimecert SMIMEA  1 0 2 0f5ccb1dc77b699281c671976991acd6b597f42265329921d3273a9fcf71f599e1c6c7e15da4689a239eed9dbad0fbdfc0279ddefcf93a8f40680172ea60c4e0

ACME 挑战记录

ACME 挑战 (TXT) 记录的指定如下

{{acme:challenge_file:ttl}}

所有参数都是可选的。

  • challenge_file 是存储 ACME 挑战信息的 json 文件的文件名。如果文件名是绝对路径,则将直接使用,否则文件路径将相对于配置的 acme 目录,文件名将传递给相应的文件名格式字符串。默认值是源区域文件的名称。
  • ttl 是 TXT 记录的 TTL 值。默认值是空的。

ACME 挑战文件的內容是一个字典,其键是主机名,值是 ACME 挑战值。对于每个键/值对将生成一个记录。这种记录类型旨在与自动 ACME 证书管理机器人(如 acmebot)一起使用,进行 dns-01 授权。如果挑战文件不存在,则不会生成任何记录,也不会发生错误。

示例

{{acme:}}

变为

_acme-challenge.example.com     TXT     "Tu6B_E8PvD1aE1S4CqHPfsgkU3YcdIjhpRDFlhLu0r4"

DKIM 记录

DKIM (TXT) 记录的指定如下

{{dkim:selector:domain:host:ttl}}

所有参数都是可选的。

  • selector 是 DKIM 选择器。默认值在配置文件的 settings 部分指定。
  • domain 是 OpenDKIM 私钥的名称。如果 domain 是绝对路径,则将直接使用,否则文件路径将相对于配置的 dkim 目录,文件名将传递给相应的文件名格式字符串。默认值是源区域文件的名称。
  • host 是 DKIM 键的主机名。默认值是 @
  • ttl 是 TXT 记录的 TTL 值。默认值是空的。

示例

{{dkim:}}

变为

default._domainkey  TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2G8vw5hMce1Zy2ovLnBTEbXxiOqY/CsLu+uqlyMOdOjOGtQqx1wX2aXksazjEIQ3x5RfbuvRfVn/84W4J6WI90/a606veHHalQouXLfQIlu3QuTUkjsj+aldchivc/AI/wZNiIPrPR96UGIzBbSE9zGvwpQ23Z1LzGUXAsPKx1wIDAQAB"

DMARC 记录

DMARC (TXT) 记录的指定如下

{{dmarc:policy:rua:ruf:subdomain_policy:options:dkim_alignment:spf_alignment:report_format:interval:percent:host:ttl}}

所有参数都是可选的。

  • policy 是以下之一:nonequarantinereject。默认值是 none
  • rua 是接收汇总报告的电子邮件地址的逗号分隔列表。
  • ruf 是接收取证报告的电子邮件地址的逗号分隔列表。
  • subdomain_policy 是以下之一:nonequarantinereject。默认值是 none
  • options 是以下之一:allanydkimspf。默认值是 any
  • dkim_alignment 是以下之一:relaxedstrict。默认值是 relaxed
  • spf_alignment 是以下之一:relaxedstrict。默认值是 relaxed
  • report_format 是以下之一:afrfiodef。默认值是 afrf
  • interval 是数值(秒)。默认值是 86400(1 天)。
  • percent 是从 0 到 100 的数值。默认值是 100
  • host 是 DKIM 键的主机名。默认值是 @
  • ttl 是 TXT 记录的 TTL 值。默认值是空的。

示例

{{dmarc:rua@example.com:ruf@example.com}}

变为

_dmarc  TXT "v=DMARC1; rua=mailto:rua@example.com; ruf=mailto:ruf@example.com; p=none; sp=none; fo=1; adkim=r; aspf=r; rf=afrf; ri=86400; pct=100;"

CAA 记录

CAA 记录的指定如下

{{caa:tag:caname:flag:ttl}}

tagcaname 参数是必需的,所有其他参数都是可选的。

  • tag 是 CAA 记录的标签,通常是 issueissuewild
  • caname 是 CA 的名称。
  • flag 是 CAA 记录的标志值。默认值为 1
  • ttl 是 CAA 记录的 TTL 值。默认值为空。

示例

{{caa:issue:letsencrypt.org}}

变为

@   TYPE257 \# 22 010569737375656c657473656e63727970742e6f7267

LDAP 记录

LDAP 记录的指定方式如下

{{ldap:}}

在配置的 LDAP 服务器中找到的任何与当前区域匹配的 DNS 记录都将被包含。支持的记录类型包括:A、AAAA、TXT、SRV 和 SSHFP。

示例源区域文件

以下是一个简单的源区域文件的示例

{{soa:ns1.example.com:admin@example.com}}

{{ip4=192.0.2.0}}
{{pool6=2001:db8}}

@   NS  ns1.example.com.
@   NS  ns2.example.com.

; Mail
@   MX  10  smtp.example.com.
@   TXT "v=spf1 a:smtp.example.com -all"

; A records
@       A       {{ip4}}
@       AAAA    {{pool6}}::
smtp    A       {{ip4}}
smtp    AAAA    {{pool6}}::1
www     A       {{ip4}}
www     AAAA    {{pool6}}::1:0

; DANE records - certificate in /etc/ssl/certs/example.com.pem
{{tlsa:25:smtp:usage=dane-ee}}
{{tlsa:443}}
{{tlsa:443:www}}

; DKIM - certificate in /etc/opendkim/keys/example.com/default.private
{{dkim:}}
_adsp._domainkey    TXT "dkim=all"

; CAA Records
{{caa:issue:letsencrypt.org}}

; ACME
{{acme:}}

将生成以下输出

@   SOA ns1.example.com. admin.example.com. 2016120900 4h 1h 14d 5m

@   NS  ns1.example.com.
@   NS  ns2.example.com.

; Mail
@   MX  10  smtp.example.com.
@   TXT "v=spf1 a:smtp.example.com -all"

; A records
@       A       192.0.2.0
@       AAAA    2001:db8::
smtp    A       192.0.2.0
smtp    AAAA    2001:db8::1
www     A       192.0.2.0
www     AAAA    2001:db8::1:0

; DANE records - certificate in /etc/ssl/certs/example.com.pem
_25._tcp.smtp   TLSA    3 1 1 90cebb19a148038c14e875153311bfc27603cbc64c78c9e9432114dd76425ab4
_25._tcp.smtp   TLSA    3 1 2 0f5ccb1dc77b699281c671976991acd6b597f42265329921d3273a9fcf71f599e1c6c7e15da4689a239eed9dbad0fbdfc0279ddefcf93a8f40680172ea60c4e0
_443._tcp       TLSA    1 1 1 90cebb19a148038c14e875153311bfc27603cbc64c78c9e9432114dd76425ab4
_443._tcp       TLSA    1 1 2 0f5ccb1dc77b699281c671976991acd6b597f42265329921d3273a9fcf71f599e1c6c7e15da4689a239eed9dbad0fbdfc0279ddefcf93a8f40680172ea60c4e0
_443._tcp.www   TLSA    1 1 1 90cebb19a148038c14e875153311bfc27603cbc64c78c9e9432114dd76425ab4
_443._tcp.www   TLSA    1 1 2 0f5ccb1dc77b699281c671976991acd6b597f42265329921d3273a9fcf71f599e1c6c7e15da4689a239eed9dbad0fbdfc0279ddefcf93a8f40680172ea60c4e0

; DKIM - certificate in /etc/opendkim/keys/example.com/default.private
default._domainkey  TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2G8vw5hMce1Zy2ovLnBTEbXxiOqY/CsLu+uqlyMOdOjOGtQqx1wX2aXksazjEIQ3x5RfbuvRfVn/84W4J6WI90/a606veHHalQouXLfQIlu3QuTUkjsj+aldchivc/AI/wZNiIPrPR96UGIzBbSE9zGvwpQ23Z1LzGUXAsPKx1wIDAQAB"
_adsp._domainkey    TXT "dkim=all"

; CAA Records
@   TYPE257 \# 22 010569737375656c657473656e63727970742e6f7267

; ACME

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

bindtool-1.4.0.tar.gz (40.2 kB 查看哈希值)

上传时间

构建分发

bindtool-1.4.0-py3-none-any.whl (30.6 kB 查看哈希值)

上传时间 Python 3

由以下组织支持