bind9需显式配置listen-on、allow-query和recursion三开关才能解析内网域名:监听内网ip、允许内网查询、按需启用递归;还需确保区域文件路径正确、属主权限合规,并用named-checkconf与named-checkzone验证后重启服务。

bind9 不是装完就能解析内网域名的服务。它默认不监听外部地址、不响应任何查询、甚至拒绝本地 dig @localhost 请求——除非你明确告诉它“我要做内网 DNS”,并配对三个关键开关。
listen-on 和 allow-query 必须显式放开,否则查不到
默认配置下,named 只监听 127.0.0.1,且只允许本机查,外网机器连都连不上,更别说解析了。
常见错误现象:dig @192.168.222.110 example.local 超时或返回 connection refused。
-
listen-on port 53 { 192.168.222.110; };—— 写死内网 IP,别用any(除非真要暴露给全网) -
allow-query { 192.168.222.0/24; };—— 仅允许可信网段,测试阶段可暂设{ any; },上线前必须收紧 - 别漏掉
port 53:BIND 默认监听 UDP/TCP 53,但写错成port 5353或漏写端口,服务就静默失效
recursion yes; 是内网缓存 DNS 的核心开关
如果你只是想让内网设备访问 google.com 更快,或统一走公司上游 DNS,那你就需要递归能力;但若你只想管 dev.internal 这种私有域名,就得关掉递归,否则会被当成开放 DNS 滥用。
错误现象:dig @192.168.222.110 google.com 返回 NOERROR 但无 ANSWER SECTION,大概率是 recursion 和服务类型没对上。
- 缓存型(推荐新手起步):
recursion yes;+forwarders { 8.8.8.8; 223.5.5.5; }; - 权威型(只管自己域名):
recursion no;+ 显式声明zone "dev.internal" IN { type master; file "/etc/bind/zones/db.dev.internal"; }; - 两者混用?不行。
recursion yes下的权威 zone 仍会尝试向上游查不存在的子域,导致意外转发
区域文件路径、属主、权限三者缺一不可
你写了 file "/etc/bind/zones/db.dev.internal";,但 named 根本读不到——不是语法错,而是三个隐形条件没满足:
- 目录存在:
sudo mkdir -p /etc/bind/zones,否则named-checkzone可能报错或静默跳过 - 属主正确:Debian/Ubuntu 是
bind:bind,RHEL/CentOS 是named:named;sudo chown bind:bind /etc/bind/zones - 文件可读:
sudo chmod 644 /etc/bind/zones/db.dev.internal,且文件里$TTL和SOA的 serial 值必须是数字(如2026041001),不能是0或current
named-checkconf 和 named-checkzone 不是可选步骤
改完 /etc/bind/named.conf 或区域文件后直接 systemctl restart bind9,十次有八次会失败——因为配置语法或路径逻辑错,但 systemd 日志只显示 “failed to start”,不告诉你哪一行错了。
务必按顺序执行:
-
sudo named-checkconf—— 检查主配置语法,出错就停在这步 -
sudo named-checkzone dev.internal /etc/bind/zones/db.dev.internal—— 验证 zone 文件结构和 SOA 序列号格式 - 两个都通过,再
sudo systemctl restart bind9,然后sudo journalctl -u bind9 -n 20 --no-pager看是否加载 zone 成功
防火墙和 SELinux 容易被忽略:CentOS/RHEL 上默认启用 SELinux,named 读取自定义路径(如 /etc/bind/zones/)需额外策略;而 ufw 或 firewalld 若未放行 53/udp,客户端查 DNS 就是超时。这些不是“高级配置”,是内网 DNS 能不能通的第一道门槛。











