BIND

来自 ArchWiki

BIND (或 named) 是最广泛使用的域名系统 (DNS) 服务器。

注意: 开发 BIND 的组织会提前最多四天向付费客户发布安全通知,然后再向 Linux 发行版或公众发布。[1]

安装

安装 bind 软件包。

启动/启用 named.service systemd 单元。

要在本地使用 DNS 服务器,请使用 127.0.0.1 名称服务器(意味着像 Firefox 这样的客户端通过 127.0.0.1 解析),请参阅域名解析。但这将需要您#允许递归,而防火墙可能会阻止外部查询您的本地 named。

配置

BIND 在 /etc/named.conf 中配置。可用选项在 named.conf(5) 中有文档记录。

重新加载 named.service 单元以应用配置更改。

限制访问本地主机

默认情况下,BIND 监听所有接口和 IP 地址的端口 53。要仅允许来自本地主机的连接,请将以下行添加到 /etc/named.conf 中的 options 部分

listen-on { 127.0.0.1; };
listen-on-v6 { ::1; };

设置 DNS 转发

要使 BIND 将 DNS 查询转发到另一个 DNS 服务器,请将 forwarders 子句添加到 options 部分。

使 BIND 转发到 Google Public DNS 服务器的示例

forwarders {
    8.8.8.8; 2001:4860:4860::8888;
    8.8.4.4; 2001:4860:4860::8844;
};

(截至 9.18,仅支持纯文本 DNS 服务器作为转发器。)

通过 TLS 或 HTTPS 提供 DNS 服务

要在 BIND 9.18 中启用通过 TLS 或 HTTPS 提供 DNS 服务,请定义一个 tls 块,指定您的证书,然后添加 listen-on 子句,以启用通过 TLS 和 HTTPS 侦听器(以及标准 DNS 侦听器)。

/etc/named.conf
tls mycert {
    cert-file "<path>.crt";
    key-file "<path>.key";
};

options {
    // Standard port 53 listeners need to be re-added explicitly
    listen-on    { any; };
    listen-on-v6 { any; };
    
    // Add a DNS over TLS listener on standard port 853
    listen-on    tls mycert { any; };
    listen-on-v6 tls mycert { any; };
    
    // Add a DNS over HTTPS listener on custom port
    listen-on    port 9443 tls mycert http default { any; };
    listen-on-v6 port 9443 tls mycert http default { any; };
    
    // If needed, add a cleartext HTTP listener for a reverse proxy
    //listen-on    port 8443 tls none http default { 127.0.0.1; };
    //listen-on-v6 port 8443 tls none http default { ::1; };
};
...

请注意,tls{} 是在顶层定义的,而不是options{} 块内。

运行域的配置模板

以下是正在设置的简单家庭名称服务器,使用 domain.tld 作为像本 wiki 的 archlinux.org 域一样在全世界范围内服务的域。

更详细的示例是 带有 BIND9 视图的 DNS 服务器,而 这展示了 如何设置内部网络名称解析。

创建区域文件

创建 /var/named/domain.tld.zone

$ORIGIN domain.tld.
$TTL 2h

@               SOA     ns1 hostmaster (
                                2018111111 ; Serial
                                8h         ; Refresh
                                30m        ; Retry
                                1w         ; Expire
                                1h )       ; Negative Cache TTL
                NS      ns1
                NS      ns2
                
@               A       203.0.113.1
                AAAA    2001:db8:113::1
                MX      10 mail
                TXT     "v=spf1 mx"

www             A       203.0.113.1
                AAAA    2001:db8:113::1

ns1             A       203.0.113.4
                AAAA    2001:db8:113::4

ns2             A       198.51.100.5
                AAAA    2001:db8:5100::5

mail            A       198.51.100.6
                AAAA    2001:db8:5100::6
imap            CNAME   mail
smtp            CNAME   mail

$ORIGIN 定义了所有不以 .(点)结尾的名称的默认后缀,例如 mail 将扩展为 mail.$ORIGINmail.domain.tld. 到处都是。

$TTL 定义了所有未指定自己的 TTL 记录的默认生存时间(即缓存过期时间)。这里是 2 小时。

每次更改区域的资源记录时,必须在重新加载 named 之前手动递增序列号。否则,辅助服务器(副本或从服务器)将不会重新传输区域:它们仅在序列号大于上次传输区域的序列号时才执行此操作。此示例使用有点常见的 YYYYMMDDXX 格式,但这并非必需;序列号也可以从 1 开始。

配置主服务器

将您的区域添加到 /etc/named.conf

 zone "domain.tld" IN {
         type master;
         file "domain.tld.zone";
         allow-update { none; };
 };

重新加载 named.service 单元以应用配置更改。

允许递归

如果您正在运行自己的 DNS 服务器,您不妨将其用于所有 DNS 查找,甚至#在本地提供根区域服务。前者将需要执行递归查找的能力。为了防止 DNS 放大攻击,默认情况下大多数解析器都关闭了递归。默认的 Arch /etc/named.conf 文件仅允许在环回接口上进行递归

allow-recursion { 127.0.0.1; ::1; };

本文或本节的事实准确性存在争议。

原因: 局域网网络不是递归的。(在 Talk:BIND 中讨论)

如果您想为您的本地网络提供名称服务;例如 192.168.0.0/24,您必须将相应的 IP 地址范围添加到 /etc/named.conf

allow-recursion {
    192.168.0.0/24;
    fd01:2345:6789::/64;
    127.0.0.1;
    ::1;
};

配置 BIND 以提供 DNSSEC 签名区域

DNSSEC 验证默认启用。不要忘记检查“edns”是否未禁用。

在主 DNS 服务器上

  • 生成 KSK 和 ZSK 密钥
 $ dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com
 $ dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com
  • 更改区域配置
 zone "example.com" {
       type master;
       allow-transfer { ... };
       auto-dnssec maintain;
       inline-signing yes;
       key-directory "master/";
       file "master/example.com.zone";
 };

现在 bind 将自动签名区域。(此示例假定所有必需的文件都在 /var/named/master/ 中)

然后,您应该将 DS 记录(来自 dsset-example.com. 文件)传递给父区域所有者,可能使用您的注册商网站。它将父区域与您的 KSK 关联起来。

KSK(和相应的 DS 记录)应该很少更改,因为它需要手动干预,ZSK 可以更频繁地更改,因为此密钥通常较短,以便更快地进行签名检查。

您可以安排旧 ZSK 密钥过期并使用以下命令生成新密钥

 $ dnssec-settime -I +172800 -D +345600 Kexample.com.+000+111111.key
 $ dnssec-keygen -S Kexample.com.+000+111111.key -i 152800

Bind 应该会在适当的时间自动使用新的 ZSK 密钥。

有外部机制,例如具有完全自动密钥滚动的 OpenDNSSEC。

自动监听新接口

默认情况下,bind 每小时扫描新接口并停止监听不再存在的接口。您可以通过添加 

interface-interval rescan-timeout-in-minutes;

参数到 named.conf options 部分来调整此值,最大值为 28 天(40320 分钟)。您可以通过将其值设置为 0 来禁用此功能。

然后重启服务。

在 chroot 环境中运行 BIND

chroot 环境中运行不是必需的,但可以提高安全性。

本文或本节需要扩充。

原因: /srv/ 是 chroot 的奇怪位置,/var/lib/ 将是一个更常见的位置。(在 Talk:BIND 中讨论)

创建 jail 环境

为了做到这一点,我们首先需要创建一个地方来保存 jail 环境,我们将使用 /srv/named,然后将所需的文件放入 jail 环境中。

# mkdir -p /srv/named/{dev,etc,usr/lib/engines,var/{run,log,named}}

复制所需的系统文件

# cp -av /etc/{localtime,named.conf} /srv/named/etc/
# cp -av /usr/lib/engines-1.1/* /srv/named/usr/lib/engines/
# cp -av /var/named/* /srv/named/var/named/.

/dev/ 中设置所需的节点

# mknod /srv/named/dev/null c 1 3
# mknod /srv/named/dev/random c 1 8

设置文件的所有权

# chown -R named:named /srv/named

这应该为 jail 环境创建所需的文件系统。

服务单元

接下来,我们需要一个替换单元文件,以便服务调用 bind,这将允许强制 bind 进入 chroot

/etc/systemd/system/named-chroot.service
ExecStart=/usr/bin/named -4 -f -u named -t "/srv/named"

现在,使用 daemon-reload 重新加载 systemd,并启动 named-chroot.service

在本地提供根区域服务

如果您不想依赖第三方 DNS 服务,您可以按照 RFC:7706 在本地提供根区域服务。这可以通过将 BIND 用作 DNS 递归解析器来实现。

要管理递归解析器,您通常需要配置根提示文件。此文件包含根区域的权威名称服务器的名称和 IP 地址。

IANA 网站 获取文件并将其放入 /var/named

编辑您的服务器配置,添加相应的文件

/etc/named.conf
zone "." IN {
    type hint;
    file "named.root";
};

还应在配置中允许递归。请参阅#允许递归

另请参阅