BIND
BIND (或 named) 是最广泛使用的域名系统 (DNS) 服务器。
安装
启动/启用 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.$ORIGIN
⇒ mail.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; };
如果您想为您的本地网络提供名称服务;例如 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 环境中运行不是必需的,但可以提高安全性。
创建 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"; };
还应在配置中允许递归。请参阅#允许递归。
另请参阅
- BIND 9 管理员参考手册 (ARM)
- readthedocs 上的 BIND ARM
- BIND 知识库
- 互联网系统协会 (ISC)
- Pro DNS and BIND 以及 在线缩略版
- DNS 术语表
- 关于 BIND 未来的存档邮件列表讨论
- root zone transfer made simple - serve root@home 复制
/etc/named.conf
,重启 BIND 并享受! - DNSSEC