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