管理网络基础架构服务


Red Hat Enterprise Linux 10

管理网络基础设施服务的指南

摘要

本文档论述了如何在 Red Hat Enterprise Linux 上设置和管理网络核心基础设施服务,如 DNS 和 DHCP。

对红帽文档提供反馈

我们致力于为您提供高质量的文档,您的反馈将对我们有很大帮助。为帮助我们改进,您可以通过 Red Hat Jira 跟踪系统提交建议或报告错误。

流程

  1. 登录到 Jira 网站。

    如果您还没有帐户,请创建一个。

  2. 单击顶部导航栏中的 Create
  3. Summary 字段中输入描述性标题。
  4. Description 字段中输入您对改进的建议。包括文档相关部分的链接。
  5. 点对话框底部的 Create

第 1 章 设置和配置 BIND DNS 服务器

要管理域名系统(DNS)服务,请配置 BIND DNS 服务器。BIND 完全符合互联网工程任务组(IETF) DNS 标准和草案标准。BIND 充当本地网络的缓存服务器,也可以作为次要服务器,以确保区域的高可用性。

1.1. 将 BIND 配置为缓存 DNS 服务器

要从其缓存中解析和缓存成功且失败的查找并回答对相同记录的请求,请将 BIND 配置为缓存 DNS 服务器。这可充当区域的权威 DNS 服务器,并提高 DNS 查找速度。

先决条件

  • 您有管理特权。
  • 服务器的 IP 地址是静态的。

流程

  1. 安装 bindbind-utils 软件包:

    # dnf install bind bind-utils
  2. 如果要在 change-root 环境中运行 BIND,请安装 bind-chroot 软件包:

    # dnf install bind-chroot

    请注意,在 SELinux 处于 enforcing 模式(默认设置)的主机上运行 BIND 更为安全。

  3. 编辑 /etc/named.conf 文件,并在 options 语句中进行以下更改:

    1. 更新 listen-onlisten-on-v6 语句,以指定 BIND 应该侦听的 IPv4 和 IPv6 接口:

      listen-on port 53 { 127.0.0.1; 192.0.2.1; };
      listen-on-v6 port 53 { ::1; 2001:db8:1::1; };
    2. 更新 allow-query 语句,以配置哪些 IP 地址和范围客户端可以查询此 DNS 服务器:

      allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
    3. 添加 allow-recursion 语句,以定义 BIND 接受递归查询的 IP 地址和范围:

      allow-recursion { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
      警告

      不要在服务器的公共 IP 地址中递归。否则,服务器可能会成为大规模 DNS 扩大攻击的一部分。

    4. 默认情况下,BIND 通过将从根服务器递归查询到权威 DNS 服务器来解析查询。但是,您可以将 BIND 配置为将查询转发到其他 DNS 服务器,如您的供应商之一。在这种情况下,添加一个带有 BIND 应该转发查询的 DNS 服务器的 IP 地址列表的 forwarders 语句:

      forwarders { 198.51.100.1; 203.0.113.5; };

      作为回退行为,如果转发器服务器没有响应,BIND 会以递归方式解析查询。要禁用此行为,请添加 forward only; 语句。

  4. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

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

  5. 更新 firewalld 规则,以允许传入的 DNS 流量:

    # firewall-cmd --permanent --add-service=dns
    # firewall-cmd --reload
  6. 启动并启用 BIND:

    # systemctl enable --now named

    如果要在 change-root 环境中运行 BIND,请使用 systemctl enable --now named-chroot 命令启用并启动该服务。

验证

  1. 使用新设置 DNS 服务器解析域:

    # dig @localhost www.example.org
    ...
    __www.example.org.__    __86400__    IN    A    __198.51.100.34__
    
    ;; Query time: __917 msec__
    ...

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

    在第一次查询记录后,BIND 会将条目添加到其缓存中。

  2. 从最后一步中重复查询:

    # dig @localhost www.example.org
    __www.example.org.__    __85332__    IN    A    __198.51.100.34__
    
    ;; Query time: __1 msec__
    ...

    由于缓存的条目,进一步对相同记录的请求会更快,直到条目过期为止。

    详情请查看您系统上的 named.conf (5) 手册页和 /usr/share/doc/bind/sample/etc/named.conf 文件。

1.2. 在 BIND DNS 服务器中配置日志记录

要写入带有定义的严重性级别为单独的文件的不同事件,请在 BIND DNS 服务器上配置日志记录。在服务器上,BIND 软件包将 /etc/named.conf 文件配置为使用 default_debug 频道,它会在 debug 级别不是零到 /var/named/data/named.run 文件时记录条目。

先决条件

  • 您已将 BIND 配置为缓存名称服务器。
  • 您已启动 namednamed-chroot 服务。

流程

  1. 编辑 /etc/named.conf 文件,并在 logging 语句中添加 categorychannel 短语,例如:

    logging {
        ...
    
        category notify { zone_transfer_log; };
        category xfer-in { zone_transfer_log; };
        category xfer-out { zone_transfer_log; };
        channel zone_transfer_log {
            file "/var/named/log/transfer.log" versions 10 size 50m;
            print-time yes;
            print-category yes;
            print-severity yes;
            severity info;
         };
    
         ...
    };

    在本示例配置中

    • BIND 将与区域传送相关的消息记录到 /var/named/log/transfer.log
    • BIND 创建最多 10 个日志文件版本,并在它们达到 50 MB 时轮转它们。
    • category 定义了 BIND 向哪些频道发送类别信息。
    • channel 定义了日志消息的目的地,包括版本数量、最大文件大小以及 BIND 应记录到频道的严重性等级。其他设置,如启用事件的时间戳、类别和严重性,但可用于调试目的。
  2. 如果不存在,请创建日志目录,并为该目录上的指定用户授予写入权限:

    # mkdir /var/named/log/
    # chown named:named /var/named/log/
    # chmod 700 /var/named/log/
  3. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

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

  4. 重启 BIND:

    # systemctl restart named

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

验证

  • 显示日志文件的内容:

    # cat /var/named/log/transfer.log
    ...
    __06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR started: TSIG example-transfer-key (serial 2022070603)__
    __06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR ended__

    详情请查看您系统上的 named.conf (5) 手册页。

1.3. 编写 BIND 访问控制列表

要防止未经授权的访问和攻击,如拒绝服务(DoS),您可以使用访问控制列表(ACL)语句来控制对 BIND 的某些功能的访问。ACL 语句是 IP 地址和范围的列表。

警告

BIND 仅在 ACL 中使用第一个匹配条目。例如,如果您定义了 ACL { 192.0.2/24; !192.0.2.1; } 和 IP 地址为 192.0.2.1 的主机,则 BIND 也会授予访问权限,即使第二个条目排除了这个地址。

每个 ACL 都有一个别名,您可以在几个语句中使用,如 allow-query,它指的是指定的 IP 地址和范围。BIND 有以下内置 ACL 语句:

  • none:不匹配主机。
  • any: 匹配所有主机。
  • localhost :匹配环回地址 127.0.0.1::1,以及运行 BIND 的服务器上所有接口的 IP 地址。
  • localnets :匹配环回地址 127.0.0.1::1,运行 BIND 的服务器都直接连接到的所有子网。

先决条件

  • 您已将 BIND 配置为缓存名称服务器。
  • namednamed-chroot 服务正在运行。

流程

  1. 编辑 /etc/named.conf 文件并进行以下更改:

    1. acl 语句添加到文件中。例如,要为 127.0.0.1192.0.2.0/242001:db8:1::/64 创建名为 internal-networks 的 ACL,请输入:

      acl internal-networks { 127.0.0.1; 192.0.2.0/24; 2001:db8:1::/64; };
      acl dmz-networks { 198.51.100.0/24; 2001:db8:2::/64; };
    2. 在支持它们的语句中使用 ACL 的别名,例如:

      allow-query { internal-networks; dmz-networks; };
      allow-recursion { internal-networks; };
  2. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

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

  3. 重新载入 BIND:

    # systemctl reload named

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

验证

  • 执行操作,以触发使用配置的 ACL 的功能。例如,ACL 只允许来自定义的 IP 地址的递归查询。在这种情况下,在没有在 ACL 定义的主机上输入以下命令,尝试解析外部域:

    # dig +short @192.0.2.1 www.example.com

    如果命令没有返回输出,则拒绝 BIND 的访问,并且 ACL 可以正常工作。

  • 在客户端上显示输出,使用不带 +short 选项的最后一个命令:

    # dig @192.0.2.1 www.example.com
    ...
    ;; WARNING: recursion requested but not available
    ...

1.4. 使用 dnstap记录 DNS 查询

要分析域名系统(DNS)流量模式,请监控 DNS 服务器性能并排除相关问题,请使用 dnstap 接口记录 DNS 详情。要监控和记录收集网站和 IP 地址详情的传入名称查询,dns tap 记录由 named 服务发送的消息。

先决条件

  • 您有管理特权。
  • 已安装 bind 软件包。
警告

如果您已经安装了 BIND 版本并运行,请添加新版本的 BIND 会覆盖现有版本。

流程

  1. /etc/named.conf 文件的 options 块中启用 dnstap 和 target 文件:

    options
    {
    # ...
    dnstap { all; }; # Configure filter
    dnstap-output file "/var/named/data/dnstap.bin" versions 2;
    # ...
    };
    # end of options
  2. dnstap 过滤器添加到 /etc/named.conf 文件中的 dnstap 块,以指定您要日志的 DNS 流量类型。您可以使用以下过滤器:

    • auth :权威区域响应或回答。
    • 客户端 :内部客户端查询或回答。
    • forwarder: 转发查询或来自它的响应。
    • 解析器 :迭代解析查询或响应。
    • 更新 :动态区域更新请求。
    • All :来自上述选项中的任何一个。
    • query response :如果您没有指定查询或 响应 关键字,dns tap 记录。

      注意

      dnstap 过滤器有几个以分号(;)分开的定义,语法如下: dnstap {(all | auth | client | forwarder | resolver | update)[(query | response)]; …​ };

  3. 通过添加额外的参数来更改 dnstap-output 选项,以自定义记录的数据包中 dnstap 工具的行为:

    • size (无限 | <size>):当其大小达到指定限制时,启用对 dnstap 文件的自动滚动。
    • 版本 (无限 | <integer>):指定要保留自动滚动的文件数量。
    • 后缀 (递增 | 时间戳):选择推出文件的命名约定。默认情况下,从 .0 开始递增。但是,您可以通过设置时间戳值来使用 UNIX 时间戳

      以下示例仅请求 auth 响应、客户端 查询以及动态 更新 的查询和响应:

      Example:
      
      dnstap {auth response; client query; update;};
  4. 要应用您的更改,请重启 named 服务:

    # systemctl restart named.service
  5. 为活跃日志配置定期推出部署:

    # sudoedit /etc/cron.daily/dnstap
    #!/bin/sh
    rndc dnstap -roll 3
    mv /var/named/data/dnstap.bin.1 /var/log/named/dnstap/dnstap-$(date -I).bin
    
    # use dnstap-read to analyze saved logs
    sudo chmod a+x /etc/cron.daily/dnstap
    • Cron 调度程序只在一天运行一次用户编辑的脚本的内容。
    • 值为 3roll 选项指定 dnstap 最多可以创建三个备份日志文件。
    • 3 覆盖 dnstap-output 变量的 version 参数。这个值将备份日志文件的数量限制为 3。此外,此选项会将二进制日志文件移到另一个目录中,并将它重命名为。它永远不会达到 .2 后缀,即使三个备份日志文件已存在。
    • 如果根据大小限制自动滚动二进制日志,您可以跳过这一步。
  6. 使用 dnstap-read 工具以人类可读的格式读取和打印输出日志,如 YAML 文件:

    # dnstap-read -p /var/named/data/dnstap.bin

第 2 章 在 BIND DNS 服务器中配置区

要管理 example.com 域的域名解析(DNS),请在 DNS BIND 服务器上配置区。DNS 区域是包含域空间中特定子树的资源记录的数据库。因此,客户端可以将 www.example.com 解析为区中配置的 IP 地址。

2.1. 区域文件中的授权记录开始

要管理多个对区域和 DNS 解析器的 DNS 服务器,您可以使用权威启动(SOA)记录。此记录在 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>。使用这种格式,在理论上可以每天修改区域文件上百次。

  • 刷新 :次要服务器在检查主服务器时应等待的时间(如果区更新成功)。
  • 重试 :如果区更新失败,次要服务器尝试查询主服务器的时间长度。
  • 过期 :如果所有早期尝试失败,次要服务器停止查询主服务器的时间长度。
  • minimum :RFC 2308 将此字段的含义改为负缓存时间。兼容解析器使用它来决定缓存 NXDOMAIN 名称错误的时间。
注意

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

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

要启用将域名映射到 IP 地址和其他信息,请在 BIND 主服务器上设置转发区域。例如,如果您负责 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 接口上的查询。

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

要将 IP 地址映射到名称,您可以在 BIND 主服务器中设置反向区。例如,如果您有 192.0.2.0/24 IP 范围,您可以在 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 反向区域的主服务器(类型 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 接口上的查询。

2.4. 更新 BIND 区文件

要更新对某个区域的权威多个 DNS 服务器,请仅在主服务器中更新区域文件。例如,如果您更改了服务器的 IP 地址,则需要更新区域文件。存储区域副本的其他 DNS 服务器通过区传输接收更新。

先决条件

  • 您已配置了区。
  • 您已启动 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 接口上的查询。

为确保客户端的区域信息的真实性,您可以使用域名系统安全扩展(DNSSEC)为区域签名。签名的区域包含额外的资源记录。

重要

要启用外部 DNS 服务器以验证区的真实性,请将区域的公钥添加到父区。请联系您的域供应商或 registry 以了解更多详细信息。

为区启用 DNSSEC 策略功能后,BIND 会自动执行操作。它包括创建密钥、签名区域和维护区域,包括重新签名并定期替换密钥。在 BIND 中,您可以使用内置的 默认 DNSSEC 策略,该策略使用单一 ECDSAP256SHA 密钥签名。但是,创建自己的策略来使用自定义密钥、算法和计时。

先决条件

  • 您已在服务器上安装 bind 软件包。
  • 您已配置了要启用 DNSSEC 的区域。
  • namednamed-chroot 服务正在运行。
  • 您已将服务器配置为同步时间与时间服务器。在启用 DNSSEC 验证前,始终检查正确的系统时间。

流程

  1. /etc/named.conf 文件中添加 dnssec-policy default;inline-signing yes;,以便为区启用 DNSSEC :

    zone "example.com" {
        ...
        dnssec-policy default;
        inline-signing yes;
    };
  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
    ...

2.6. 在 BIND DNS 服务器中配置区传输

要确保所有具有区副本的 DNS 服务器具有最新的数据,请在 BIND DNS 服务器中配置区域传送。

先决条件

  • 您有管理特权。
  • 在未来的主服务器中,已配置要设置区域传送的区域。
  • 在未来的次要服务器中,BIND 已配置为缓存名称服务器。
  • 在两个服务器上,namednamed-chroot 服务正在运行。

流程

  1. 在现有主服务器中:

    1. 生成共享密钥并将其附加到 /etc/named.conf 文件中:

      # tsig-keygen example-transfer-key | tee -a /etc/named.conf
      key "__example-transfer-key__" {
              algorithm hmac-sha256;
              secret "__q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ=__";
      };

      输出附加到 /etc/named.conf 文件。

      您稍后会在次要服务器上需要此输出。

    2. allow-transfer 语句中,在 /etc/named.conf 文件中配置区,以要求密钥进行传输:

      zone "example.com" {
          ...
          allow-transfer { key example-transfer-key; };
      };

      定义服务器必须具有 example-transfer-key 语句中指定的密钥来传输区域。但是,您可以在 allow-transfer 语句中使用 BIND 访问控制列表(ACL)别名。

    3. 配置区以显示二级服务器 IP 地址:

      zone "example.com" {
          ...
          also-notify { 192.0.2.2; 2001:db8:1::2; };
      };

      默认情况下,在更新区后,BIND 会通知在这个区中具有名称服务器(NS)记录的所有名称服务器。如果您不计划将次要服务器的 NS 记录添加到区,您可以配置 BIND 通知这个服务器。为此,请将这个次要服务器的 IP 地址添加 also-notify 声明到区:

    4. 验证 /etc/named.conf 文件的语法:

      # named-checkconf

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

    5. 重新载入 BIND:

      # systemctl reload named

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

  2. 在未来的次要服务器中:

    1. 将共享密钥块添加到 /etc/named.conf (与主服务器相同):

      key "example-transfer-key" {
              algorithm hmac-sha256;
              secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ=";
      };
      1. /etc/named.conf 文件中添加 second zone 定义:

        zone "example.com" {
            type slave;
            file "slaves/example.com.zone";
            allow-query { any; };
            allow-transfer { none; };
            masters {
              192.0.2.1 key example-transfer-key;
              2001:db8:1::1 key example-transfer-key;
            };
        };
        • 此服务器是 example.com 区域的次要服务器 (type slave)。
        • /var/named/slaves/example.com.zone 文件是区域文件。如果您设置了相对路径,如本例中所示,这个路径相对于您在 options 语句中的目录中创建的 directory 相对。要隔离此服务器从属的区域文件,您可以将它们存储在 /var/named/slaves/ 目录中。
        • 任何主机都可以查询此区域。但是,您可以指定 IP 范围或 ACL 别名来限制访问。
        • 没有主机可以从该服务器传输区域。
        • 此区域的主服务器的 IP 地址是 192.0.2.12001:db8:1::2。但是,您可以指定 ACL 别名。此次要服务器将使用名为 example-transfer-key 的键向主服务器进行身份验证。
    2. 验证 /etc/named.conf 文件的语法:

      # named-checkconf
    3. 重新载入 BIND:

      # systemctl reload named

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

  3. 可选: 将新次要服务器的 NS 记录添加到主服务器上的区域文件中。

验证

  • 在次要服务器中:

    • 显示 named 服务的 systemd 日志条目:

      # journalctl -u named
      ...
      Jul 06 15:08:51 ns2.example.com named[2024]: zone example.com/IN: Transfer started.
      Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: connected using 192.0.2.2#45803
      Jul 06 15:08:51 ns2.example.com named[2024]: zone example.com/IN: transferred serial 2022070101
      Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: Transfer status: success
      Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: Transfer completed: 1 messages, 29 records, 2002 bytes, 0.003 secs (667333 bytes/sec)

      如果在 change-root 环境中运行 BIND,请使用 journalctl -u named-chroot 命令显示日志条目。

    • 验证 BIND 创建了区域文件:

      # ls -l /var/named/slaves/
      total 4
      -rw-r--r--. 1 named named 2736 Jul  6 15:08 example.com.zone

      请注意,默认情况下,次要服务器以二进制原始格式存储区域文件。

    • 从次要服务器查询传输的区的记录:

      # dig +short @192.0.2.2 AAAA www.example.com
      2001:db8:1::30

      本例假定您在此流程中设置的次要服务器侦听 IP 地址 192.0.2.2

2.7. 在 BIND 中配置响应策略区以覆盖 DNS 记录

要通过使用 DNS 阻塞和过滤来重写 DNS 响应来阻止对某些域或主机的访问,请在 BIND 中配置响应策略区域(RPZ)。您可以为受阻条目配置不同的操作,如返回 NXDOMAIN 错误或不响应查询。

如果您有多个 DNS 服务器,请在主服务器上配置 RPZ,稍后配置区域传送以在次要服务器上提供 RPZ。

先决条件

  • 您已将 BIND 配置为缓存名称服务器。
  • namednamed-chroot 服务正在运行。
  • 您有管理特权。

流程

  1. 编辑 /etc/named.conf 文件,将 response-policy 定义添加到 options 语句中:

    options {
        ...
    
        response-policy {
            zone "rpz.local";
        };
    
        ...
    }

    您可以在 response-policyzone 语句中为 RPZ 设置自定义名称。但是,在下一步中,您必须在区定义中使用相同的名称。

  2. 为您在最后一步中设置的 RPZ 添加 区定义

    zone "rpz.local" {
        type master;
        file "rpz.local";
        allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
        allow-transfer { none; };
    };
    • 此服务器是名为 rpz.local 的 RPZ 的主服务器 (type master)。
    • /var/named/rpz.local 文件是区域文件。在本例中,如果您设置了相对路径,此路径相对于您在 options 语句中的 directory 中设置的目录。
    • allow-query 中定义的任何主机都可以查询此 RPZ。但是,指定 IP 范围或 BIND 访问控制列表(ACL)别名来限制访问。
    • 没有主机可以传输区域。仅在设置次要服务器并且仅为次要服务器的 IP 地址时才允许区域传送。
  3. 验证 /etc/named.conf 文件的语法:

    # named-checkconf

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

  4. 使用以下内容创建 /var/named/rpz.local 文件:

    $TTL 10m
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1h         ; refresh period
                              1m         ; retry period
                              3d         ; expire time
                              1m )       ; minimum TTL
    
                     IN NS    ns1.example.com.
    
    example.org      IN CNAME .
    pass:[].example.org IN CNAME .example.net IN CNAME rpz-drop.pass:[].example.net    IN CNAME rpz-drop.

    这个区域文件:

    • 将资源记录的默认生存时间 (TTL) 值设置为 10 分钟。如果没有时间后缀(例如没有使用 h 指定小时),BIND 会将该值解析为秒。
    • 具有所需的 SOA 资源记录,以及有关该区域的详细信息。
    • ns1.example.com 设置为此区域的权威 DNS 服务器。要正常工作,区域需要至少一个域名服务器 (NS) 记录。但是,若要与 RFC 1912 兼容,您需要至少有两个域名服务器。
    • 将查询的 NXDOMAIN 错误返回给该域中的 example.org 和主机。
    • 将查询丢弃至此域中的 example.net 和主机。
  5. 验证 /var/named/rpz.local 文件的语法:

    # named-checkzone rpz.local /var/named/rpz.local
    zone __rpz.local/IN__: loaded serial __2022070601__
    OK
  6. 重新载入 BIND:

    # systemctl reload named

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

验证

  1. 尝试解析将 RPZ 配置为返回 NXDOMAIN 错误的 example.org 域中的主机:

    # dig @localhost www.example.org
    ...
    ;; ->>HEADER<<- opcode: QUERY, status: **NXDOMAIN**, id: 30286
    ...

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

  2. 尝试解析 RPZ 配置为丢弃查询的 example.net 域中的主机:

    # dig @localhost www.example.net
    ...
    ;; connection timed out; no servers could be reached
    ...

第 3 章 设置 unbound DNS 服务器

要验证、解析和缓存 DNS 查询,请配置 unbound DNS 服务。此外,unbound 增强了安全性,并且默认启用域名系统安全扩展(DNSSEC)。

3.1. 将 Unbound 配置为缓存 DNS 服务器

要解析和缓存成功且失败的查找,并从其缓存中回答对相同记录的请求,请配置 unbound DNS 服务。

先决条件

  • 您有管理特权。

流程

  1. 安装 unbound 软件包:

    # dnf install unbound
  2. 编辑 /etc/unbound/unbound.conf 文件,并在 server 子句中进行以下更改:

    1. 添加 interface 参数来配置 unbound 服务侦听查询的 IP 地址,例如:

      interface: 127.0.0.1
      interface: 192.0.2.1
      interface: 2001:db8:1::1

      使用这些设置时,unbound 仅侦听指定的 IPv4 和 IPv6 地址。

      将接口限制到特定接口,可防止客户端从未经授权的网络(如互联网)向这个 DNS 服务器发送查询。

    2. 添加 access-control 参数,以配置客户端可以从哪些子网查询 DNS 服务,例如:

      access-control: 127.0.0.0/8 allow
      access-control: 192.0.2.0/24 allow
      access-control: 2001:db8:1::/64 allow
  3. 创建用于远程管理 unbound 服务的私钥和证书:

    # systemctl restart unbound-keygen
    注意

    如果您跳过这一步,在下一步中验证配置将会报告缺少的文件。如果文件丢失,unbound 服务自动创建这些文件。

  4. 验证配置文件:

    # unbound-checkconf
    unbound-checkconf: no errors in /etc/unbound/unbound.conf
  5. 更新 firewalld 规则,以允许传入的 DNS 流量:

    # firewall-cmd --permanent --add-service=dns
    # firewall-cmd --reload
  6. 启用并启动 unbound 服务:

    # systemctl enable --now unbound

验证

  1. 查询在 localhost 接口上侦听的 unbound DNS 服务器以解析域:

    # dig @localhost www.example.com
    ...
    __www.example.com.__    __86400__    IN    A    __198.51.100.34__
    
    ;; Query time: __330 msec__
    ...

    在第一次查询记录后,unbound 会将条目添加到其缓存中。

  2. 重复最后一个查询:

    # dig @localhost www.example.com
    ...
    __www.example.com.__    __85332__    IN    A    __198.51.100.34__
    
    ;; Query time: __1 msec__
    ...

    由于对条目进行了缓存,进一步对相同记录的请求会非常快,直到条目过期为止。

    详情请查看您系统上的 unbound.conf (5) 手册页。

第 4 章 提供 DHCP 服务

要自动为客户端设备分配 IP 地址和其他网络设置,请使用动态主机配置协议(DHCP)。您可以设置 Kea 在网络中分配 DHCP 服务器。

4.1. 静态和动态 IP 地址之间的区别

要管理设备如何接收其唯一网络地址,您可以在两种方法之间进行选择:静态和动态 IP 寻址。

静态 IP 地址

当您为某个设备分配静态 IP 地址时,该地址不会随时间变化,除非您手动更改该地址。如果要使用静态 IP 地址:

  • 确保 DNS 等服务器的网络地址一致性和身份验证服务器。
  • 使用独立于其他网络基础架构的带外管理设备。
动态 IP 地址

当您将设备配置为使用动态 IP 地址时,该地址会随时更改。因此,动态地址通常用于偶尔连接到网络的设备,因为重启主机后 IP 地址可能会不同。

动态 IP 地址更为灵活,更容易设置和管理。DHCP 是动态为主机分配网络配置的传统方法。

注意

没有严格的规则来定义何时使用静态或动态 IP 地址。它取决于您的需求、首选项和网络环境。

4.2. DHCP 的阶段

DHCP 分为四个阶段:发现、提供、请求、确认,也称为 DORA 进程。DHCP 使用这个过程为客户端分配 IP 地址。

Discovery(发现)
DHCP 客户端发送一条信息来发现网络中 DHCP 服务器。客户端在网络和数据链路层广播此消息。
Offer(提供)
DHCP 服务器接收客户端的消息,并为客户端提供 IP 地址。服务器在数据链路层中单播此消息,并在网络层广播此消息。
Request(请求)
DHCP 客户端从 DHCP 服务器请求提供的 IP 地址。客户端在数据链路层中单播此消息,并在网络层广播该消息。
Acknowledgment(承认)
DHCP 服务器向客户端发送确认。服务器在数据链路层中单播此消息,并在网络层广播此消息。此确认是 DHCP DORA 进程中的最终消息。

4.3. 将 Kea 用于 DHCPv4 和 DHCPv6 概述

要独立管理 DHCPv4 和 DHCPv6 服务,请使用 Kea。Kea 是一个具有模块化设计的开源 DHCP 服务器。每个协议都有自己的配置文件来运行 DHCPv4 服务器、DHCPv6 服务器或两者来满足网络要求。

对于每个协议,Kea 使用单独的配置文件和服务:

DHCPv4
  • 配置文件: /etc/kea/kea-dhcp4.conf
  • systemd 服务名称: kea-dhcp4
DHCPv6
  • 配置文件: /etc/kea/kea-dhcp6.conf
  • systemd 服务名称: kea-dhcp6

4.4. Kea lease 数据库概述

DHCP 租期是 Kea 为客户端分配网络地址的周期。租期数据库包含有关分配的租期的信息,如分配给介质访问控制(MAC)地址的 IP 地址或租期过期时的时间戳。

租期数据库中的所有时间戳都位于 Coordinated Universal Time (UTC)中。

Kea 支持以下租期后端:

memfile (默认)

存储在磁盘上的文本文件。默认情况下,Kea 将 DHCP 租期存储在以下文件中:

  • 对于 DHCPv4: /var/lib/kea/kea-leases4.csv
  • 对于 DHCPv6: /var/lib/kea/kea-leases6.csv

    警告

    手动更新文件可能会导致不一致和文件损坏。出于性能的原因,Kea 在内存中存储租期数据,且不会在运行时监控租期文件。在下次 Kea 更新文件时,可以覆盖手动编辑。

mysql
MySQL 数据库后端。
pgsql
PostgreSQL 数据库后端。

Kea 在以下情况中更新租期数据库:

  • 租期更新
  • 在正常关闭时
  • 在定期租期文件清理(LFC)过程中
  • 对于 API 请求

4.5. 设置 Kea DHCP 服务器

为了避免手动 DHCP 配置而导致错误,请使用 Kea DHCP 服务器自动将 IP 地址和其他网络设置分配给客户端设备。

先决条件

  • 已安装 kea 软件包。
  • 您有管理特权。

步骤

  1. 如果要配置 IPv4 网络:

    1. 编辑 /etc/kea/kea-dhcp4.conf 文件,并使用以下配置:

      {
        "Dhcp4": {
          // Global settings that apply to all subnets unless overridden.
          "valid-lifetime": 86400,
          "option-data": [
            {
              "name": "domain-name",
      	"data": "example.com"
            },
            {
              "name": "domain-name-servers",
      	"data": "192.0.2.53"
            }
          ],
      
          "interfaces-config": {
            "interfaces": [ "enp1s0" ]
          },
      
          "subnet4": [
            // A definition of a subnet that is directly connected to the server
            {
              "id": 1,
              "subnet": "192.0.2.0/24",
              "pools": [
                { "pool": "192.0.2.20  - 192.0.2.100" },
                { "pool": "192.0.2.150 - 192.0.2.200" }
              ],
              "option-data": [
                { "name": "routers", "data": "192.0.2.1" }
              ],
            },
      
            // A definition of a remote subnet served through a DHCP relay
            {
              "id": 2,
              "subnet": "198.51.100.0/24",
              "pools": [
                { "pool": "198.51.100.20 - 198.51.100.100" }
              ],
      	// Allowed DHCP relay agents
      	"relay": {
                "ip-addresses": [ "198.51.100.5" ]
              },
              "option-data": [
                { "name": "routers", "data": "198.51.100.1" },
      	  { "name": "domain-name-servers", "data": "198.51.100.53" }
              ]
            }
          ]
        }
      }

      这个示例将 Kea 配置为提供两个子网:一个直接连接到服务器,一个远程配置为使用 DHCP 转发代理。

      interfaces
      定义 Kea 侦听 DHCP 请求的网络接口。如果子网没有直接连接到服务器,请列出接口,使子网能够通过这些接口访问。
      id
      如果定义了多个子网,请为子网定义唯一的整数。
      子网
      以无类别域间路由(CIDR)格式定义子网。
      定义 IP 地址范围,以便 Kea 可以为客户端分配地址。
      option-data
      定义发送到客户端的 DHCP 选项,如默认网关和 DNS 服务器。按子网选项设置覆盖全局设置。
      relay
      定义 DHCP 转发代理的 IP 地址。虽然此设置对于远程子网是可选的,但它提高了将转发请求限制为可信代理的安全性。不要将此参数用于直接连接的子网。
    2. 验证配置文件的语法:

      # kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    3. 更新 firewalld 规则,以允许传入的 DHCPv4 流量:

      # firewall-cmd --permanent --add-service=dhcp
      # firewall-cmd --reload
    4. 启用并启动服务:

      # systemctl enable --now kea-dhcp4
  2. 如果要配置 IPv6 网络:

    1. 编辑 /etc/kea/kea-dhcp6.conf 文件,并使用以下配置:

      {
        "Dhcp6": {
          // Global settings that apply to all subnets unless overridden.
          "valid-lifetime": 86400,
          "option-data": [
            {
              "name": "domain-name",
      	"data": "example.com"
            },
            {
              "name": "dns-servers",
      	"data": "2001:db8:0:1::53"
            }
          ],
      
          "interfaces-config": {
            "interfaces": [ "enp1s0" ]
          },
      
          "subnet6": [
            // A definition of a subnet that is directly connected to the server
            {
              "id": 1,
              "subnet": "2001:db8:0:1::/64",
              "pools": [
                { "pool": "2001:db8:0:1::1000 - 2001:db8:0:1::2000" },
                { "pool": "2001:db8:0:1::4000 - 2001:db8:0:1::5000" }
              ],
            },
      
            // A definition of a remote subnet served through a DHCP relay
            {
              "id": 2,
              "subnet": "2001:db8:0:2::/64",
              "pools": [
                { "pool": "2001:db8:0:2::1000 - 2001:db8:0:2::2000" }
              ],
      	// Allowed DHCP relay agents
      	"relay": {
                "ip-addresses": [ "2001:db8:0:2::5" ]
              },
              "option-data": [
      	  { "name": "dns-servers", "data": "2001:db8:0:1::53" }
              ]
            }
          ]
        }
      }

      这个示例将 Kea 配置为提供两个子网:一个直接连接到服务器,一个远程配置为使用 DHCP 转发代理。

    2. 验证配置文件的语法:

      # kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    3. 更新 firewalld 规则,以允许传入的 DHCPv6 流量:

      # firewall-cmd --permanent --add-service=dhcpv6
      # firewall-cmd --reload
    4. 启用并启动服务:

      # systemctl enable --now kea-dhcp6

验证

  1. 在客户端上配置使用 DHCP 的网络连接。详情请参阅 使用 nmcli配置以太网连接
  2. 将客户端连接到网络。
  3. 检查客户端是否从 DHCP 服务器收到 IP 地址:

    # ip address show <interface>
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.20/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1000/64 scope global noprefixroute
           valid_lft forever preferred_lft forever

故障排除

  • 检查 Kea 正在侦听的 IPv4 和 IPv6 地址:

    # ss -lunp | grep -E ':(67|547)'

    如果 Kea 没有侦听您配置的所有接口,请检查 Kea 配置文件中的 interfaces-config 设置。

后续步骤

4.6. 在 Kea 中配置 日志记录器

要根据优先级(如严重性级别)自定义日志设置,请在 Kea 中配置 日志记录器。默认情况下,如果 rsyslogd 服务在运行,Kea 将日志消息写入 systemd 日志和 /var/log/messages 文件。

先决条件

  • 您已在服务器上安装了 kea 软件包。
  • 您已启动 kea-dhcp4kea-dhcp6 服务。
  • 您有管理特权。

步骤

  1. 要配置 IPv4 网络,请编辑 /etc/kea/kea-dhcp4.conf 文件:

    1. loggers 配置添加到 Dhcp4 参数:

      {
        "Dhcp4": {
          ...,
          "loggers":[
            {
              "name":"kea-dhcp4",
              "output-options":[
                 {
                  "output":"kea-dhcp4.log",
                  "maxsize":104857600,
                  "maxver":5
                 }
              ],
              "severity":"INFO",
            }
          ],
          ...

      示例中指定的设置有:

      name
      定义 日志记录器 设置应用到的二进制名称。
      output
      /var/lib/kea/ 目录中设置日志文件名称。
      maxsize
      在 Kea 轮转日志文件前设置日志文件的最大大小。默认值为 10240000 字节。
      maxver
      设置 Kea 将保留的最大轮转版本数量。请注意,maxsize 值小于 204800 字节会禁用轮转。
      严重性
      指定记录的消息类别。您可以设置以下值之一: NONEFATALERRORWARNINFODEBUG。Kea 仅记录配置的严重性及更高等级的信息。
    2. 验证配置文件的语法:

      # kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    3. 重启 kea-dhcp4 服务:

      # systemctl restart kea-dhcp4
  2. 要配置 IPv6 网络,请编辑 /etc/kea/kea-dhcp6.conf 文件:

    1. loggers 配置添加到 Dhcp6 参数:

      {
        "Dhcp6": {
          ...,
          "loggers":[
            {
              "name":"kea-dhcp6",
              "output-options":[
                 {
                  "output":"kea-dhcp6.log",
                  "maxsize":104857600,
                  "maxver":5
                 }
              ],
              "severity":"INFO",
            }
          ],
          ...
    2. 验证配置文件的语法:

      # kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    3. 重启 kea-dhcp6 服务:

      # systemctl restart kea-dhcp6

验证

  • 监控日志文件,以检查它是否显示预期严重性的消息。

4.7. 使用 DHCP 为主机分配静态地址

要为介质访问控制(MAC)地址、DHCP 唯一标识符(DUID)或其他标识符分配固定 IP 地址,请在 Kea 的子网定义中使用保留。例如:使用这个方法总是为服务器或者网络设备分配相同的 IP 地址。

先决条件

  • 您已配置了 kea-dhcp4kea-dhcp6 服务。
  • 您有管理特权。

步骤

  1. 如果要配置 IPv4 网络:

    1. 编辑 /etc/kea/kea-dhcp4.conf 文件,并在 subnet4 参数中添加保留:

      {
        "Dhcp4": {
          "subnet4": [
            {
              "subnet": "192.0.2.0/24",
      	...,
              "reservations": [
                {
                  "hw-address": "52:54:00:72:2f:6e",
                  "ip-address": "192.0.2.130"
                }
              ],
      	...

      这个示例将 Kea 配置为始终将 192.0.2.130 IP 地址分配给 MAC 地址为 52:54:00:72:2f:6e 的主机。

      如需了解更多示例,请参阅 kea-doc 软件包提供的 /usr/share/doc/kea/examples/kea4/reservations.json 文件。

    2. 验证配置文件的语法:

      # kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    3. 重启 kea-dhcp4 服务:

      # systemctl restart kea-dhcp4
  2. 如果要配置 IPv6 网络:

    1. 编辑 /etc/kea/kea-dhcp6.conf 文件,并在 subnet6 参数中添加保留:

      {
        "Dhcp6": {
          "subnet6": [
            {
              "subnet": "2001:db8:0:1::/64",
        ...,
              "reservations": [
                {
                  "hw-address": "52:54:00:72:2f:6e",
                  "ip-address": "2001:db8:0:1::99"
                }
              ];
        ...

      这个示例将 Kea 配置为始终将 2001:db8:0:1::99 IP 地址分配给 MAC 地址为 52:54:00:72:2f:6e 的主机。

      如需了解更多示例,请参阅 kea-doc 软件包提供的 /usr/share/doc/kea/examples/kea6/reservations.json 文件。

    2. 验证配置文件的语法:

      # kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    3. 重启 kea-dhcp6 服务:

      # systemctl restart kea-dhcp6

4.8. 在 Kea 中分类客户端

要根据特定条件对客户端进行分组,并允许精细控制网络配置,请使用 Kea 客户端类。您可以应用特殊的处理规则,或者为客户端分配不同的 DHCP 选项。

您可以创建一个客户端类,将 IP 上的 Voice over IP (VoIP)设备分配给特定的 IP 池。这是为了确保 VoIP 电话获得与网络上的其它设备不同的 IP 地址。例如,在 IPv4 网络中,您可以使用 子字符串 表达式来测试其介质访问控制(MAC)地址的前 3 octets。在 MAC 地址不是可靠的指示符的 IPv6 网络中,您可以测试 DHCPv6 供应商类选项的子字符串。

先决条件

  • 您已配置了 kea-dhcp4kea-dhcp6 服务,并处于活动状态。
  • 您有管理特权。

步骤

  1. 要配置 IPv4 网络,请编辑 /etc/kea/kea-dhcp4.conf 文件

    1. 将客户端类添加到 Dhcp4 参数中:

      {
        "Dhcp4": {
          ...
          "client-classes": [
            {
                "name": "VoIP-Phones",
                "test": "substring(pkt4.mac, 0, 3) == 0x525400"
            },
            {
                "name": "Others",
                "test": "not member('VoIP-Phones')"
            }
          ],
          ...

      在本例中,以 52:54:00 开头的 MAC 地址的设备与 VoIP-Phones 客户端类匹配。Others 客户端类包含与规则不匹配的设备。

    2. 定义分配客户端类:

      {
        "Dhcp4": {
          "subnet4": [
            {
              "subnet": "192.0.2.0/24",
      	"pools": [
                {
                  "pool": "192.0.2.20  - 192.0.2.100",
                  "client-class": "Others"
                },
                {
                  "pool": "192.0.2.150 - 192.0.2.200",
                  "client-class": "VoIP-Phones"
                }
              ],
              ...

      根据主机匹配的客户端类,Kea 从对应的池中分配 IP 地址。

    3. 验证配置文件的语法:

      # kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    4. 重启 kea-dhcp4 服务:

      # systemctl restart kea-dhcp4
  2. 要配置 IPv6 网络,请编辑 /etc/kea/kea-dhcp6.conf 文件:

    1. 将客户端类添加到 Dhcp6 参数中:

      {
        "Dhcp6": {
          ...
          "client-classes": [
            {
                "name": "VoIP-Phones",
                "test": "option[16].exists and (substring(option[16].hex, 0, 8) == '00000009')",
            },
            {
                "name": "Others",
                "test": "not member('VoIP-Phones')"
            }
          ],
          ...

      在本例中,发送 DHCPv6 供应商类选项(选项 16)的设备,十六进制值以 00000009 开头,与 VoIP-Phones 客户端类匹配。Others 客户端类包含与规则不匹配的设备。

    2. 定义分配客户端类:

      {
        "Dhcp6": {
          "subnet6": [
            {
              "subnet": "2001:db8:0:1::/64",
      	"pools": [
                {
                  "pool": "2001:db8:0:1::1000 - 2001:db8:0:1::2000",
                  "client-class": "Others"
                },
                {
                  "pool": "2001:db8:0:1::4000 - 2001:db8:0:1::5000",
                  "client-class": "VoIP-Phones"
                }
              ],
              ...

      根据主机匹配的客户端类,Kea 从对应的池中分配 IP。

    3. 验证配置文件的语法:

      # kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

      如果命令返回 Syntax 检查失败,请修复报告中显示的错误。

    4. 重启 kea-dhcp6 服务:

      # systemctl restart kea-dhcp6

验证

  • 连接与客户端类中规则匹配的客户端,并验证 Kea 从关联的池中分配了一个 IP 地址。

4.9. DHCPv6 与 radvd的比较

要在需要默认网关设置的子网中使用 DHCPv6,请配置额外的路由器广告服务,如路由器公告守护进程(radvd)。

在 IPv6 网络中,只有路由器广告消息包含有关 IPv6 默认网关的信息。radvd 服务使用路由器广告数据包中的标志来声明 DHCPv6 服务器的可用性。

下表比较了 DHCPv6 和 radvd 的功能:

Expand
功能DHCPv6radvd

提供有关默认网关的信息

保证随机地址以保护隐私

发送更多网络配置选项

将 MAC 地址映射到 IPv6 地址

4.10. 为 IPv6 路由器配置 radvd 服务

要管理路由器广告消息,请配置路由器广告守护进程(radvd)服务。此服务为 IPv6 无状态自动配置发送路由器广告消息。您可以根据这些广告配置地址、设置、路由和选择默认路由器。

注意

您只能在 radvd 服务中设置 /64 前缀。要使用其他前缀,请使用 DHCPv6。

先决条件

  • 您有管理特权。

步骤

  1. 安装 radvd 软件包:

    # dnf install radvd
  2. 编辑 /etc/radvd.conf 文件,以使用以下参数配置 radvd

    interface enp1s0
    {
      AdvSendAdvert on;
      AdvManagedFlag on;
      AdvOtherConfigFlag on;
    
      prefix 2001:db8:0:1::/64 {
      };
    };
    • enp1s0 接口上为 2001:db8:0:1::/64 子网发送路由器公告消息。
    • AdvManagedFlag on 标志定义客户端应该从 DHCP 服务器接收 IP 地址。
    • AdvOtherConfigFlag 标志定义客户端也应该从 DHCP 服务器接收非地址信息。
  3. 启用 radvd 以在系统引导时自动启动:

    # systemctl enable --now radvd

    详情请查看系统中的 radvd.conf (5) 手册页和 /usr/share/doc/radvd/radvd.conf.example 文件。

验证

  • 显示路由器广告软件包的内容以及 radvd 发送的配置的值:

    # radvdump
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部