要让linux主机对外提供dns服务,必须正确运行named进程并配置监听端口、区域文件、权限、selinux上下文、防火墙及soa序列号等,缺一不可。

不是改 /etc/resolv.conf 就算配好了 DNS 服务器——那是告诉本机“去哪查”,不是让你“提供查询服务”。真要让 Linux 主机对外提供域名解析,核心是跑通 named 进程、让它监听正确端口、能读取区域文件、且不被系统层拦住。
systemctl start named 失败?先看日志和权限
常见现象:执行 systemctl start named 后立刻退出,systemctl status named 显示 active (exited) 或报 permission denied。
根本原因不是配置写错了,而是路径属主、SELinux 上下文或 chroot 路径错位。
- Debian/Ubuntu 默认用
bind用户运行,确保/etc/bind/和/var/cache/bind/的属主是bind:bind(sudo chown -R bind:bind /etc/bind /var/cache/bind) - RHEL/CentOS 7+ 默认启用 SELinux,
/etc/named.conf和区域文件必须有正确上下文:sudo restorecon -Rv /etc/named.conf /var/named/ - 若用了
bind-chroot(如 CentOS 6),实际配置路径是/var/named/chroot/etc/named.conf,改/etc/named.conf完全无效 -
journalctl -u named -n 50 -f是唯一可靠排查入口,别只看 systemctl status
dig @your-ip example.com 返回 REFUSED?检查 listen-on 和 allow-query
服务起来不代表能响应外部请求。BIND 默认只监听 127.0.0.1,且默认拒绝非本地查询。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
listen-on port 53 { any; };或明确列出 IP(如{ 192.168.1.100; 127.0.0.1; };)——漏掉目标网卡 IP,外部机器连都连不上 -
allow-query { any; };或限定网段(如{ 192.168.1.0/24; localhost; };)——即使连上了,也会被策略静默拒绝 - IPv6 也要配:
listen-on-v6 port 53 { any; };,否则 IPv6 客户端查不到 - 测试命令必须带服务器 IP:
dig @192.168.1.100 example.com,不能只写dig example.com(那走的是本机 resolv.conf)
named-checkconf 和 named-checkzone 报错但不指行号?盯死三处标点
这两个工具只报“syntax error”或“SOA serial too old”,从不告诉你第几行错了。问题几乎全出在复制粘贴时引入的隐形错误。
- 分号缺失:每个语句末尾必须有
;,尤其file "/path/to/zone";和type master; - 括号不匹配:
options { ... };、zone "example.com" { ... };必须成对,嵌套时极易漏掉外层} - 引号不闭合或混入中文标点:复制网页示例时,
“和”会直接导致失败,务必手动敲" -
named-checkconf的file路径是相对于directory值的(默认/var/named),不是相对于/etc/named.conf所在目录 -
named-checkzone example.com /var/named/example.com.zone必须带域名参数,且第二个参数是完整路径
正向 zone 文件里写了 NS 记录但 dig 没返回 A?补全 glue record
区域文件里声明了 @ IN NS ns1.example.com.,但没定义 ns1 的 A 或 AAAA 记录,BIND 会静默跳过该 zone,named -g 启动时可能不报错,但查询返回 NOERROR 无答案。
- NS 记录指向的主机名(如
ns1.example.com.)必须在同一 zone 内有对应A记录,否则叫 “glue missing” - 反向 zone 名必须是
X.Y.Z.in-addr.arpa格式,比如网段192.168.222.0/24对应222.168.192.in-addr.arpa,顺序倒着来 - SOA 的
serial必须是纯数字,每次改 zone 文件后必须递增(哪怕只 +1),否则辅服务器拒绝同步 - 区域文件里的
@代表当前 zone 名,ns1是相对名,等价于ns1.example.com.;写成ns1.example.com.(结尾带点)则是绝对名,不依赖$ORIGIN
真正卡住人的从来不是语法本身,而是 BIND 在权限、路径、SELinux、防火墙、IPv6、SOA serial 这几层之间形成的“连锁静默失败”——某一层没对,下一层就根本不执行,还不会明说。动手前先确认你到底要缓存、权威还是转发,再逐层验证,比反复改配置高效得多。










