一、DNS 基础概述

1. 定义

DNS(域名系统):分布式命名数据库,核心作用是 域名 ↔ IP 地址 相互解析,替代难记的 IP,是互联网基础服务。

2. 域名分层结构(树形层级)

从上至下层级:根域 → 顶级域 → 二级域 → 子域

  1. 根域:层级最高,符号 .,全球根服务器负责管理。
  2. 顶级域(TLD)
    • 通用顶级域(gTLD):.com.net.edu
    • 国家顶级域(ccTLD):.cn.uk.us 等,由各国管理
  3. 二级域:企业 / 组织注册使用,例:bgy.cloud
  4. 子域:在二级域下划分,例:www.bgy.cloudmail.bgy.cloud

3. 核心术语

  • Domain(域):某一域名下所有资源记录的集合,对应一棵完整命名子树。
  • Subdomain(子域):隶属于上级域名的分支域名。
  • Zone(区域):单台 DNS 服务器直接负责解析的域名范围;可将子域委派给其他服务器。

二、DNS 两种查询方式

DNS 报文 RD 字段区分类型:RD=1 递归查询(默认);RD=0 迭代查询。

1. 递归查询

  • 角色分工:客户端只发请求、等待结果,全程由本地 DNS 服务器代查所有流程。
  • 流程:
    1. 客户端请求本地 DNS
    2. 本地 DNS 查自身缓存,有记录直接返回
    3. 无缓存则依次向「根服务器 → 顶级域服务器 → 二级域服务器 → 权威服务器」递归查询
    4. 拿到最终结果,返回客户端,并本地缓存记录

2. 迭代查询

  • 角色分工:客户端自主逐层级查询,每台服务器只返回下一级服务器地址,不代查。
  • 流程:
    1. 客户端请求本地 DNS
    2. 本地 DNS 无缓存,返回根服务器地址
    3. 客户端访问根服务器,得到顶级域服务器地址
    4. 客户端继续逐级查询,直到访问到权威服务器
    5. 权威服务器返回解析结果给客户端

核心区别

  • 递归:本地 DNS 做代理,客户端 “一问到底”
  • 迭代:客户端自主遍历各级服务器,逐级获取线索

三、DNS 资源记录(RR)

1. 通用格式

主机名    TTL  类别  记录类型  数据
  • TTL:缓存有效时长(秒)
  • class:固定为 IN(互联网类别)

2. 常用记录类型

记录类型作用示例
A域名 → IPv4 正向解析www.bgy.cloud. 300 IN A 10.1.8.100
AAAA域名 → IPv6 正向解析test.bgy.cloud. 300 IN AAAA 2409::1
CNAME域名别名,指向另一域名web.bgy.cloud. IN CNAME www.bgy.cloud.
PTRIP → 域名 反向解析100.8.1.10.in-addr.arpa. IN PTR www.bgy.cloud.
NS指定域的权威 DNS 服务器bgy.cloud. IN NS dns.bgy.cloud.
SOA区域起始授权记录(每个区域唯一)定义主服务器、管理员邮箱、同步 / 超时参数
MX邮件交换记录,指定邮件服务器(数值越小优先级越高)bgy.cloud. IN MX 10 mail.bgy.cloud.
TXT文本记录,多用于域名验证、邮件防伪造存放 SPF、域名验证字符串
SRV服务定位记录,查找指定服务的服务器端口定位 LDAP、FTP 等服务地址

补充说明

  1. CNAME 不建议嵌套指向其他 CNAME,易形成解析循环、降低效率;

  2. NS/MX 记录不能指向 CNAME,必须绑定 A/AAAA 记录;

  3. SOA 字段释义:主服务器、管理员邮箱、区域版本号、刷新 / 重试 / 过期 / 最小缓存时间。

安装 BIND

通过安装bind软件包来安装BIND。 名称服务器本身作为named服务运行。 bind包将HTML和PDF格式的BIND文档在安装在/usr/share/doc/bind/目录。

[root@sever ~ 18:38:48]# yum install -y bind bing-utils

软件包说明:

  • bind,服务器软件包。
  • bind-utils,bind 工具软件包。

bind软件包默认将服务配置为基本的递归缓存名称服务器。 它被配置为localhost、相关域和地址的primary服务器,以减轻根名称服务器的负担。 此默认配置还限制了对本地主机上程序的访问。 它侦听IPv4和IPv6环回接口的端口53 UDP/TCP(127.0.0.1和:: 1)上的连接。

配置 BIND

named主要配置文件是**/etc/named.conf**。 该文件控制BIND的基本操作,由root用户(named组)拥有,具有八进制权限0640,并且具有named_conf_t SELinux类型。

配置文件还指定了每个区域的配置文件位置,这些文件通常保存在**/var/named**中。

配置DNS服务器需要执行以下步骤:

  • 配置地址匹配列表。
  • 配置named侦听的IP地址。
  • 配置客户端的访问控制。
  • 配置zone。
  • 编写区域文件。
配置客户端的访问控制

我们可以在/etc/named.conf文件options块中使用以下三个指令配置控制访问:

  • allow-query,控制所有查询。 默认情况下,allow-query设置为localhost,对于公开权威服务器必须定义allow-query { any; };允许互联网托管者从他们那里获取信息。
  • allow-recursion,控制递归查询。 权威服务器不应允许递归查询, 防止服务器被用于DNS放大分布式拒绝服务攻击,并更好地保护其免受缓存中毒攻击。

配置此功能最简单的方法是完全关闭递归:

bash options { ...... recursion no; ...... };

如果必须允许受信任的客户端执行递归,则可以打开递归并为这些特定主机或网络设置allow-recursion:

options { ...... recursion yes; allow-recursion { trusted-nets; }; ...... };
  • allow-transfer,控制区域转移(Zone Transfer)。 区域转移允许客户端获取我们区域中所有数据的转储。 区域转移应该受到限制,否则攻击者很容易快速获取我们区域中的所有资源记录。

实验环境采用如下配置:

[root@sever ~ 18:43:36]# vim /etc/named.conf

#修改部分为
listen-on port 53 { 127.0.0.1;10.1.8.10;};
	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";
	recursing-file  "/var/named/data/named.recursing";
	secroots-file   "/var/named/data/named.secroots";
	allow-query     { any; };

配置 zone
[root@sever ~ 18:48:07]# vim /etc/named.conf

# 最后添加如下内容

#正向解析
zone "bgy.cloud" IN {
    type master;
    file "bgy.cloud.zone";
};
#反向解析
zone "8.1.10.in-addr.arpa" IN {
    type master;
    file "10.1.8.zone";
};

配置说明:

  • type,指定服务器角色。
  • file,指定相对路径名。 相对路径由 options 块中的 directory 指令设置。
创建区域文件

辅助区域文件应保存在/var/named/slaves中。辅助服务器启动时,会将其缓存的区域版本与主服务器上的当前版本进行比较:如果区域文件版本是最新的,则使用该区域文件; 如果区域文件版本不是最新的或文件不存在,则named执行区域传输并将结果缓存在该文件中。

BIND 应该能够读取这些区域文件,但不能写入它们。 这些文件应归root用户和named组所有,以便守护程序在某种程度上受到损害时不能更改它们。

[root@sever ~ 18:52:19]# cd /var/named/
[root@sever named 18:57:00]# cp -a named.localhost bgy.cloud.zone
[root@sever named 18:57:37]# vim bgy.cloud.zone
$TTL 1D
@	IN SOA	dns.bgy.cloud. admin.bgy.cloud. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; mininum
@       IN NS    dns.bgy.cloud.
dns     IN A     10.1.8.10
server  IN A     10.1.8.10
client  IN A     10.1.8.11
www     IN A     10.1.8.100
@       IN MX 10 mail.bgy.cloud.
mail    IN A     10.1.8.200
web     IN CNAME www


#检查
[root@sever named 18:59:26]# named-checkzone bgy.cloud bgy.cloud.zone
zone bgy.cloud/IN: loaded serial 0
OK
[root@sever named 18:59:44]# cp -a bgy.cloud.zone 10.1.8.zone
[root@sever named 18:59:59]# vim 10.1.8.zone
$TTL 1D
@	IN SOA	dns.bgy.cloud. admin.bgy.cloud. (
					0	; serial
					1D	; refresh
					1H	; retry
					1W	; expire
					3H )	; mininum
@       IN NS    dns.bgy.cloud.
10    IN PTR    dns.bgy.cloud.
10    IN PTR    server.bgy.cloud.
11    IN PTR    client.bgy.cloud.
100    IN PTR    www.bgy.cloud.
100    IN PTR    web.bgy.cloud.
200     IN PTR  mail.bgy.cloud.



#检查
[root@sever named 19:01:23]# named-checkzone 10.1.8 10.1.8.zone 
zone 10.1.8/IN: loaded serial 0
OK
[root@sever named 19:01:29]# systemctl enable named --now
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
[root@sever named 19:01:36]# systemctl status named --now

客户端测试

方式1:配置dns

[root@client ~ 17:20:02]# nmcli con modify ens32 ipv4.dns 10.1.8.10
[root@client ~ 19:07:30]# nmcli con up ens32
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/13)


[root@client ~ 19:11:25]# cat /etc/resolv.conf 
# Generated by NetworkManager
search bgy.cloud
nameserver 10.1.8.10

[root@client ~ 19:11:13]# ping server
PING server.bgy.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from dns.bgy.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.343 ms
[root@client ~ 19:11:20]# ping dns.bgy.cloud
PING dns.bgy.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from dns.bgy.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.336 ms


方式2:dig工具

[root@client ~ 19:13:45]# yum install -y bind-utils

# 查询相关记录,@10.1.8.10指定向10.1.8.10服务器查询记录
# 查询NS记录

[root@client ~ 19:15:54]# dig @10.1.8.10 bgy.cloud NS

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @10.1.8.10 bgy.cloud NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42507
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bgy.cloud.			IN	NS

;; ANSWER SECTION:
bgy.cloud.		86400	IN	NS	dns.bgy.cloud.

;; ADDITIONAL SECTION:
dns.bgy.cloud.		86400	IN	A	10.1.8.10

;; Query time: 0 msec
;; SERVER: 10.1.8.10#53(10.1.8.10)
;; WHEN: 二 526 19:16:06 CST 2026
;; MSG SIZE  rcvd: 72

[root@client ~ 19:16:06]# dig @10.1.8.10 bgy.cloud MX

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @10.1.8.10 bgy.cloud MX
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 461
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;bgy.cloud.			IN	MX

;; ANSWER SECTION:
bgy.cloud.		86400	IN	MX	10 mail.bgy.cloud.

;; AUTHORITY SECTION:
bgy.cloud.		86400	IN	NS	dns.bgy.cloud.

;; ADDITIONAL SECTION:
mail.bgy.cloud.		86400	IN	A	10.1.8.200
dns.bgy.cloud.		86400	IN	A	10.1.8.10

;; Query time: 0 msec
;; SERVER: 10.1.8.10#53(10.1.8.10)
;; WHEN: 二 526 19:16:12 CST 2026
;; MSG SIZE  rcvd: 109


[root@client ~ 19:16:28]# dig @10.1.8.10 -x 10.1.8.100

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @10.1.8.10 -x 10.1.8.100
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21422
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;100.8.1.10.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
100.8.1.10.in-addr.arpa. 86400	IN	PTR	www.bgy.cloud.
100.8.1.10.in-addr.arpa. 86400	IN	PTR	web.bgy.cloud.

;; AUTHORITY SECTION:
8.1.10.in-addr.arpa.	86400	IN	NS	dns.bgy.cloud.

;; ADDITIONAL SECTION:
dns.bgy.cloud.		86400	IN	A	10.1.8.10

;; Query time: 0 msec
;; SERVER: 10.1.8.10#53(10.1.8.10)
;; WHEN: 二 526 19:16:33 CST 2026
;; MSG SIZE  rcvd: 131

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐