Red Hat Training

A Red Hat training course is available for RHEL 8

4.6. 在 BIND DNS 服务器中配置区

DNS 区域是包含域空间中特定子树的资源记录的数据库。例如,如果您负责 example.com 域,可以在 BIND 中为它设置一个区。因此,客户端可将 www.example.com 解析为在这个区中配置的 IP 地址。

4.6.1. 区域文件中的 SOA 记录

SOA(start of authority)记录在一个 DNS 区中是必必需的记录。例如,如果多个 DNS 服务器对某个区域具有权威,那么此记录非常重要,但也指向 DNS 解析器。

BIND 中的 SOA 记录具有以下语法:

name class type mname rname serial refresh retry expire minimum

为提高可读性,管理员通常将区域文件中的记录分成多行,其中包含以分号(;)开头的注释。请注意,如果您分割 SOA 记录,圆括号将记录保留在一起:

@ IN SOA ns1.example.com. hostmaster.example.com. (
                          2022070601 ; serial number
                          1d         ; refresh period
                          3h         ; retry period
                          3d         ; expire time
                          3h )       ; minimum TTL
重要

请注意完全限定域名 (FQDN) 末尾的结尾点。FQDN 包含多个域标签,它们用点分开。由于 DNS root 有一个空标签,所以 FQDN 以点结尾。因此,BIND 在没有结尾点的情况下将区域名称附加到名称中。不含尾部点的主机名(例如 ns1.example.com)会被扩展为 ns1.example.com.example.com.,对于主域名服务器,这不是正确的地址。

以下是 SOA 记录中的字段:

  • name :区域的名称,即所谓的 源(origin)。如果将此字段设置为 @,BIND 会将其扩展为 /etc/named.conf 中定义的区域名称。
  • class :在 SOA 记录中,必须将此字段始终设置为 Internet (IN)。
  • type :在 SOA 记录中,必须将此字段始终设置为 SOA
  • mname (主名称):此区域的主域名服务器的主机名。
  • rname (负责名称): 负责此区域的电子邮件地址。请注意,格式不同。您必须将 at 符号 (@) 替换为点 (.)。
  • serial :此区域文件的版本号。次要域名服务器仅在主服务器上的序列号较高时更新其区域副本。

    格式可以是任意数字值。通常的格式是 <year><month><day><two-digit-number>。使用这种格式,在理论上可以每天修改区域文件上百次。

  • refresh:在检查主服务器更新时,次要服务器应等待的时间。
  • retry :当次要服务器在尝试失败后重试查询主服务器的时间长度。
  • expire :当所有之前的尝试失败时,次要服务器停止查询主服务器的时间长度。
  • minimum :RFC 2308 将此字段的含义改为负缓存时间。兼容解析器使用它来确定缓存 NXDOMAIN 名称错误的时间。
注意

refresh, retry, expire, 和 minimum 项中的值定义了一个时间(以秒为单位)。但是,为了提高可读性,请使用时间后缀,如 m 表示分钟、h 表示小时,以及 d 表示天。例如,3h 代表 3 小时。

其它资源

  • RFC 1035: 域名 - 实现和规格
  • RFC 1034 :域名 - 概念和功能
  • RFC 2308 :DNS 查询 (DNS 缓存) 的 Negative 缓存

4.6.2. 在 BIND 主服务器上设置转发区

转发区域将名称映射到 IP 地址和其他信息。例如,如果您负责域 example.com,您可以在 BIND 中设置转发区来解析名称,如 www.example.com

先决条件

  • 已配置了 BIND,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. /etc/named.conf 文件中添加区定义:

    zone "example.com" {
        type master;
        file "example.com.zone";
        allow-query { any; };
        allow-transfer { none; };
    };

    这些设置定义:

    • 此服务器作为 example.com 区域的主服务器 (类型 master)。
    • /var/named/example.com.zone 文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在 options 语句中的目录中创建的 directory 相对。
    • 任何主机都可以查询此区域。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。
    • 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  3. 使用以下内容创建 /var/named/example.com.zone 文件:

    $TTL 8h
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1d         ; refresh period
                              3h         ; retry period
                              3d         ; expire time
                              3h )       ; minimum TTL
    
                      IN NS   ns1.example.com.
                      IN MX   10 mail.example.com.
    
    www               IN A    192.0.2.30
    www               IN AAAA 2001:db8:1::30
    ns1               IN A    192.0.2.1
    ns1               IN AAAA 2001:db8:1::1
    mail              IN A    192.0.2.20
    mail              IN AAAA 2001:db8:1::20

    这个区域文件:

    • 将资源记录的默认生存时间 (TTL) 值设置为 8 小时。如果没有时间后缀(例如没有使用 h 指定小时),BIND 会将该值解析为秒。
    • 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
    • ns1.example.com 设置为此区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。
    • mail.example.com 设置为 example.com 域的邮件交换器 (MX)。主机名前面的数字值是记录的优先级。较低值的条目具有更高的优先级。
    • 设置 www.example.com 的 IPv4 和 IPv6 地址、mail.example.comns1.example.com
  4. 在区域文件上设置安全权限,仅允许 named 组读取它:

    # chown root:named /var/named/example.com.zone
    # chmod 640 /var/named/example.com.zone
  5. 验证 /var/named/example.com.zone 文件的语法:

    # named-checkzone example.com /var/named/example.com.zone
    zone example.com/IN: loaded serial 2022070601
    OK
  6. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  • example.com 区域查询不同的记录,并验证输出是否与您在区域文件中配置的记录匹配:

    # dig +short @localhost AAAA www.example.com
    2001:db8:1::30
    
    # dig +short @localhost NS example.com
    ns1.example.com.
    
    # dig +short @localhost A ns1.example.com
    192.0.2.1

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

4.6.3. 在 BIND 主服务器中设置反向区

反向区域将 IP 地址映射到名称。例如,如果您负责 IP 范围 192.0.2.0/24,您可以在 BIND 中设置反向区域,以将 IP 地址从这个范围内的 IP 地址解析为主机名。

注意

如果您为整个类网络创建一个反向区域,请相应地命名区域。例如,对于 C network 192.0.2.0/24,区域的名称是 2.0.192.in-addr.arpa。如果要为不同的网络大小创建反向区域,如 192.0.2.0/28,区域的名称为 28-2.0.192.in-addr.arpa

先决条件

  • 已配置了 BIND,例如作为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. /etc/named.conf 文件中添加区定义:

    zone "2.0.192.in-addr.arpa" {
        type master;
        file "2.0.192.in-addr.arpa.zone";
        allow-query { any; };
        allow-transfer { none; };
    };

    这些设置定义:

    • 此服务器作为 2.0.192.in-addr.arpa 反向区域的主服务器(type master)。
    • /var/named/2.0.192.in-addr.arpa.zone 文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在 options 语句中的目录中创建的 directory 相对。
    • 任何主机都可以查询此区域。另外,还可指定 IP 范围或 BIND 访问控制列表 (ACL) 别名来限制访问。
    • 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

    如果命令没有显示输出,则语法为正确的。

  3. 使用以下内容创建 /var/named/2.0.192.in-addr.arpa.zone 文件:

    $TTL 8h
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1d         ; refresh period
                              3h         ; retry period
                              3d         ; expire time
                              3h )       ; minimum TTL
    
                      IN NS   ns1.example.com.
    
    1                 IN PTR  ns1.example.com.
    30                IN PTR  www.example.com.

    这个区域文件:

    • 将资源记录的默认生存时间 (TTL) 值设置为 8 小时。如果没有时间后缀(例如没有使用 h 指定小时),BIND 会将该值解析为秒。
    • 包含所需的 SOA 资源记录,以及有关该区域的详细信息。
    • ns1.example.com 设置为此反向区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。
    • 设置 192.0.2.1192.0.2.30 地址的指针(PTR)记录。
  4. 在区域文件上设置安全权限,仅允许 named 组读取它:

    # chown root:named /var/named/2.0.192.in-addr.arpa.zone
    # chmod 640 /var/named/2.0.192.in-addr.arpa.zone
  5. 验证 /var/named/2.0.192.in-addr.arpa.zone 文件的语法:

    # named-checkzone 2.0.192.in-addr.arpa /var/named/2.0.192.in-addr.arpa.zone
    zone 2.0.192.in-addr.arpa/IN: loaded serial 2022070601
    OK
  6. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  • 从反向区查询不同的记录,并验证输出是否与您在区域文件中配置的记录匹配:

    # dig +short @localhost -x 192.0.2.1
    ns1.example.com.
    
    # dig +short @localhost -x 192.0.2.30
    www.example.com.

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

4.6.4. 更新 BIND 区文件

在某些情况下,例如,如果服务器的 IP 地址有变化,您必须更新区域文件。如果多个 DNS 服务器负责某个区,则仅在主服务器中执行这个步骤。存储区域副本的其他 DNS 服务器将通过区域传送接收更新。

先决条件

  • zone 被配置。
  • namednamed-chroot 服务正在运行。

流程

  1. 可选:识别 /etc/named.conf 文件中的区文件的路径:

    options {
        ...
        directory       "/var/named";
    }
    
    zone "example.com" {
        ...
        file "example.com.zone";
    };

    您可以在区域定义的 file 指令中找到到区域文件的路径。相对路径相对于 options 语句中的 directory 设置的相对路径。

  2. 编辑区域文件:

    1. 进行必要的更改。
    2. 在 SOA 记录中递增序列号。

      重要

      如果序列号等于或低于先前值,次要服务器不会更新其区域的副本。

  3. 验证区文件的语法:

    # named-checkzone example.com /var/named/example.com.zone
    zone example.com/IN: loaded serial 2022062802
    OK
  4. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

验证

  • 查询您添加、修改或删除的记录,例如:

    # dig +short @localhost A ns2.example.com
    192.0.2.2

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

4.6.5. 使用自动密钥生成和区维护功能进行 DNSSEC 区域签名

您可以使用域名系统安全扩展 (DNSSEC) 为区域签名,以确保身份验证和数据完整性。此类区域包含额外的资源记录。客户端可以使用它们来验证区域信息的真实性。

如果您为区启用 DNSSEC 策略功能,BIND 会自动执行以下操作:

  • 创建密钥
  • 为区域签名
  • 维护区域,包括重新签名并定期替换密钥。
重要

要启用外部 DNS 服务器以验证区的真实性,您必须在父区中添加该区域的公钥。请联系您的域供应商或 registry,以了解更多有关如何完成此操作的详细信息。

此流程使用 BIND 中的内置 default DNSSEC 策略。这个策略使用单一 ECDSAP256SHA 密钥签名。另外,还可创建自己的策略来使用自定义密钥、算法和计时。

先决条件

  • 已安装 BIND 9.16 或更高版本。要满足此要求,请安装 bind9.16 软件包,而不是 bind
  • 配置您要启用 DNSSEC 的区域。
  • namednamed-chroot 服务正在运行。
  • 服务器可将时间与时间服务器同步。对于 DNSSEC 验证,系统时间准确非常重要。

流程

  1. 编辑 /etc/named.conf 文件,并将 dnssec-policy default; 添加到您要启用 DNSSEC 的区域:

    zone "example.com" {
        ...
        dnssec-policy default;
    };
  2. 重新载入 BIND:

    # systemctl reload named

    如果在 change-root 环境中运行 BIND,请使用 systemctl reload named-chroot 命令来重新加载该服务。

  3. BIND 将公钥存储在 /var/named/K<zone_name>.+<algorithm>+<key_ID>.key 文件中。使用此文件显示区的公钥,格式为父区所需的格式:

    • DS 记录格式:

      # dnssec-dsfromkey /var/named/Kexample.com.+013+61141.key
      example.com. IN DS 61141 13 2 3E184188CF6D2521EDFDC3F07CFEE8D0195AACBD85E68BAE0620F638B4B1B027
    • DNSKEY 格式:

      # grep DNSKEY /var/named/Kexample.com.+013+61141.key
      example.com. 3600 IN DNSKEY 257 3 13 sjzT3jNEp120aSO4mPEHHSkReHUf7AABNnT8hNRTzD5cKMQSjDJin2I3 5CaKVcWO1pm+HltxUEt+X9dfp8OZkg==
  4. 请求将区域的公钥添加到父区。请联系您的域供应商或 registry,以了解更多有关如何完成此操作的详细信息。

验证

  1. 从启用了 DNSSEC 签名的区域查询您自己的 DNS 服务器:

    # dig +dnssec +short @localhost A www.example.com
    192.0.2.30
    A 13 3 28800 20220718081258 20220705120353 61141 example.com. e7Cfh6GuOBMAWsgsHSVTPh+JJSOI/Y6zctzIuqIU1JqEgOOAfL/Qz474 M0sgi54m1Kmnr2ANBKJN9uvOs5eXYw==

    本例假定 BIND 在同一主机上运行并响应 localhost 接口上的查询。

  2. 在将公钥添加到父区并传播到其他服务器后,验证服务器是否将查询上的身份验证数据(ad)标记设置为已签名区域:

    #  dig @localhost example.com +dnssec
    ...
    ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
    ...