本教程将引导您完成在 CentOS 7/8/9 上安装 BIND、配置一个主 DNS 服务器、以及测试其是否正常工作的全过程。

第一步:准备工作
在开始之前,请确保您已经:
- 拥有一台 CentOS 服务器:可以是物理机、虚拟机或云服务器。
- 拥有管理员权限:也就是
root权限,或者一个可以使用sudo命令的用户。 - 有一个静态的 IP 地址:这是服务器的固定 IP,
168.1.100。 - 规划好您的域名和区域:您要为
example.lan这个域提供 DNS 解析服务。
第二步:安装 BIND
BIND 在 CentOS 的官方软件仓库中,所以安装非常简单。
-
更新系统软件包 更新您的系统以确保所有软件包都是最新的。
sudo dnf update -y # 对于 CentOS 8/9 # 或者 sudo yum update -y # 对于 CentOS 7
-
安装 BIND 软件包 BIND 的主要软件包是
bind,它包含了 DNS 服务器本身,我们通常还需要安装bind-utils,它包含了像dig和nslookup这样的诊断工具,以及bind-chroot,它可以将 BIND 的文件系统“chroot”到一个安全目录中,这是一个很好的安全实践。
(图片来源网络,侵删)sudo dnf install bind bind-utils bind-chroot -y # 对于 CentOS 8/9 # 或者 sudo yum install bind bind-utils bind-chroot -y # 对于 CentOS 7
-
验证安装 安装完成后,可以检查 BIND 的版本。
named -v
您应该会看到类似
BIND 9.16.x的输出。
第三步:配置 BIND
这是最关键的一步,我们将配置 BIND 为一个主 DNS 服务器,为 example.lan 域提供服务。
-
进入配置目录 如果您安装了
bind-chroot,BIND 的配置文件会被放置在/var/named/chroot/目录下,这是一个更安全的结构,我们将在这个目录下操作。
(图片来源网络,侵删)cd /etc/named/ # 注意:即使安装了chroot,主配置文件通常也在这里
-
编辑主配置文件
named.conf这是 BIND 的全局配置文件。sudo vim named.conf
(或者使用您喜欢的编辑器,如
nano)清空或注释掉文件中的所有内容(除了开头的一些注释),然后添加以下基本配置:
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND DNS server as a // caching only nameserver (as a localhost resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { 127.0.0.1; 192.168.1.100; }; // 监听在本地和服务器IP listen-on-v6 port 53 { ::1; }; // 监听IPv6 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"; secroots-file "/var/named/data/named.secroots"; allow-query { localhost; 192.168.1.0/24; }; // 允许查询的网络范围 /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If you are building a RECURSIVE DNS server, you MUST also enable access to the recursive source address: allow-recursion { localhost; 192.168.1.0/24; }; */ recursion yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; // 在这里添加您的区域 include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";配置解释:
listen-on port 53 { 127.0.0.1; 192.168.1.100; };:指定 DNS 服务器监听的网络接口。0.0.1是本地回环,168.1.100是您服务器的实际 IP 地址。allow-query { localhost; 192.168.1.0/24; };:定义哪些客户端可以向此服务器发起 DNS 查询请求,这里我们允许本地服务器和168.1.0/24网段内的所有机器,您可以根据需要修改。include "/etc/named.rfc1912.zones";:这行会引入一个文件,我们通常把自定义的区域定义放在这个文件里。
-
定义区域 现在我们来创建
example.lan这个域的正向和反向解析区域。编辑
/etc/named.rfc1912.zones文件:sudo vim /etc/named.rfc1912.zones
在文件末尾添加以下内容:
// 正向解析区域: example.lan zone "example.lan" IN { type master; file "example.lan.zone"; allow-update { none; }; }; // 反向解析区域: 1.168.192.in-addr.arpa (对应 192.168.1.x 网段) zone "1.168.192.in-addr.arpa" IN { type master; file "192.168.1.db"; allow-update { none; }; };配置解释:
zone "example.lan":定义一个名为example.lan的区域。type master:指定此 DNS 服务器是该区域的主服务器。file "example.lan.zone":指定存储该区域数据的文件名,这个文件将在/var/named/目录下创建。- 反向区域用于通过 IP 地址查询主机名,其格式是网络地址的反写。
-
创建区域数据文件 我们刚刚在配置文件中引用的两个数据文件。
-
创建正向区域文件
sudo vim /var/named/example.lan.zone
$TTL 86400 @ IN SOA ns1.example.lan. admin.example.lan. ( 2025051501 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL ; Name Server (NS) records IN NS ns1.example.lan. ; A records for hosts in the domain ns1 IN A 192.168.1.100 www IN A 192.168.1.101 ftp IN A 192.168.1.102 ; You can also add a CNAME record (alias) webserver IN CNAME www.example.lan.配置解释:
$TTL:默认的生存时间,单位是秒。SOA:起始授权机构记录,是每个区域最重要的记录。admin.example.lan.是管理员邮箱(用 代替 )。Serial:序列号,每次修改此文件后,必须增加这个数字,否则从服务器不会同步更改。NS:名称服务器记录,指定哪个 DNS 服务器负责此区域。A:地址记录,将主机名映射到 IPv4 地址。CNAME:规范名称记录,为一个主机名创建别名。
-
创建反向区域文件
sudo vim /var/named/192.168.1.db
$TTL 86400 @ IN SOA ns1.example.lan. admin.example.lan. ( 2025051501 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ) ; Minimum TTL ; Name Server (NS) records IN NS ns1.example.lan. ; PTR records for hosts in the 192.168.1.0/24 subnet 100 IN PTR ns1.example.lan. 101 IN PTR www.example.lan. 102 IN PTR ftp.example.lan.配置解释:
PTR:指针记录,用于反向解析,将 IP 地址映射到主机名,注意,这里的100是168.1.100的主机部分。
-
-
设置文件权限 BIND 进程 (
named) 默认以named用户身份运行,它需要能够读取我们创建的区域文件,我们需要确保这些文件的属主是named。sudo chown named:named /var/named/example.lan.zone sudo chown named:named /var/named/192.168.1.db
为了安全,最好将区域文件设置为只有所有者可读写。
sudo chmod 640 /var/named/example.lan.zone sudo chmod 640 /var/named/192.168.1.db
第四步:启动并启用 DNS 服务
-
启动 BIND 服务
sudo systemctl start named
-
设置开机自启
sudo systemctl enable named
-
检查服务状态
sudo systemctl status named
如果看到绿色的
active (running)字样,说明服务已成功启动。
第五步:配置防火墙
CentOS 的防火墙 (firewalld) 默认会阻止 DNS 请求(端口 53),我们需要为它添加规则。
-
永久允许 DNS 服务 (TCP 和 UDP)
sudo firewall-cmd --permanent --add-service=dns
-
重新加载防火墙以应用更改
sudo firewall-cmd --reload
第六步:测试 DNS 服务器
让我们来测试我们的 DNS 服务器是否按预期工作。
-
使用
nslookup进行测试nslookup是一个交互式的 DNS 查询工具。nslookup
然后输入以下命令:
> server 127.0.0.1 # 指定使用我们本地运行的 DNS 服务器 > www.example.lan # 查询正向解析
您应该会看到类似下面的输出,显示
www.example.lan的 IP 地址是168.1.101。Server: 127.0.0.1 Address: 127.0.0.1#53 Name: www.example.lan Address: 192.168.1.101测试反向解析:
> 192.168.1.101 # 查询反向解析
您应该会看到:
Server: 127.0.0.1 Address: 127.0.0.1#53 101.1.168.192.in-addr.arpa name = www.example.lan. -
使用
dig进行测试dig提供了更详细的信息。dig @127.0.0.1 www.example.lan
查看输出中的
ANSWER SECTION,确认 A 记录是否正确。dig @127.0.0.1 -x 192.168.1.101
查看输出中的
ANSWER SECTION,确认 PTR 记录是否正确。 -
配置客户端使用新的 DNS 服务器 要让局域网内的其他计算机使用这个新的 DNS 服务器,您需要将它们的 DNS 设置指向
168.1.100。-
在 CentOS/RHEL 客户端上: 编辑
/etc/resolv.conf文件,将nameserver行的值改为168.1.100。 注意:直接修改此文件在重启网络后会失效,建议使用nmcli或nmtui工具进行永久配置。 -
在 Windows 客户端上: 进入 "网络和 Internet 设置" -> "更改适配器选项" -> 右键点击您的网络连接 -> "属性" -> "Internet 协议版本 4 (TCP/IPv4)" -> "属性",然后选择 "使用下面的 DNS 服务器地址",并填入
168.1.100。
-
第七步:排错
如果测试不通过,请检查以下几点:
- 检查日志:BIND 的日志通常位于
/var/log/messages,使用journalctl -u named -f可以实时查看 BIND 的日志输出,这对于诊断问题非常有帮助。 - 检查语法错误:在重新加载或重启 BIND 服务前,可以使用
named-checkconf检查主配置文件语法,用named-checkzone检查区域文件语法。sudo named-checkconf /etc/named.conf sudo named-checkzone example.lan /var/named/example.lan.zone sudo named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.db
如果有语法错误,命令会给出明确的提示。
- 检查 SELinux:如果开启了 SELinux,它可能会阻止 BIND 访问文件,如果怀疑是 SELinux 导致的问题,可以临时将其设置为宽容模式进行测试:
sudo setenforce 0,如果问题解决,则需要为 BIND 配置正确的 SELinux 策略。
您已经成功地在 CentOS 服务器上安装并配置了一个功能完整的主 DNS 服务器!这个服务器现在可以为您的 example.lan 域提供正向和反向 DNS 解析服务,并且可以被局域网内的其他客户端使用。
您可以基于这个基础,进一步学习配置转发器、日志记录、安全限制等更高级的功能。
