BIND9 DNS
前言
- Bekerley Internet Name Domain
- 由 ISC (www.isc.org)提供的DNS软件实现DNS域名结构
- 除 bind DNS 可以提供 DNS 功能外,powerdns、unbound 同样也可以提供 DNS 功能
bind DNS 相关端口
- dns 使用的是 tcp 和 udp 的53端口
- 953是 rndc 管理使用的端口 用不到这个端口的话关闭953端口也可以
BIND9 安装
# CentOS
yum -y install bind bind-utils
# Ubuntu
apt -y install bind9BIND9 相关文件
Ubuntu
最常用的几个:
- 改配置基本只动 /etc/bind/named.conf.local 和 named.conf.options
- 自己加区域文件一般都放在 /etc/bind/zones/ 目录下(自己新建),然后在 named.conf.local 里 include
- 主程序是 /usr/sbin/named
- 运行数据都在 /var/cache/bind
# dpkg -L bind9
/etc/bind/named.conf # BIND9 主配置文件,所有配置的入口
/etc/bind/named.conf.options # 全局选项配置(如监听地址、递归、DNSSEC等)
/etc/bind/named.conf.local # 用户自定义区域文件,通常放你自己添加的zone
/etc/bind/named.conf.default-zones # Debian/Ubuntu 默认预定义的几个基本zone(如localhost、127.0.0.1)
/etc/bind/bind.keys # DNSSEC 信任锚(trust anchors),存放根区KSK公钥
/etc/bind/db.0 # 根区提示文件(root hints),告诉BIND根服务器在哪里
/etc/bind/db.127 # 127.0.0.1 反向解析区(localhost)
/etc/bind/db.local # 本地环回正向解析区(localhost -> 127.0.0.1)
/etc/bind/db.empty # 空区模板,经常用来做黑洞/空区
/etc/bind/db.255 # 广播地址反向区(255.255.255.255)
/etc/bind/zones.rfc1918 # RFC1918 私有地址空区配置(10/172.16/192.168 返回NXDOMAIN,防泄漏)
/etc/default/named # Debian/Ubuntu 启动参数配置(如是否启用chroot、额外选项)
/usr/sbin/named # BIND9 主程序(DNS服务器守护进程)
/usr/sbin/ddns-confgen # 生成动态更新用的TSIG密钥工具(替代tsig-keygen)
/usr/sbin/tsig-keygen # 生成TSIG密钥工具(已软链接到ddns-confgen)
/usr/bin/named-rrchecker # 检查资源记录语法是否正确的工具
/usr/bin/named-journalprint # 打印journal文件内容(查看zone动态更新历史)
/usr/bin/named-nzd2nzf # 把.nzd格式区文件转成普通zone格式
/usr/bin/arpaname # ARPA域名转punycode工具(很少用)
/usr/bin/nsec3hash # 生成NSEC3 hash工具(DNSSEC相关)
/usr/bin/dnssec-importkey # 把DNSKEY导入trusted-keys格式的工具
/var/cache/bind # 默认工作目录,存放动态zone的.jnl文件、统计数据、缓存等
/lib/systemd/system/named.service # systemd 服务单元文件(启动named)
/lib/systemd/system/named-resolvconf.service # 与resolvconf集成的小服务
/etc/apparmor.d/usr.sbin.named # AppArmor 安全策略文件(限制named权限)
/usr/lib/x86_64-linux-gnu/bind/filter-a.so # view/filter功能用的过滤模块(过滤A记录)
/usr/lib/x86_64-linux-gnu/bind/filter-aaaa.so # 同上,过滤AAAA记录(IPv6)
/usr/share/doc/bind9/NEWS.Debian.gz # Debian 特定版本的重要更新说明(必看)
/usr/share/doc/bind9/changelog.Debian.gz # Debian 打包历史变更记录
/etc/ufw/applications.d/bind9 # UFW 防火墙预定义规则(方便一键开放53端口)CentOS
# rpm -ql bind
...
/etc/named.conf #主配置文件
/usr/lib/systemd/system/named.service #主程序
/var/named/named.ca #根DNS服务器的地址
/var/named #主DNS数据库的存放路径(区域数据库)
...BIND9 配置文件说明
区域数据库
/etc/bind/zones/db.internal.example.com文件:
$TTL 86400
@ IN SOA ns1.internal.example.com. admin.internal.example.com. (
2025122201 ; Serial(每次修改+1)
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
@ IN NS ns1.internal.example.com.
@ IN NS ns2.internal.example.com.
@ IN NS ns3.internal.example.com. ; 如果有第三个
ns1 IN A 192.168.1.10
ns2 IN A 192.168.1.11
ns3 IN A 192.168.1.12
s1.bj IN A 192.168.1.101 ; 示例记录
s2.bj IN A 192.168.1.102
s3.bj IN A 192.168.1.103这个文件是 BIND9 的正向解析区文件(Zone File),文件名通常是 db.internal.example.com(或类似),用于定义域名 internal.example.com 下所有主机名到 IP 地址的映射关系。
$TTL 86400
- 含义:设置这个区内所有记录的默认生存时间(TTL,Time To Live) 为 86400 秒(也就是 24 小时)。
- 作用:告诉其他 DNS 服务器(或客户端缓存)这个记录可以缓存多久,过期后需要重新查询。1 天是常见默认值。
@ IN SOA ns1.internal.example.com. admin.internal.example.com. (
2025122201 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
- 这是SOA 记录(Start of Authority,权威开始记录),每个区文件必须有且只能有一条,是这个域的“身份证”。
- @:代表当前区名本身,即
internal.example.com.(注意后面有点,域名全称以点结尾)。该值通过 zone 配置文件/etc/bind/named.conf.local中的zone "internal.example.com"和file指向的文件名结合来确定的。 - IN:表示 Internet 类(几乎总是 IN)。
- SOA:记录类型。
- ns1.internal.example.com.:这个域的主名字服务器(Primary NS),带点表示全称。
- admin.internal.example.com.:管理员邮箱(@ 替换成了点),即 admin@internal.example.com。
ns1.internal.example.com.、admin.internal.example.com.这两个字段是 SOA 记录里必须填写的两个关键部分,不能省略。
- 括号内是 SOA 的参数:
2025122201Serial(序列号):每次修改区文件后必须增大这个数字(常用格式:年月日+当天第几次修改)。Slave 服务器通过比较 Serial 判断是否需要从 Master 拉取更新。3600Refresh:Slave 每隔 3600 秒(1 小时)检查一次 Master 是否有更新。1800Retry:如果 Slave 联系 Master 失败,1800 秒(30 分钟)后重试。604800Expire:如果 Slave 连续 604800 秒(7 天)都联系不上 Master,就认为自己的数据过期,不再提供服务。86400Minimum TTL:旧版 BIND 用的负缓存 TTL(现在大多被 $TTL 取代,但仍建议保留)。
@ IN NS ns1.internal.example.com.
@ IN NS ns2.internal.example.com.
@ IN NS ns3.internal.example.com. ; 如果有第三个
- NS 记录(Name Server 记录):声明这个域的权威名字服务器有哪些。
- 写了三条,表示
internal.example.com由 ns1、ns2、ns3 三台服务器共同负责。 - 客户端查询这个域时,会从这些 NS 中选择一台问。
- 注意:每条 NS 记录的域名后都要带点(全称)。
ns1 IN A 192.168.1.10
ns2 IN A 192.168.1.11
ns3 IN A 192.168.1.12
- A 记录(Address 记录):把主机名映射到 IPv4 地址。
ns1是简写,实际代表ns1.internal.example.com.。- 这三条是“胶记录(glue records)”,非常重要!因为 NS 记录指向了 ns1/ns2/ns3,如果没有对应的 A 记录,外部就不知道这些 NS 的 IP 是多少,导致解析链断掉。
s1.bj IN A 192.168.1.101 ; 示例记录
s2.bj IN A 192.168.1.102
s3.bj IN A 192.168.1.103
- 真正的业务主机记录。
s1.bj是简写,完整域名是s1.bj.internal.example.com.。- 表示访问
s1.bj.internal.example.com时返回 IP 192.168.1.101。 - 分段写法(bj 层)是为了方便管理,实际解析时会自动补全成完整域名。
总结这个文件的作用
- 定义了域名
internal.example.com的全部解析规则。 - 声明了三台名字服务器(ns1/ns2/ns3)及其 IP。
- 提供了几台业务服务器的地址(s1.bj、s2.bj、s3.bj)。
- 只放在 Master 服务器 上修改,Slave 会自动通过 zone transfer 同步这个文件内容。
使用建议
- 每次修改这个文件后,记得把 Serial 号码加 1(比如改成 2025122202)。
- 然后执行
sudo rndc reload internal.example.com平滑重载。 - 可以继续添加更多记录,比如:
wwwIN A 192.168.1.100mailIN A 192.168.1.50*.bjIN A 192.168.1.200 ; 通配符记录(慎用)
BIND9 相关工具
# 检查配置文件语法
named-checkconf
# 检查区域数据库的语法,第一个xiangzheng.org表示在配置文件中定义的名称
named-checkzone xiangzheng.org /var/named/xiangzheng.org.zone
named-checkzone xiangzheng.org /var/cache/bind/xiangzheng.com.zone.bind
# 重新加载 BIND DNS
systemctl reload bind9
# 重新加载BIND DNS(依赖于 named 进程开放的 TCP/953 控制端口)
rndc reload