DNS 服务器
一、DNS 基础概述
1. 定义
DNS(域名系统):分布式命名数据库,核心作用是 域名 ↔ IP 地址 相互解析,替代难记的 IP,是互联网基础服务。
2. 域名分层结构(树形层级)
从上至下层级:根域 → 顶级域 → 二级域 → 子域
- 根域:层级最高,符号
.,全球根服务器负责管理。 - 顶级域(TLD)
- 通用顶级域(gTLD):
.com、.net、.edu等 - 国家顶级域(ccTLD):
.cn、.uk、.us等,由各国管理
- 通用顶级域(gTLD):
- 二级域:企业 / 组织注册使用,例:
bgy.cloud - 子域:在二级域下划分,例:
www.bgy.cloud、mail.bgy.cloud
3. 核心术语
- Domain(域):某一域名下所有资源记录的集合,对应一棵完整命名子树。
- Subdomain(子域):隶属于上级域名的分支域名。
- Zone(区域):单台 DNS 服务器直接负责解析的域名范围;可将子域委派给其他服务器。
二、DNS 两种查询方式
DNS 报文 RD 字段区分类型:RD=1 递归查询(默认);RD=0 迭代查询。
1. 递归查询
- 角色分工:客户端只发请求、等待结果,全程由本地 DNS 服务器代查所有流程。
- 流程:
- 客户端请求本地 DNS
- 本地 DNS 查自身缓存,有记录直接返回
- 无缓存则依次向「根服务器 → 顶级域服务器 → 二级域服务器 → 权威服务器」递归查询
- 拿到最终结果,返回客户端,并本地缓存记录
2. 迭代查询
- 角色分工:客户端自主逐层级查询,每台服务器只返回下一级服务器地址,不代查。
- 流程:
- 客户端请求本地 DNS
- 本地 DNS 无缓存,返回根服务器地址
- 客户端访问根服务器,得到顶级域服务器地址
- 客户端继续逐级查询,直到访问到权威服务器
- 权威服务器返回解析结果给客户端
核心区别
- 递归:本地 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. |
| PTR | IP → 域名 反向解析 | 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 等服务地址 |
补充说明
-
CNAME 不建议嵌套指向其他 CNAME,易形成解析循环、降低效率;
-
NS/MX 记录不能指向 CNAME,必须绑定 A/AAAA 记录;
-
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: 二 5月 26 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: 二 5月 26 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: 二 5月 26 19:16:33 CST 2026
;; MSG SIZE rcvd: 131
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)