内网想用域名访问机器,或者需要把 IP 反查成域名,可以在 Rocky Linux 9 上装 BIND 自己搭一台 DNS 服务器。这篇记录正向解析(域名到 IP)和反向解析(IP 到域名)的完整配置过程:安装、主配置、区域文件、语法检查、启动、防火墙,每一步都带验证点。全部命令在 rockylinux:9 容器里实跑过(BIND 9.16.23-RH),容器里没有 systemd,服务以 named -u named 方式启动实测;物理机/虚拟机上对应的 systemctl 写法一并列出。文末附 CentOS 7 差异对照。

装好的是一台权威 DNS:www.example.com 解析到 192.168.254.150,反查 192.168.254.150 返回域名。

前置条件

  • 操作系统:Rocky Linux 9(实测环境 rockylinux:9 容器,BIND 9.16.23-RH,dnf 4.14.0,aarch64)
  • 权限:root
  • 端口:DNS 走 UDP/TCP 53,防火墙要放行
  • 概念准备:正向区域把域名映射到 IP(A 记录),反向区域把 IP 映射回域名(PTR 记录),两者是两份独立的区域文件,在 named.conf 里分别声明

安装 BIND

Rocky Linux 9 用 dnf 装软件。BIND 主程序和配套工具(nslookup、dig 之类的诊断命令就在 bind-utils 里)一条命令装齐:

1
dnf install -y bind bind-utils

验证点:named -v 输出版本号。实测装到的是 9.16.23-RH(RedHat 扩展支持版):

配图1

顺带说明:Rocky 9 上的 /usr/bin/yum 是指向 dnf 的软链接,yum install 和 dnf install 实际是同一个命令。新系统习惯写 dnf,老脚本里的 yum 不用急着改。

配置 BIND

编辑主配置文件

用文本编辑器打开 BIND 的主配置文件 /etc/named.conf:

1
vim /etc/named.conf

options 段控制监听与查询权限。默认配置只监听 127.0.0.1、只允许本机查询,要对外服务得改成 any(或指定内网网段):

1
2
3
4
5
6
7
8
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
};

配置正向和反向区域

在 /etc/named.conf 中声明两个区域。正向区域对应 example.com,反向区域是网段倒写加 in-addr.arpa 后缀(192.168.254.x 倒写成 254.168.192):

1
2
3
4
5
6
7
8
9
10
11
zone "example.com" IN {
type master;
file "example.com.zone";
allow-update { none; };
};

zone "254.168.192.in-addr.arpa" IN {
type master;
file "192.168.254.zone";
allow-update { none; };
};

创建区域文件

进入 /var/named 目录,先创建正向区域文件:

1
vim /var/named/example.com.zone

内容如下,A 记录把域名指到 192.168.254.150。注意 SOA 行里的域名末尾那个点不能省——带点表示绝对域名,不带点会被自动拼上区域名,变成 ns1.example.com.example.com:

1
2
3
4
5
6
7
8
9
10
11
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2023101001 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
;
@ IN NS ns1.example.com.
ns1 IN A 192.168.254.150
www IN A 192.168.254.150

再创建反向区域文件:

1
vim /var/named/192.168.254.zone

内容如下,PTR 记录负责把 IP 反查回域名。记录名只写主机位(150),不写完整 IP:

1
2
3
4
5
6
7
8
9
10
11
$TTL 86400
@ IN SOA ns1.example.com. admin.example.com. (
2023101001 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
;
@ IN NS ns1.example.com.
150 IN PTR ns1.example.com.
150 IN PTR www.example.com.

启动前:三道语法检查

BIND 的好处是配置错了不用等运行时发现,启动前有三个检查工具能把问题全部拦住。named-checkconf 查主配置,named-checkzone 查区域文件:

1
2
3
named-checkconf /etc/named.conf
named-checkzone example.com /var/named/example.com.zone
named-checkzone 254.168.192.in-addr.arpa /var/named/192.168.254.zone

验证点:checkconf 无输出且退出码 0;checkzone 输出 loaded serial 2023101001 加 OK。实测三道全过:

配图2

修改区域文件的所属组和用户,否则 named 服务(以 named 用户运行)读不了文件:

1
2
chown root:named /var/named/example.com.zone
chown root:named /var/named/192.168.254.zone

启动服务

物理机或虚拟机上用 systemd 管理服务,首次启动并设置开机自启:

1
systemctl enable named --now

验证点:systemctl status named 显示 active (running)。

容器里没有 systemd,本文以 named 用户直接拉起守护进程实测:

1
named -u named

验证点:/run/named/named.pid 出现且进程存活;dig 能查到记录(见下一节)即为真实证明。

防火墙设置

放行 DNS 流量(53 端口)。firewalld 依赖 systemd,容器内装不上也没法启动,这两条命令是物理机/虚拟机上的标准做法(未在容器实跑):

1
2
firewall-cmd --permanent --add-service=dns
firewall-cmd --reload

验证点:firewall-cmd --list-services 输出包含 dns。

测试解析

测试正向解析

dig 是最直接的验证工具,@127.0.0.1 指定问本机这台 DNS:

1
dig @127.0.0.1 www.example.com A +short

测试反向解析

-x 参数让 dig 自动做 IP 到域名的反查:

1
dig @127.0.0.1 -x 192.168.254.150 +short

验证点:正向返回 192.168.254.150;反向返回 PTR 记录里的两个域名。nslookup 的图形化输出也一并实测了:

配图3

历史版本差异(CentOS 7)

老的 CentOS 7 环境迁移或对照时,注意这几处:

  • 系统生命周期:CentOS 7 已于 2024-06 EOL,官方源下线,yum 报 403 或 No package bind available 时,把 repo 文件里的 mirrorlist 注释掉、baseurl 指到 http://vault.centos.org 再装。
  • 包管理命令:el7 是 yum,el9 是 dnf,包名相同(bind、bind-utils),路径和配置文件位置也完全一致,配置可以原样平移。
  • BIND 版本:el7 装到的是 9.11.4-P2,Rocky 9 实测为 9.16.23-RH,本文用到的语法两版通用。

常见报错

  • named 起不来,journal 报 loading configuration: permission denied:区域文件属组不对,chown root:named 后重启。
  • 服务正常但解析超时:防火墙没放行 53 端口,或 options 里 allow-query 还是默认的 localhost。
  • 解析结果不对(NXDOMAIN):区域文件里域名末尾少了点(被拼成双域名),或 Serial 没改导致从缓存/辅 DNS 拿了旧数据——改区域文件后把 Serial 加一。
  • 反向解析不生效:反向区域名写错。192.168.254.x 的反向区域必须是 254.168.192.in-addr.arpa(前三段倒写),PTR 记录名只写最后一段主机位。

注意事项

  • 改完配置先用 named-checkconf 和 named-checkzone 验证语法,再启动或重启服务,能省掉大部分”服务起不来”的排障时间。
  • 区域文件记得 chown root:named,权限不对时 named 读不到文件,解析会静默失败。
  • 反向区域的名称是网段倒写:192.168.254.x 对应 254.168.192.in-addr.arpa,PTR 记录的名称就是主机位。
  • allow-query { any; } 允许任意来源查询,服务器如果在公网上,需要收窄到实际需要的服务网段——开放递归的 DNS 会被拿去做放大攻击。
  • 排障日志在 /var/log/messages(tail -f /var/log/messages 过滤 named),客户端排查用 dig +trace 看完整解析链路。
  • 回退方案:systemctl disable --now named 下线服务;配置改坏用改前的备份覆盖,或恢复 dist 默认(rpm -V bind 能看出哪些文件被改过)。

从装包到 dig 出正确结果,整个过程二十分钟以内。BIND 的配置文件多,但三道语法检查工具把”配错了要运行时才发现”这件事消灭了——养成 checkconf/checkzone 再启动的习惯,这台 DNS 基本不会给你找麻烦。

本文由作者 2020-2024 年间的 CSDN 博客文章重构而来,原发布于 CSDN。