RHELDNS的结构

  1. 配置文件/etc/named.conf是主配置文件,包含全局配置,它要解决的问题是:
    • 我是不是DNS服务器。
    • 我是不是权威的/本地的/中继型的。
    • 我能解析那些域名。
    • 受到请求后按什么规则走流程。
  2. 配置文件 /etc/named.rfc1912.zones 是区域配置文件。
    • 是主配置文件的补充,主要用来配置DNS服务器可以管理那些区域。
    • 如何进行zone的区域配置。 [[#4.1 /etc/named.rfc1912.zones]]
  3. 目录/var/named/下的文件,就是域名解析文件,这些文件的功能是将域名->IPIP->域名
    • 在这个目录下的文件,与zone配置中的file制定的文件名一一对应。

配置文件/etc/named.conf

/etc/named.confDNS服务器在域名解析体系中,
用来声明自身角色、解析范围和处理规则的配置文件。

/etc/named.conf 配置文件结构分析

options {
        listen-on port 53 { 192.168.122.7; };
        listen-on-v6 port 53 { ::1; };
        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";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { any; };
        allow-recursion { 192.168.122.0/24; };//需要将recursion 设置为yes才能生效。
        forwarders {
	        8.8.8.8;
	        114.114.114.114;
	    };//如果本DNS查询不到,不直接去查根服务器,而是通过forwarders内的DNS主机进行递归。

        /* 
         - 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 your recursive DNS server has a public IP address, you MUST enable access 
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification 
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface 
        */
        recursion yes;

        dnssec-validation no;

        managed-keys-directory "/var/named/dynamic";
        geoip-directory "/usr/share/GeoIP";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";

        /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
        include "/etc/crypto-policies/back-ends/bind.config";
};

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";


你这份配置基本就是:一台 RHEL 上的 named 既能做递归缓存解析器,也能加载权威区文件(取决于你后面 zone 怎么配)。


1) options { ... }; —— DNS 服务器的“全局规则开关”

这块决定:DNS 客户端把查询发来后,服务器怎么接、怎么处理、怎么存数据

1.1 入口:监听在哪个 IP:53 上接收请求
listen-on port 53 { 192.168.122.7; };
listen-on-v6 port 53 { ::1; };
  • IPv4:只在 192.168.122.7:53 监听
    → 只有发往这个 IP 的 DNS 请求才会进到 named(你前面说的“查询机制入口”)

  • IPv6:只在 ::1:53(本机回环)监听
    → 其他机器 不能通过 IPv6 找它解析,只能本机用 IPv6 找它

📌 这是“DNS 客户端DNS 服务器”这一步的入口控制。不监听就进不来,后面的授权判断、缓存都不会发生。


1.2 数据/工作目录:named 从哪里读写“域名-IP 映射数据”
directory "/var/named";
  • 这是 named 的工作目录

  • 后面你看到的很多相对路径文件(比如 named.cadata/...)都会以这里为基准

📌 对你的体系来说:DNS 服务器要存“映射表”(区域数据、缓存、统计等),这里就是它的“仓库位置”。


1.3 调试/统计/安全相关文件(运维用)
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";
recursing-file  "/var/named/data/named.recursing";

这些文件主要是运维观察用的:

  • cache_dump.db:缓存 dump(把缓存内容导出来,便于排查)

  • named_stats.txt:统计信息

  • named_mem_stats.txt:内存统计

  • named.secroots:跟 DNSSEC 信任锚/安全根相关

  • named.recursing:记录递归相关状态(排错时有用)

📌 它们不直接改变“解析逻辑”,但让你能看见服务器在干什么。


1.4 谁可以来问我,我可以帮谁:查询权限
allow-query { any; };
  • 表示:任何来源的 DNS 客户端都允许查询

  • 但注意:它只管“你能不能问”,不等于“我一定帮你递归查到底”(那是 recursion

📌 对你的流程:这是“DNS 服务器收到查询后,是否允许给响应”的权限门槛。

⚠️ 运维提醒:如果服务器能被公网访问,allow-query any 很危险(容易被滥用)。

allow-recursion { 192.168.122.0/24; };

含义拆开看:

  • allow-recursion
    👉 控制“递归查询”的权限

  • { 192.168.122.0/24; }
    👉 只允许这个网段的客户端

它和 allow-query 的本质区别(非常重要)

很多人会混这两个,我给你直接对照。

配置项 控制什么 作用阶段
allow-query 能不能问我问题 请求入口
allow-recursion 我是否替你继续查 递归阶段

1.5 是否启用递归缓存解析(你给的“动态解析”核心)
recursion yes;

这句非常关键,直接决定这台服务器扮演什么 DNS 角色:

  • recursion yes:它可以作为本地域名服务器/递归缓存 DNS
    → 当请求的域名不在自己授权管理的子域,它会按层级继续去问(根 → 顶级 → 权威),并把结果缓存起来(你复习里写的那套)

  • 如果你要做纯权威 DNS,一般会关掉递归(你注释里也写了);这意味着,如果客户端有请求要做不再本DNS服务器范围内的DNS解析,本DNS服务器也不会代客户端向别的地方去问客户端请求的域名的IP

📌 对你的流程:这句决定了“不在授权域范围 → 上交上一级 DNS”这个行为是否发生。

⚠️ 重点:递归 + 公开可访问 + 缺少访问控制 = 容易被当“开放递归”,引发放大攻击(注释里说的就是这个)。


1.6 DNSSEC 校验开关
dnssec-validation no;
  • 意思是:不对 DNSSEC 做验证

  • 简单理解:解析结果不做“签名真伪校验”

📌 这不影响“能不能解析”,但影响“解析结果是否被验证过更可信”。

(你给的知识里没展开 DNSSEC,我这里就只按配置含义点到为止。)


1.7 动态密钥/GeoIP/运行时文件
managed-keys-directory "/var/named/dynamic";
geoip-directory "/usr/share/GeoIP";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
  • managed-keys-directory:DNSSEC 相关动态密钥存放目录

  • geoip-directory:GeoIP 数据目录(用于基于地理位置的响应策略时会用到)

  • pid-file:记录 named 进程号(运维管理用)

  • session-keyfile:会话密钥文件(rndc 等控制相关)


1.8 加密策略包含(RHEL/Fedora 的系统加密策略)
include "/etc/crypto-policies/back-ends/bind.config";
  • 让 BIND 使用系统的 crypto policy(比如禁用弱算法、限制 TLS/加密套件等)

  • 属于“系统级安全策略对 DNS 服务的约束”

1.9 forwarder { 公网DNS; }; 这是做什么的?

一句话先给结论(一定要记住)

forwarders 用来指定:
当本机 DNS 没有答案时,把查询“转交给谁去查”。

更直白一点:

不让这台 DNS 自己去问根服务器,
而是“统一转发”给你指定的上游 DNS(通常是公网 DNS)。


2) logging { ... }; —— 日志怎么记

logging {
  channel default_debug {
    file "data/named.run";
    severity dynamic;
  };
};
  • 定义一个日志通道 default_debug

  • 写到 data/name每个区域配置,都对应一个/var/named/下的文件d.run(相对路径 → 实际在 /var/named/data/named.run

  • severity dynamic:日志级别可动态调整

📌 运维意义:DNS 出问题(解析慢、拒绝、SERVFAIL)时,日志是第一手证据。


3) zone "." IN { type hint; file "named.ca"; }; —— 根提示区(告诉我“根服务器在哪”)

zone "." IN {
  type hint;
  file "named.ca";
};

这段对应你复习里的“根 DNS 服务器”。

  • zone ".":点号 . 代表 DNS 根域

  • type hint:这不是权威数据,而是“提示信息” ,换句话说,如果要做递归,就根据这个配置找到根域;

  • file "named.ca":根服务器列表文件(root hints)

📌 作用一句话:

为了做递归查询(recursion yes),本机需要知道先去问哪些根 DNS。
这段就是给它这个“起点”。


4) include ... —— 引入其他 zone 配置/安全根

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
4.1 /etc/named.rfc1912.zones
  • 里面通常放了一堆“示例/常用基础 zone”,比如:

    • localhost 正向/反向

    • 127.in-addr.arpa 这类本地反向

    • 以及一些默认区模板

📌 对你那套概念:这是在补充“DNS 服务器自己被授权管理的一些区域(zone)”。我们同时可以在这里添加区域来配置DNS管理的区域.

4.1.1/etc/named.rfc1912.zones区域基本配置方法

正向解析: 域名 --> IP
反向解析: IP --> 域名
反向解析时,将IP地址反过来写让后在最后拼接上.in-addr.arpa 就可以了。
allow-update {};用来标识DDNS的位置,none表示不使用DDNS。什么是DDNS.

//反向解析
zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};
//正向解析
zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};
4.1.2 /etc/named.rfc1912.zones扩展配置方法

zone " " IN {...} 全部写在view中。

view "LAN" {
	match-clients { 192.168.122.0/24; };
	zone "xwang.com" IN {
		type master;
		file "xwang.zone";
	};
	zone "." IN {
		type hint;
		file "named.ca";
	};
};
view "WAN" {
	match-clients { 172.168.122.0/24; };
	zone "xwang.com" IN {
		type master;
		file "_xwang.zone";
	};
	zone "." IN {
		type hint;
		file "named.ca";
	};
};

这种写法的作用在于DNS服务器不再是简单的实现 域名->IPIP->域名 而是在这个的前提上根据DNS客户端的IP在那个网段,来指定不同的解析文件,从而实现:

根据DNS客户端IP,对同一个 域名的解析请求做出不同的解析结果。这个技术叫做分离解析,常用在内外网分离上,来隔离内网用户与外网用户对服务器的宽带需求。

注意 :如果采用view的写法,就需要将所有的 zone " " IN {...}配置都写view中,这也包括named.conf中的zone " " IN {...},这是因为每个view对象都相当于基础配置中的named.rfc1912.zones.

4.2 /etc/named.root.key
  • 根的信任锚(DNSSEC 相关)

  • 但你这里 dnssec-validation no,它基本不会发挥“验证”作用(但文件仍可能被保留)


把整份配置用“你那套 DNS 流程”串起来(你会更稳)

你这份 named.conf 的整体含义可以这样归纳:

  1. DNS 客户端把查询发到 192.168.122.7:53(listen-on)

  2. 服务器允许任何人查询(allow-query any)

  3. 服务器启用递归(recursion yes)

    • 若查询不在本机权威区:
      → 根据 root hints(named.ca)从根开始一路问到权威
      → 得到结果后缓存(你复习里说的“本地缓存”逻辑,在递归 DNS 里也存在)
  4. 日志写在 /var/named/data/named.run,方便排错

  5. 还会加载一组默认 zone 配置(rfc1912.zones)


最后给你一个“运维必检点”(不扩展知识,只对应你注释)

配置里 recursion yes + allow-query any
如果这台机器对“非可信网段”可达(尤其是公网),就有风险。


/var/named/下的域名解析文件

1)区域文件里到底写的是什么?

区域文件本质就是你说的那张“域名 ↔ IP 的映射表”,只不过它用 DNS 规定的“记录(Record)”来描述。

你必须先记住 4 个最核心的记录类型:

SOA 记录(必须有,1 条)

Start Of Authority:声明“这个 zone 的权威信息”和一些控制参数。
每个 zone 文件必须有且只有 1 条 SOA

它大概表达:

  • 这个 zone 的主权威 DNS 是谁

  • 管理员邮箱(写法里用点代替 @)

  • 序列号 serial(从属服务器同步、缓存更新靠它)

  • 刷新/重试/过期/否定缓存时间等

DNS 配置(包括 SOATTL 等字段)支持的时间单位简写及换算关系如下:

一张“你以后填 SOA 的速查表”
字段 你根据什么决定 意义
主 DNS 这台 zonemaster 是谁 指出这个域的权威服务器
管理员邮箱 负责 DNS 的人/组 联系这个域的负责人
serial 有没有改 zone 从服务器根据这个序列号更新
refresh 你多久可能改一次 1H 多久刷新一次
retry 比 refresh 短 15M 失败后多久再试
expire 能忍多久不同步 1W 多久不同步时,删除这个域
minimum 多久缓存“查不到” 向下看
serial的格式是:YYYYMMDDnn 其中YYYYMMDD表示的是时间nn表示的是第几次修改。serial就根据这个进行填写。
minimum 的意义是客户端查询“不存在的记录”时,缓存这个“失败结果”多久

SOA记录中,单位对应表。

单位简写 含义 换算成秒
s 1s = 1 秒
m 分钟 1m = 60 秒
h 小时 1h = 3600 秒
d 1d = 86400 秒
w 1w = 604800 秒

如果不写单位,默认单位是

✅ NS 记录(必须有,至少 1 条)

Name Server:声明“这个 zone 的权威 DNS 服务器有哪些”。

一句话:谁负责回答这个区域?
至少要 1 条,生产一般多条(冗余)。

✅ A 记录(正向核心)

A:域名 → IPv4 地址
例:www.example.com -> 192.168.122.10

(IPv6 用 AAAA,你现在先不急。)

✅ PTR 记录(反向核心)

PTR:IP → 域名
例:192.168.122.10 -> www.example.com

5️⃣ CNAME(别名记录)🔥

作用

一个域名,指向另一个域名

示例

ftp IN CNAME www

含义:

ftp.example.com → www.example.com → IP

使用场景
  • 多个名字指向同一台主机

  • 改 IP 只用改一条 A 记录

⚠️ 规则:
CNAME 不能和 A/NS 等其他记录共存于同一名字

6️⃣ MX(邮件交换记录)🔥

作用

指定“这个域名的邮件服务器是谁”

示例

@ IN MX 10 mail.example.com. mail IN A 192.168.122.20

含义
  • 所有发往 @example.com 的邮件

  • 交给 mail.example.com

  • 10 是优先级(越小越高)

2)写区域文件前,你先掌握 3 个语法规则(很关键)

规则 1:$TTL

$TTL 1D

表示默认缓存时间(TTL),不写也能跑,但建议写。

规则 2:@ 的含义

@ 代表“当前 zone 的根”。
比如 zone 是 example.com,那么 @ 就是 example.com.

规则 3:域名末尾的 “点”

  • example.com.(带点)表示绝对域名(FQDN)

  • www(不带点)表示相对名,会自动补成 www.example.com.

建议:NS 目标、SOA 里的主机名都写成带点的绝对域名,少踩坑。


3)正向区域文件怎么写(模板 + 示例)

假设你在 named.conf 里这样声明了正向 zone:

zone "example.com" IN {
    type master;
    file "example.com.zone";
    allow-update { none; };
};

那你就创建文件:

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

内容(你可以直接照抄改成自己的):

$TTL 1D
@   IN  SOA ns1.example.com. admin.example.com. (
        2026012401 ; serial(YYYYMMDDnn)
        1H         ; refresh
        15M        ; retry
        1W         ; expire
        1D )       ; minimum(否定缓存时间)

    IN  NS  ns1.example.com.

; 如果你的 NS 主机就在本 zone 内,必须给它 A 记录
ns1 IN  A   192.168.122.7

; 常见主机记录(域名 -> IP)
@   IN  A   192.168.122.10      ; example.com -> 192.168.122.10
www IN  A   192.168.122.10      ; www.example.com -> 192.168.122.10

你要会读这份文件(对应你的 DNS 理论)

  • SOA/NS:说明“我是 example.com 的权威区域,权威服务器是谁”

  • A:说明“域名到 IP 的映射表”


4)反向区域文件怎么写(模板 + 示例)

假设你要给网段 192.168.122.0/24 做反向解析,zone 名称是:

122.168.192.in-addr.arpa

(把前三段倒过来)

named.conf 里声明:

zone "122.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.122.rev";
    allow-update { none; };
};

创建文件:

sudo vim /var/named/192.168.122.rev

内容(照抄模板):

$TTL 1D
@   IN  SOA ns1.example.com. admin.example.com. (
        2026012401
        1H
        15M
        1W
        1D )

    IN  NS  ns1.example.com.

; PTR:只写“最后一段”
10  IN  PTR www.example.com.
7   IN  PTR ns1.example.com.

重点解释(你最容易糊)

在反向 zone 里:

  • zone 已经是 122.168.192.in-addr.arpa

  • 所以 10 实际表示:10.122.168.192.in-addr.arpa

  • 它对应的 IP 就是:192.168.122.10


5)你现在就能写的“最小可用清单”

正向 zone 文件最少要:

  • 1 条 SOA

  • ≥1 条 NS

  • 给 NS 主机配 A

  • 给你要解析的主机配 A

反向 zone 文件最少要:

  • 1 条 SOA

  • ≥1 条 NS

  • PTR 若干条


6)写完怎么验证(RHEL 运维必做)

① 检查 named.conf 语法

sudo named-checkconf

② 检查 zone 文件语法

sudo named-checkzone example.com /var/named/example.com.zone
sudo named-checkzone 122.168.192.in-addr.arpa /var/named/192.168.122.rev

③ 重载服务

sudo systemctl reload named

④ 客户端验证(用 dig)

dig @192.168.122.7 www.example.com A
dig @192.168.122.7 -x 192.168.122.10



DNS案例:

1. 正反向解析

至少需要两台主机。按下面的要求进行配置

主机 角色 系统 IP
client 客户端 redhat 9.3 192.168.122.18
server 域名解析服务器 redhat 9.3 192.168.122.7

1.1 配置服务端

1)修改主机名和IP地址

[root@localhost ~]# hostnamectl hostname server

[root@server ~]# nmcli c m ens160 ipv4.addresses 192.168.72.18/24
[root@server ~]# nmcli c up ens160 

2)安装软件

[root@server ~]# dnf install bind -y

# 软件的配置文件
[root@server ~]# rpm -qc bind
/etc/logrotate.d/named
/etc/named.conf
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback

3)修改主配置文件
[[RHEL中DNS的结构]]

[root@server ~]# vim /etc/named.conf
[root@server ~]# cat /etc/named.conf 
options {
	listen-on port 53 { 192.168.72.18; };	// 将监听的IP修改为本机的IP地址
	listen-on-v6 port 53 { ::1; };
	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";
	recursing-file	"/var/named/data/named.recursing";
	allow-query     { any; };	//修改为any表示任何主机都可以查询

	recursion yes;

	dnssec-validation no;	// 将值改为 no,关闭外网校验

	managed-keys-directory "/var/named/dynamic";
	geoip-directory "/usr/share/GeoIP";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";

	include "/etc/crypto-policies/back-ends/bind.config";
};

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";

4)修改区域配置文件

[root@server ~]# vim /etc/named.rfc1912.zones
// 正向解析
zone "xwang.com" IN {	// 正解解析的域名
        type master;	// 表示主服务
        file "xwang.zone";	// 正向解析区域数据文件的路径
        allow-update { none; };	// 不允许动态更新
};
// 反向解析
zone "122.168.192.in-addr.arpa" IN {	// 反向解析的IP
        type master;
        file "zone.xwang";	// 反向解析区域数据文件
        allow-update { none; }; 
};

5)创建正向解析区域和反向解析区域数据文件

这里要注意被创建文件的权限列表,要修改成DNS服务的服务用户。

[[RHEL中DNS的结构]]

[root@server ~]# cd /var/named/

[root@server named]# ls
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves

# 复制正向解析的模板
[root@server named]# cp -a named.localhost xwang.zone
[root@server named]# cp -a named.localhost zone.xwang
[root@server named]# cat xwang.zone 
$TTL 1D
@ IN SOA ns.xwang.com. admin.xwang.com. (
			2025012401
			1H
			15M
			1W
			1D
	)
       IN NS      ns.xwang.com.
ns     IN A       192.168.122.7
       IN A       192.168.122.7
www    IN A       192.168.122.7
xiake  IN CNAME   www
       IN MX      mail.xwang.com. 
mail   IN A       192.168.122.10
[root@server named]# cat zone.xwang 
$TTL 1D

@  IN   SOA ns.xwang.com. admin.xwnag.com. (
			2026012401
			1H
			15M
			1W
			1D
		)

   IN NS ns.xwang.com.
7  IN PTR ns.xwang.com.



6)校验配置文件的语法(可选)

# 1. 校验主配置文件
[root@server named]# named-checkconf 
[root@server named]# 

# 2. 校验区域数据文件
[root@server named]# named-checkzone xwang.com. /var/named/xwang.zone
zone example.com/IN: loaded serial 2025110501
OK

8)启动DNS服务

[root@server named]# systemctl start named
[root@server named]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
     Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; preset: disabled)
     Active: active (running) since Wed 2025-11-05 15:57:47 CST; 5s ago
    Process: 1778 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else>
    Process: 1782 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 1783 (named)
      Tasks: 8 (limit: 12067)
     Memory: 20.6M
        CPU: 72ms
     CGroup: /system.slice/named.service
             └─1783 /usr/sbin/named -u named -c /etc/named.conf

Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:500:2f::f#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './DNSKEY/IN': 2001:503:ba3e::2:30#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:503:ba3e::2:30#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './DNSKEY/IN': 2001:7fd::1#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:7fd::1#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './DNSKEY/IN': 2001:dc3::35#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:dc3::35#53
Nov 05 15:57:48 server named[1783]: resolver priming query complete
Nov 05 15:57:49 server named[1783]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY ID 20326 is now t>
Nov 05 15:57:49 server named[1783]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY ID 38696 is now t>

9)防火墙放行服务

[root@server named]# firewall-cmd --permanent --add-service=dns
success
[root@server named]# firewall-cmd --reload 
success

1.2 配置客户端

1)修改主机名和IP地址

[root@localhost ~]# hostnamectl hostname client

[root@client ~]# nmcli c m ens160 ipv4.addresses 192.168.72.7/24 ipv4.dns 192.168.72.18
[root@client ~]# nmcli c up ens160 

2)安装验证工具

[root@client ~]# dnf install bind-utils -y

3)验证DNS解析

# 1. 验证NS记录解析
[root@client ~]# dig -t ns example.com @192.168.72.18

; <<>> DiG 9.16.23-RH <<>> -t ns example.com @192.168.72.18
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21274
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: ad3da14d3544cd0401000000690b049569812617735987d9 (good)
;; QUESTION SECTION:
;example.com.			IN	NS

;; ANSWER SECTION:
example.com.		86400	IN	NS	ns.example.com.

;; ADDITIONAL SECTION:
ns.example.com.		86400	IN	A	192.168.72.18

;; Query time: 0 msec
;; SERVER: 192.168.72.18#53(192.168.72.18)
;; WHEN: Wed Nov 05 16:02:29 CST 2025
;; MSG SIZE  rcvd: 101


# 2. 验证A记录解析
[root@client ~]# host -t A www.example.com 192.168.72.18
Using domain server:
Name: 192.168.72.18
Address: 192.168.72.18#53
Aliases: 

www.example.com has address 192.179.82.8
# 或者
[root@client ~]# dig -t a www.example.com @192.168.72.18

; <<>> DiG 9.16.23-RH <<>> -t a www.example.com @192.168.72.18
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63270
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 35f6c7807e26999601000000690b0522acd6fb06cb2839f8 (good)
;; QUESTION SECTION:
;www.example.com.		IN	A

;; ANSWER SECTION:
www.example.com.	86400	IN	A	192.179.82.8

;; Query time: 0 msec
;; SERVER: 192.168.72.18#53(192.168.72.18)
;; WHEN: Wed Nov 05 16:04:50 CST 2025
;; MSG SIZE  rcvd: 88


# 3. 使用nslookup 来验证
[root@client ~]# nslookup www.example.com
Server:		192.168.72.18
Address:	192.168.72.18#53

Name:	www.example.com
Address: 192.179.82.8

# 交互式
[root@client ~]# nslookup 
> server 192.168.72.18 
Default server: 192.168.72.18
Address: 192.168.72.18#53
> set q=A
> www.example.com
Server:		192.168.72.18
Address:	192.168.72.18#53

Name:	www.example.com
Address: 192.179.82.8
> 

扩展 :怎么在不使用dig工具的情况下,验证DNS服务器。

  • 一台主机可以同时配置多台DNS服务器的主机IP
  • 使用nmcli命令,并结合引号同时配置多台DNS服务器。
[root@client ~]# nmcli connection modify enp1s0 ipv4.dns "192.168.122.7 192.168.122.1"
[root@client ~]# nmcli connection down enp1s0 

让后使用ping命令就可以测试如果ping通了就说明DNS服务器是正常的。

[root@client ~]# ping xiake.xwang.com
PING www.xwang.com (192.168.122.7) 56(84) 比特的数据。
64 比特,来自 ns.xwang.com (192.168.122.7): icmp_seq=1 ttl=64 时间=0.223 毫秒
64 比特,来自 ns.xwang.com (192.168.122.7): icmp_seq=2 ttl=64 时间=0.657 毫秒
64 比特,来自 ns.xwang.com (192.168.122.7): icmp_seq=3 ttl=64 时间=0.455 毫秒
64 比特,来自 ns.xwang.com (192.168.122.7): icmp_seq=4 ttl=64 时间=0.628 毫秒

2. 高速缓存

[[RHEL中DNS的结构]]

案例介绍

高速缓存,就是在DNS服务器和DNS客户端之间,创建一个DNS缓存服务器,
它并不是一个真正的DNS服务器,不负责域名解析服务,唯一的作用就是帮DNS客户端询问可以做DNS解析DNS服务器,并将数据返回给DNS客户端;同时将解析的结果缓存到本地,当DNS客户端再次访问这个域名时,DNS缓存服务器就会直接将缓存在本地的记录直接返回给DNS客户端

主机 角色 系统 IP
client 客户端 redhat9.6 192.168.72.7
server 域名解析服务器 redhat9.6 192.168.72.18
cache 域名解析缓存服务器 redhat9.6 192.168.72.48

1.1 配置服务端

1)修改主机名和IP地址

[root@localhost ~]# hostnamectl hostname server

[root@server ~]# nmcli c m ens160 ipv4.addresses 192.168.72.18/24
[root@server ~]# nmcli c up ens160 

2)安装软件

[root@server ~]# dnf install bind -y

# 软件的配置文件
[root@server ~]# rpm -qc bind
/etc/logrotate.d/named
/etc/named.conf
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback

3)修改主配置文件
[[RHEL中DNS的结构]]

[root@server ~]# vim /etc/named.conf
[root@server ~]# cat /etc/named.conf 
options {
	listen-on port 53 { 192.168.72.18; };	// 将监听的IP修改为本机的IP地址
	listen-on-v6 port 53 { ::1; };
	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";
	recursing-file	"/var/named/data/named.recursing";
	allow-query     { any; };	//修改为any表示任何主机都可以查询

	recursion yes;

	dnssec-validation no;	// 将值改为 no,关闭外网校验

	managed-keys-directory "/var/named/dynamic";
	geoip-directory "/usr/share/GeoIP";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";

	include "/etc/crypto-policies/back-ends/bind.config";
};

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";

4)修改区域配置文件

[root@server ~]# vim /etc/named.rfc1912.zones
// 正向解析
zone "xwang.com" IN {	// 正解解析的域名
        type master;	// 表示主服务
        file "xwang.zone";	// 正向解析区域数据文件的路径
        allow-update { none; };	// 不允许动态更新
};
// 反向解析
zone "122.168.192.in-addr.arpa" IN {	// 反向解析的IP
        type master;
        file "zone.xwang";	// 反向解析区域数据文件
        allow-update { none; }; 
};

5)创建正向解析区域和反向解析区域数据文件

这里要注意被创建文件的权限列表,要修改成DNS服务的服务用户。

[[RHEL中DNS的结构]]

[root@server ~]# cd /var/named/

[root@server named]# ls
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves

# 复制正向解析的模板
[root@server named]# cp -a named.localhost xwang.zone
[root@server named]# cp -a named.localhost zone.xwang
[root@server named]# cat xwang.zone 
$TTL 1D
@ IN SOA ns.xwang.com. admin.xwang.com. (
			2025012401
			1H
			15M
			1W
			1D
	)
       IN NS      ns.xwang.com.
ns     IN A       192.168.122.7
       IN A       192.168.122.7
www    IN A       192.168.122.7
xiake  IN CNAME   www
       IN MX      mail.xwang.com. 
mail   IN A       192.168.122.10
[root@server named]# cat zone.xwang 
$TTL 1D

@  IN   SOA ns.xwang.com. admin.xwnag.com. (
			2026012401
			1H
			15M
			1W
			1D
		)

   IN NS ns.xwang.com.
7  IN PTR ns.xwang.com.



6)校验配置文件的语法(可选)

# 1. 校验主配置文件
[root@server named]# named-checkconf 
[root@server named]# 

# 2. 校验区域数据文件
[root@server named]# named-checkzone xwang.com. /var/named/xwang.zone
zone example.com/IN: loaded serial 2025110501
OK

8)启动DNS服务

[root@server named]# systemctl start named
[root@server named]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
     Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; preset: disabled)
     Active: active (running) since Wed 2025-11-05 15:57:47 CST; 5s ago
    Process: 1778 ExecStartPre=/bin/bash -c if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else>
    Process: 1782 ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS (code=exited, status=0/SUCCESS)
   Main PID: 1783 (named)
      Tasks: 8 (limit: 12067)
     Memory: 20.6M
        CPU: 72ms
     CGroup: /system.slice/named.service
             └─1783 /usr/sbin/named -u named -c /etc/named.conf

Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:500:2f::f#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './DNSKEY/IN': 2001:503:ba3e::2:30#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:503:ba3e::2:30#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './DNSKEY/IN': 2001:7fd::1#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:7fd::1#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './DNSKEY/IN': 2001:dc3::35#53
Nov 05 15:57:47 server named[1783]: network unreachable resolving './NS/IN': 2001:dc3::35#53
Nov 05 15:57:48 server named[1783]: resolver priming query complete
Nov 05 15:57:49 server named[1783]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY ID 20326 is now t>
Nov 05 15:57:49 server named[1783]: managed-keys-zone: Initializing automatic trust anchor management for zone '.'; DNSKEY ID 38696 is now t>

9)防火墙放行服务

[root@server named]# firewall-cmd --permanent --add-service=dns
success
[root@server named]# firewall-cmd --reload 
success

1.2 配置客户端

1)修改主机名和IP地址

[root@localhost ~]# hostnamectl hostname client

[root@client ~]# nmcli c m ens160 ipv4.addresses 192.168.72.7/24 ipv4.dns 192.168.72.18
[root@client ~]# nmcli c up ens160 

2)安装验证工具

[root@client ~]# dnf install bind-utils -y

3)验证DNS解析

# 1. 验证NS记录解析
[root@cache ~]# dig @192.168.122.7 ns.xwang.com NS

; <<>> DiG 9.16.23-RH <<>> @192.168.122.7 ns.xwang.com NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40338
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: feaa924c78d315da010000006975e2267fb7aeb8286afc6e (good)
;; QUESTION SECTION:
;ns.xwang.com.			IN	NS

;; AUTHORITY SECTION:
xwang.com.		86400	IN	SOA	ns.xwang.com. admin.xwang.com. 2025012401 3600 900 604800 86400

;; Query time: 2 msec
;; SERVER: 192.168.122.7#53(192.168.122.7)
;; WHEN: Sun Jan 25 13:48:50 CST 2026
;; MSG SIZE  rcvd: 111
# 2. 验证ns.xwang.com的A记录。
[root@cache ~]# dig @192.168.122.7 ns.xwang.com A

; <<>> DiG 9.16.23-RH <<>> @192.168.122.7 ns.xwang.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53568
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: bac70cd060d3fb6d010000006975e23f789e062e4bd9d2fa (good)
;; QUESTION SECTION:
;ns.xwang.com.			IN	A

;; ANSWER SECTION:
ns.xwang.com.		86400	IN	A	192.168.122.7

;; Query time: 3 msec
;; SERVER: 192.168.122.7#53(192.168.122.7)
;; WHEN: Sun Jan 25 13:49:17 CST 2026
;; MSG SIZE  rcvd: 85

1.3 配置缓存服务器

1、修改主机名

[root@lcoalhost ~]# hostnamectl hostname cache

2、修改IP地址

[root@cache ~]# nmcli c modify enp1s0 ipv4.method manual ipv4.addresses 192.168.122.12/24 ipv4.gateway 192.168.122.2 ipv4.dns 223.5.5.5 connection.autoconnect yes
[root@cache ~]# nmcli c up enpls0

3、安装软件

[root@cache ~]# dnf install -y bind

4、修改主配置文件

[root@cache ~]# vim /etc/named.conf 
[root@cache ~]# cat /etc/named.conf 
options {
	listen-on port 53 { 192.168.122.12; };
	directory 	"/var/named";
	allow-query     { 192.168.122.0/24; };
	allow-recursion { 192.168.122.0/24; };
	forwarders { 192.168.122.7; };

	recursion yes;

	dnssec-validation no;
};

5、启动服务

[root@cache ~]# systemctl start named

6、防火墙放行服务

[root@cache ~]# firewall-cmd --permanent --add-port=53/tcp --add-port=53/udp
success
[root@cache ~]# firewall-cmd --reload 
success

7、测试配置文件有没有语法错误

[root@cache ~]# named-checkconf 

8、到客户端测试解析

[root@client ~]# dig @192.168.122.12 xiake.xwang.com A

; <<>> DiG 9.16.23-RH <<>> @192.168.122.12 xiake.xwang.com A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35720
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: f6d1826477bb90db010000006975a3ce73698c7273a4ba70 (good)
;; QUESTION SECTION:
;xiake.xwang.com.		IN	A

;; ANSWER SECTION:
xiake.xwang.com.	86325	IN	CNAME	www.xwang.com.
www.xwang.com.		86400	IN	A	192.168.122.7

;; Query time: 6 msec
;; SERVER: 192.168.122.12#53(192.168.122.12)
;; WHEN: Sun Jan 25 13:02:49 CST 2026
;; MSG SIZE  rcvd: 106

3. 分离解析

案例介绍

[[RHEL中DNS的结构#4.1.2 /etc/named.rfc1912.zones扩展配置方法|案例介绍]]

3.1 按照表格配置5台虚拟机

主机名 角色 系统 IP
web_0 外网Web服务器 redhat9.3 172.168.122.101
web_1 内网Web服务器 redhat9.3 192.168.122.101
ns1 分离服务器 redhat9.3 192.168.122.7 172.168.122.7
client_0 外网客户机 redhat9.3 192.168.122.18
client_1 内网客户机 redhat9.3 172.168.122.18
主机配置步骤请参考[[虚拟机IP配置案例 配置步骤]]

3.2 环境准备

1、安装nginx

[root@web0 ~]# dnf install nginx -y

2、修改首页

[root@web0 ~]# echo "$(hostname) - $(hostname -I)" > /usr/share/nginx/html/index.html

3、启动服务

[root@web0 ~]# systemctl start nginx

4、访问测试

[root@web0 ~]# curl localhost
web0 - 172.168.122.101

5、放行端口

[root@web0 ~]# firewall-cmd --permanent --add-port=80/tcp
success
[root@web0 ~]# firewall-cmd --reload
success

3.3 配置内网Web服务器

1、安装nginx

[root@web1 ~]# dnf install nginx -y

2、修改首页

[root@web1 ~]# echo "$(hostname) - $(hostname -I)" > /usr/share/nginx/html/index.html

3、启动服务

[root@web1 ~]# systemctl start nginx

4、访问测试

[root@web1 ~]# curl localhost
web1 - 192.168.122.101

5、放行端口

[root@web1 ~]# firewall-cmd --permanent --add-port=80/tcp
success
[root@web1 ~]# firewall-cmd --reload
success

3.4 配置分离解析服务器

1、安装软件

[root@ns1 ~]# dnf install bind -y

2、修改主配置文件

[root@server named]# cat /etc/named.conf
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

options {
	listen-on port 53 { 192.168.122.7;172.168.122.7; };
	listen-on-v6 port 53 { ::1; };
	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";
	recursing-file	"/var/named/data/named.recursing";
	allow-query     { 192.168.122.0/24;172.168.122.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 your recursive DNS server has a public IP address, you MUST enable access 
	   control to limit queries to your legitimate users. Failing to do so will
	   cause your server to become part of large scale DNS amplification 
	   attacks. Implementing BCP38 within your network would greatly
	   reduce such attack surface 
	*/
	recursion no;

	dnssec-validation no;

	managed-keys-directory "/var/named/dynamic";
	geoip-directory "/usr/share/GeoIP";

	pid-file "/run/named/named.pid";
	session-keyfile "/run/named/session.key";

	/* https://fedoraproject.org/wiki/Changes/CryptoPolicy */
	include "/etc/crypto-policies/back-ends/bind.config";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};


include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

3、修改区域配置文件

[root@server named]# cat /etc/named.rfc1912.zones 
// named.rfc1912.zones:
//
// Provided by Red Hat caching-nameserver package 
//
// ISC BIND named zone configuration for zones recommended by
// RFC 1912 section 4.1 : localhost TLDs and address zones
// and https://tools.ietf.org/html/rfc6303
// (c)2007 R W Franks
// 
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//
// Note: empty-zones-enable yes; option is default.
// If private ranges should be forwarded, add 
// disable-empty-zone "."; into options
// 

view "LAN" {
	match-clients { 192.168.122.0/24; };
	zone "xwang.com" IN {
		type master;
		file "xwang.zone";
	};
	zone "." IN {
		type hint;
		file "named.ca";
	};
};
view "WAN" {
	match-clients { 172.168.122.0/24; };
	zone "xwang.com" IN {
		type master;
		file "_xwang.zone";
	};
	zone "." IN {
		type hint;
		file "named.ca";
	};
};

4、编写内网区域数据文件

[root@ns1 ~]# cd /var/named/
[root@ns1 named]# cp -p named.localhost lan.exam.com.zone
[root@ns1 named]# vim lan.exam.com.zone
[root@ns1 named]# cat lan.exam.com.zone 
$TTL 1D
@	IN SOA	exam.com. 	admin.exam.com. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
	NS	ns
ns	A	192.168.122.7
web	A	192.168.122.101

8、编写外网区域数据文件

[root@ns1 named]# cp -p lan.exam.com.zone wan.exam.com.zone
[root@ns1 named]# vim wan.exam.com.zone
[root@ns1 named]# cat wan.exam.com.zone
$TTL 1D
@	IN SOA	exam.com. 	admin.exam.com. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; minimum
	NS	ns
ns	A	172.168.122.7
web	A	172.168.122.101

9、启动服务器

[root@ns1 named]# systemctl start named

10、放行服务

[root@ns1 named]# firewall-cmd --permanent --add-service=dns
success
[root@ns1 named]# firewall-cmd --reload
success

3.5 外网客户端测试

1、安装工具

[root@client1 ~]# dnf install -y bind-utils

2、验证

[root@client1 ~]# curl web.xwang.com
web_0:172.168.122.101
[root@client1 ~]# dig web.xwang.com

; <<>> DiG 9.16.23-RH <<>> web.xwang.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41528
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: ba62967bd4fe3e52010000006978d1bbc886967a59d434b5 (good)
;; QUESTION SECTION:
;web.xwang.com.			IN	A

;; ANSWER SECTION:
web.xwang.com.		86400	IN	A	172.168.122.101

;; Query time: 1 msec
;; SERVER: 172.168.122.7#53(172.168.122.7)
;; WHEN: Tue Jan 27 22:54:51 CST 2026
;; MSG SIZE  rcvd: 86

3.6 内网客户端测试

1、安装工具

[root@client0 ~]# dnf install -y bind-utils

2、验证

[root@client0 ~]# curl web.xwang.com
web_1:192.168.122.101
[root@client0 ~]# dig web.xwang.com

; <<>> DiG 9.16.23-RH <<>> web.xwang.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35498
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: aa9dfa56b7601721010000006978d1ea958b63b8715e3dcd (good)
;; QUESTION SECTION:
;web.xwang.com.			IN	A

;; ANSWER SECTION:
web.xwang.com.		86400	IN	A	192.168.122.101

;; Query time: 2 msec
;; SERVER: 192.168.122.7#53(192.168.122.7)
;; WHEN: Tue Jan 27 22:55:38 CST 2026
;; MSG SIZE  rcvd: 86

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐