bind9需明确服务类型:缓存服务器(recursion yes; + forwarders)、权威服务器(type master; + recursion no;)或转发服务器;关键配置listen-on、allow-query、recursion必须匹配目标,区域文件路径权限与soa serial需正确,防火墙和selinux亦须检查。

bind9 不是“装上就能用”的服务,它默认不监听外部请求、不提供权威解析、甚至可能连本地查询都拒绝——配置 DNS 服务器的核心,是明确你到底要什么:是给内网设备做本地缓存?还是对外提供 example.com 的权威解析?目标不同,配置逻辑完全不同。
确认你要的是哪种 DNS 服务
很多人一上来就改 /etc/bind/named.conf,结果 dig @localhost example.com 返回 REFUSED,根本原因是没分清服务类型:
-
缓存服务器(推荐新手起步):只转发查询、不管理任何域名,适合内部网络加速。关键配置是
recursion yes;+forwarders { 8.8.8.8; 223.5.5.5; }; -
权威服务器(生产常用):真正“管”某个域名,比如
example.com的 A 记录由你决定。必须设type master;、写区域文件、禁用递归(recursion no;) - 转发服务器(轻量替代方案):不自己查,把所有请求原样转给上游(如公司统一 DNS),适合策略集中管控
混淆这三者,会导致权限拒绝、超时、或返回意外的缓存结果。
最关键的三个配置项不能错
哪怕只配一个权威 zone,以下三项漏掉任意一个,systemctl start bind9 可能成功,但查询必失败:
-
listen-on port 53 { any; };:BIND 默认只监听127.0.0.1,外部机器根本连不上。别信“any 安全风险大”,内网环境先放开再加 ACL -
allow-query { any; };:即使连上了,也会被默认策略拒之门外。测试阶段先设any,上线前收紧为具体网段(如192.168.1.0/24) -
recursion no;(权威场景)或recursion yes;(缓存场景):这个开关控制 BIND 是否替你去网上查。权威服务器必须关掉,否则会被当成开放递归滥用
错误现象:dig @your-server-ip example.com 返回 NOERROR 但无答案,大概率是 recursion 和服务类型不匹配。
区域文件路径和权限最容易被忽略
你写了 file "/etc/bind/zones/db.example.com";,但 BIND 实际读不到——不是路径写错,而是两个隐形条件没满足:
- 目录
/etc/bind/zones/必须存在,且属主是bind用户(Debian/Ubuntu)或named(RHEL/CentOS)。直接sudo mkdir /etc/bind/zones后不改属主,BIND 会静默跳过该 zone - 区域文件本身需有读权限:
sudo chown bind:bind /etc/bind/zones/db.example.com(Ubuntu)或sudo chown named:named ...(CentOS) - SOA 记录里的
Serial必须每次修改后递增(如从2024010101改成2024010102),否则从服务器或客户端缓存不会更新
验证命令别只用 named-checkconf,一定要跑:named-checkzone example.com /etc/bind/zones/db.example.com,它能发现 NS 记录指向不存在、TTL 格式错误等硬伤。
防火墙和 SELinux 是真实存在的拦路虎
配置全对,systemctl status bind9 显示 active,但就是没响应?先看这两处:
-
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-all(CentOS):DNS 依赖 UDP 53 端口,TCP 53 仅用于大响应或区域传输。只开 TCP 或只开 UDP 都不行 - SELinux(RHEL/CentOS):默认禁止 BIND 写入自定义路径。若把 zone 文件放在
/home/user/zones/这类非标准位置,setsebool -P named_write_master_zones 1或chcon -t named_zone_t /path/to/file才能生效
本地测试用 dig @127.0.0.1 example.com 成功,但换一台局域网机器就超时?90% 是防火墙或 allow-query 没放开。
; 可能只是报错,少一个 allow-query 却让你调试两小时。最稳妥的做法,是先用最小化缓存配置跑通,再逐步叠加权威解析能力。










