Linux运维:BIND 主从 DNS 服务器完整搭建教程( 手把手从零配置)
为什么要有从 DNS?简单来说:主 DNS 负责写入、管理解析记录;从 DNS 自动同步主服务器数据,充当备用节点。当主服务器故障时,从 DNS 无缝接管解析服务,保障网络不中断。在企业生产环境中,单台 DNS 服务器存在极大的单点故障风险。一旦主 DNS 服务宕机,全网域名解析将会瘫痪,严重影响业务正常运行。为了解决该问题,企业普遍采用主从 DNS 架构,通过区域传送机制实现解析数据同步,从而达
目录
一、前言
很多初学 Linux 的同学,在学习 DNS 时都会疑惑:为什么要有从 DNS?简单来说:主 DNS 负责写入、管理解析记录;从 DNS 自动同步主服务器数据,充当备用节点。当主服务器故障时,从 DNS 无缝接管解析服务,保障网络不中断。
在企业生产环境中,单台 DNS 服务器存在极大的单点故障风险。一旦主 DNS 服务宕机,全网域名解析将会瘫痪,严重影响业务正常运行。为了解决该问题,企业普遍采用主从 DNS 架构,通过区域传送机制实现解析数据同步,从而达到备份冗余、故障切换、分担解析压力的目的。
本文将摒弃晦涩理论,全部实操演示,手把手带你从零搭建主从 DNS,每一条命令、每一行配置都附带详细注释,零基础也能一次成功,非常适合运维新手学习使用。
二、实验环境准备
| 角色 | 主机名 | IP 地址 |
|---|---|---|
| 主 DNS 服务器 | mater | 192.168.176.128 |
| 从 DNS 服务器 | slave | 192.168.176.130 |
| 测试客户端 | client | 192.168.176.129 |
搭建DNS域名解析服务器
- 首先先介绍一下BIND:全称为伯克利域名解析服务器,是由伯克利大学开源的软件。主要用于域名解析 .
2.1 软件安装与依赖处理
dnf install bind -y
这里注意:

因为博主我在安装时出现了图上这个问题,所以在这里给大家说明一下,为保证大家可以不会在安装这个步骤就卡住。图上这个报错原因就是openssl-fips-provider 系列包的文件冲突导致的。
解决方法:使用dnf swap 替换冲突包
dnf swap 是 DNF 提供的「替换安装」功能,可以在安装新包的同时卸载旧的冲突包,一次性解决文件冲突问题,命令如下:
dnf swap openssl-fips-provider-so openssl-fips-provider -y
执行完此命令后会自动完成依赖解析,解析文件冲突,后续重新执行安装命令即可安装成功。
2.2 BIND核心配置文件(必须懂 重要)
1. /etc/named.conf 主配置文件
2. /etc/named.rfc1912.zones 区域声明文件
3. /var/named 目录
这里我将一 一为大家解析我们将在实验中用到的每个配置文件中的主要信息,因为如果不给大家介绍这个你们可能不懂为什么要这么改,这会导致我们可能做了一次无用实验。
1. /etc/named.conf 主配置文件
- 作用:BIND 服务的全局控制中心,定义了 DNS 服务的基础运行规则
10 options {
11 listen-on port 53 { 127.0.0.1; }; # 仅在本机IPv4回环地址监听53端口
12 listen-on-v6 port 53 { ::1; }; # 仅在本机IPv6回环地址监听53端口
13 directory "/var/named"; # 域名解析的数据文件保存位置。
14 dump-file "/var/named/data/cache_dump.db"; # 缓存数据转储文件
15 statistics-file "/var/named/data/named_stats.txt"; # 统计信息
16 memstatistics-file "/var/named/data/named_mem_stats.txt"; # 服务运行的内存分析文件
17 secroots-file "/var/named/data/named.secroots";
18 recursing-file "/var/named/data/named.recursing";
19 allow-query { localhost; }; # 仅允许本机发起DNS查询
recursion yes; # 重要:开启递归查询功能
dnssec-validation yes; # 开启DNSSEC验证
2. /etc/named.rfc1912.zones 区域声明文件
- 作用:域名解析区域的声明清单,你要管理哪些域名 / IP 段的解析,都在这里声明:
# 正向解析的区域声明
23 zone "localhost" IN { ## 声明localhost这个域名的正向解析区域
24 type master/slave; # 区域的类型为 主/从服务器
25 file "named.localhost"; # 区域的数据文件:详细的域名解析内容全部写在这个文件中 /var/named/named.localhost
26 allow-update { none; };# 禁止动态更新记录,当设定主从dns服务的时候,该属性必须屏蔽,否则会导致服务无法正常运行
27 };
28
29 zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
30 type master;
31 file "named.loopback";
32 allow-update { none; };
33 };
34
# 反向域名解析
35 zone "1.0.0.127.in-addr.arpa" IN { #区域ip必须倒着写
36 type master; #区域的类型为 主服务器
37 file "named.loopback"; #/var/named/named.loopback #详细的域名解析内容全部写在这个文件中
38 allow-update { none; }; #当设定主从dns服务时,该属性必须隐藏
39 };
3. /var/named 目录
/var/named 就是 BIND 服务的 “数据仓库”,所有和域名解析相关的配置、数据、缓存都存在这里,是 DNS 服务正常运行的核心目录。
[root@slave ~]# ll /var/named
总用量 16
drwxrwx--- 2 named named 6 1月 28 18:35 data
drwxrwx--- 2 named named 6 1月 28 18:35 dynamic
-rw-r----- 1 root named 2112 1月 28 18:31 named.ca
-rw-r----- 1 root named 152 1月 28 18:31 named.empty
-rw-r----- 1 root named 152 1月 28 18:31 named.localhost
-rw-r----- 1 root named 168 1月 28 18:31 named.loopback
drwxrwx--- 2 named named 6 1月 28 18:35 slaves
| 文件 / 目录 | 作用说明 |
|---|---|
data/ |
存放 BIND 运行时的缓存、统计、SECROOTS 等数据文件 |
dynamic/ |
用于存放支持动态更新的区域数据文件 |
slaves/ |
从服务器同步过来的区域数据文件默认存放目录 |
named.ca |
根域名服务器列表文件,用于公网域名的迭代查询 |
named.empty |
空的区域模板文件,可用于创建新的解析区域 |
named.localhost |
localhost 正向解析的模板文件 |
named.loopback |
127.0.0.1 反向解析的模板文件 |
三、实验要求:
一、DNS正向解析 解决“域名→IP” 的访问问题
二、DNS反向解析 解决 “IP→域名” 的溯源问题
三、DNS主从服务 解决 DNS 服务的可靠性问题,三者结合才能搭建一个完整、可用的企业级 DNS 系统。
四、实验主要配置
实验一 正向解析与验证
1.修改主配置文件
[root@server ~]# vim /etc/named.conf
进入内部配置如下:
options {
11 listen-on port 53 { any; }; #监听本机用的所有IP
12 listen-on-v6 port 53 { ::1; };
13 directory "/var/named";
14 dump-file "/var/named/data/cache_dump.db";
15 statistics-file "/var/named/data/named_stats.txt";
16 memstatistics-file "/var/named/data/named_mem_stats.txt";
17 secroots-file "/var/named/data/named.secroots";
18 recursing-file "/var/named/data/named.recursing";
19 allow-query { any; }; #接收所有客户端请求
# DNS的两种查询模式说明
# 递归查询:客户端向DNS服务器发请求,服务器没数据时,自己去层层查询,最后把结果返回给客户端
# 迭代查询:客户端向DNS服务器发请求,服务器没数据时,把根服务器地址告诉客户端,让客户端自己去查
20 forward only; #这两行是我新加的,强制 BIND 服务器只做转发查询,不做递归查询。
21 forwarders{ 8.8.8.8;}; #本机无解析的域名转发给 8.8.8.8
37 dnssec-validation no; #设置为no 取消验证
2.修改区域声明文件
[root@server ~]# vim /etc/named.rfc1912.zones
#进入内部进行修改
zone "localhost" IN {
24 type master;
25 file "named.localhost";
26 allow-update { none; };
27 };
28
#这里无需删掉上面原本的默认正向解析,在下面加入你要域名解析的就可以了
#我这里是定义的域名为ohh.com
29 zone "ohh.com" IN { # 声明要管理的域名(根域)
30 type master; # 声明为该区域的主DNS服务器
31 file "ohh.com.zone"; # 指定该区域的解析数据文件(需后续在/var/named目录中创建)
32 allow-update { none; }; # 禁止客户端动态更新解析记录,保证数据安全
33 };
3.创建区域数据文件
[root@server ~]# cd /var/named
[root@server named]# cp -a named.localhost ohh.com.zone
[root@server named]# vim ohh.com.zone
#我们先来看原localhost 正向解析的文件:
1 $TTL 1D # 解析记录的默认缓存生存周期,这里设为1天
2 @ IN SOA @ rname.invalid. ( # @ 代表当前区域(你配置的ohh.com);SOA记录是区域的起始授权记录
3 0 ; serial
4 1D ; refresh
5 1H ; retry
6 1W ; expire
7 3H ) ; minimum
8 NS @
9 A 127.0.0.1 # A记录:将当前域名解析到本机IPv4地址127.0.0.1
10 AAAA ::1 # AAAA记录:将当前域名解析到本机IPv6地址::1
~
# @表示当前区域 如localhost 或者 xxx.com xxx.org...
# 第二个@的位置 一般写 域名解析服务器的域名
#以下为修改内容:
1 $TTL 1D
2 @ IN SOA ns.ohh.com. 2432024864.qq.com ( #注意别忘记在区域后加. @也用.表示
3 0 ; serial
4 1D ; refresh
5 1H ; retry
6 1W ; expire
7 3H ) ; minimum
8 NS ns.ohh.com.
9 ns.ohh.com. A 192.168.176.128
10 www.ohh.com. A 192.169.176.129
11 image.ohh.com. A 192.168.176.130
4.完成所有配置后启动或重启named服务
[root@server named]# systemctl restart/enable --now named
5.客户端 将dns指向我们自己的域名解析服务器
[root@client ~]# nmcli connection modify ens160 ipv4.dns 192.168.176.128 这里的IP根据自己的改
[root@client ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
6.验证域名解析是否成功
nslookup 是 Linux/Windows 系统中最常用的 DNS 解析测试工具,全称是 name server lookup,专门用来排查域名解析问题,验证 DNS 服务器是否正常工作。
[root@client ~]# nslookup www.ohh.com
实验成功结果:

实验二 反向解析与验证
可在实验一的基础上继续进行
因实验一已经修改过主配置文件了,所以这里直接进行下面的操作
1.修改区域声明文件
[root@server ~]# vim /etc/named.rfc1912.zones
#进入内部修改如下
41 zone "1.0.0.127.in-addr.arpa" IN {
42 type master;
43 file "named.loopback";
44 allow-update { none; };
45 };
46
47
#这个也是一样可以直接在默认反向解析下加
#这是我新增的192.168.176.0网段反向解析区域声明
48 zone "176.168.192.in-addr.arpa" IN { #注意这里一定是倒序写,并加上.in-addr.arpa
49 type master;
50 file "176.168.192.arpa"; # 指定反向解析数据文件,需在/var/named目录创建
51 allow-update { none; }; # 禁止客户端动态更新记录
52 };
2.创建区域数据文件
[root@server ~]# cd /var/named
[root@server named]# cp -a named.loopback 176.168.192.arpa
[root@server named]# vim 176.168.192.arpa
1 $TTL 1D
2 @ IN SOA ns.ohh.comm. 2432024864.qq.com. (
3 0 ; serial
4 1D ; refresh
5 1H ; retry
6 1W ; expire
7 3H ) ; minimum
8 NS ns.ohh.com.
9 ns A 192.168.176.128
10 131 PTR ns.ohh.com.
11 129 PTR www.ohh.com. # PTR记录:把IP 192.168.176.129反向解析为www.ohh.com
12 130 PTR music.ohh.com.
~
注意:大家在写域名时一定不要忘记后面跟个"."。
3.重启namd服务
[root@server named]# systemctl restart/enable named
4.验证域名解析是否成功

实验三 主从DNS与验证
在做这个实验时好消息是我们已经做了正向与反向解析配置,由于基础解析服务已验证成功可用,本实验只需在这两个基础上补充主从同步相关配置,即可实现DNS服务的冗余备份与故障转移能力。
1.配置从服务
1.1 修改主配置文件
[root@slave ~]# vim /etc/named.conf
#修改让从服务器监听所有的ip 让从服务器允许所有客户端访问
10 options {
11 listen-on port 53 { any; };
12 listen-on-v6 port 53 { ::1; };
13 directory "/var/named";
14 dump-file "/var/named/data/cache_dump.db";
15 statistics-file "/var/named/data/named_stats.txt";
16 memstatistics-file "/var/named/data/named_mem_stats.txt";
17 secroots-file "/var/named/data/named.secroots";
18 recursing-file "/var/named/data/named.recursing";
19 allow-query { any; };
1.2 修改区域声明文件
[root@slave ~]# vim /etc/named.rfc1912.zones
29 zone "ohh.com" IN {
30 type slave; # 声明为从区域,数据从主服务器同步
31 masters {192.168.176.128;}; # 指定主DNS服务器的IP地址
32 file "slaves/ohh.com.zone"; # 同步的区域文件存储路径(BIND专用slaves目录)
33 allow-update { none; }; ## 删掉 allow-update 这一行!
34 };
48 zone "176.168.192.in-addr.arpa" IN {
49 type slave;
50 masters {192.168.176.128;};
51 file "slaves/176.168.192.arpa";
52 allow-update { none; }; ## 删掉 allow-update 这一行!
53 };
注意:在 type slave; 的从服务器区域声明里,不能写 allow-update { none; }; 这个配置,BIND 不允许从区域使用这个选项,导致配置文件语法校验失败,服务无法启动。
2.修改主服务
[root@server named]# vim /etc/named.rfc1912.zones
29 zone "ohh.com" IN {
30 type master;
31 file "ohh.com.zone";
32 allow-update { none; };
33 allow-transfer {192.168.176.130;}; #新加允许转发给从服务器
34 };
49 zone "176.168.192.in-addr.arpa" IN {
50 type master;
51 file "176.168.192.arpa";
52 allow-update { none; };
53 allow-transfer {192.168.176.130;};
54
55 };
3.重启named服务
[root@server named]# systemctl restart named
[root@slave ~]# systemctl restart named
4.直接测试解析功能是否成功
客户端上操作:
1.正向解析:

2.反向解析:

3.最终测试:断开主服务器,验证从服务器可用性:
- 先关闭主服务器:
[root@server named]# systemctl stop named
- 在客户端上,依然使用从服务器IP解析域名:

五、总结与经验
写到这里,相信大家对 DNS 服务以及主从架构已经有了完整且清晰的认识。很多初学者初学 DNS 时,只会机械复制配置,却不懂每一行代码的意义。因此本文从安装报错处理、配置文件详解,到正向反向解析、主从同步搭建,全程通俗易懂、尽量弱化晦涩理论,让每一位读者都能看懂、跟做、成功复现。
在企业网络中,DNS 是最基础、却最不能崩的服务。主从架构看似简单,实则是生产环境最基础的高可用保障。主服务器负责管理数据,从服务器负责冗余备份,避免单点故障,这也是企业必须部署从 DNS 的根本原因。
希望本篇实操教程能够帮助正在学习 Linux 运维的你,彻底吃透 DNS 原理,避开新手常见坑。不用死记命令,真正理解配置,以后无论面试还是实操,都能轻松拿捏 DNS 服务。如果本文对你有帮助,欢迎收藏、点赞,我后续也会持续更新更多高质量运维实操教程。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)