一文啃完DNS:原理+查询+BIND部署全攻略
本文系统性地介绍了 DNS(域名系统)的核心原理与实战配置。内容涵盖 DNS 层次结构、递归与迭代查询机制、各类资源记录(A、NS、MX、SOA 等)的解析,并详细演示了如何在 Linux 上使用 BIND 搭建权威 DNS 服务器,包括配置文件编写、区域文件定义、服务验证及客户端测试。通过对比递归与迭代查询流程,帮助读者从理论到实践全面掌握 DNS 服务部署与管理。
DNS 服务器
摘要:本文系统性地介绍了 DNS(域名系统)的核心原理与实战配置。内容涵盖 DNS 层次结构、递归与迭代查询机制、各类资源记录(A、NS、MX、SOA 等)的解析,并详细演示了如何在 Linux 上使用 BIND 搭建权威 DNS 服务器,包括配置文件编写、区域文件定义、服务验证及客户端测试。通过对比递归与迭代查询流程,帮助读者从理论到实践全面掌握 DNS 服务部署与管理。
关键词:DNS 配置、BIND 教程、递归查询、迭代查询、资源记录
一、DNS 服务介绍
DNS(Domain Name System,域名系统):互联网核心服务,把域名 ↔ IP 地址互相解析,方便人类记忆域名、机器识别 IP。
本质:分布式数据库 + 分层命名系统。
比喻:互联网的电话簿 / 地址翻译官。
1. DNS 层次结构(从顶到底)
根域(.):最顶层,全球 13 组根服务器(A~M)。
顶级域 TLD:.com、.net、.org、.cn(国家域)。
二级域:lz.cloud、baidu.com(企业 / 组织用)。
子域:student.lz.cloud、www.baidu.com。
2. 关键术语(Domain / Subdomain / Zone)
学习DNS层次结构前,首先要搞清楚DNS层次结构中一些术语,例如domain,subdomain和zone等。
Domain(域):一个完整子树,如 lz.cloud,包含所有资源记录。
Subdomain(子域):某域下的分支,lab.lz.cloud 是 lz.cloud 的子域。
Zone(区域):某台 DNS 服务器直接负责的范围,可以是整个域或一部分;可以把部分子域委派给其他服务器。
3. DNS 服务器的 4 种角色
本地 DNS(Local DNS / 递归服务器):用户直接用(运营商、8.8.8.8、114.114.114.114),替用户查到底,返回最终结果。
根域名服务器:只返回顶级域服务器地址,不存具体域名 IP。
顶级域服务器(TLD):返回二级域的权威服务器地址。
权威 DNS(Authoritative NS):真正存域名→IP 记录,给出最终解析结果。
二、DNS 查询:递归 vs 迭代
1. 递归查询(Recursive)
RD=1(默认)。
客户端只发一次请求,全由本地 DNS 代办,直到拿到最终结果。
过程:客户端 → 本地 DNS → 根 → TLD → 权威 → 结果原路返回。
2. 迭代查询(Iterative)
RD=0。
客户端自己一层层问:本地 → 根 → TLD → 权威,每次只拿到 “下一台服务器地址”。
dig +trace 就是迭代查询全过程。
3. 一句话区别
递归:服务器帮你跑全程。
迭代:你自己一站一站问。
三、常见资源记录(必背)
表格
类型 作用 示例
A 域名→IPv4 student.lz.cloud. IN A 10.1.8.11
AAAA 域名→IPv6 www.lz.cloud. IN AAAA 2001:db8::1
CNAME 别名→主域名 www.lz.cloud. IN CNAME student.lz.cloud
MX 邮件服务器 lz.cloud. IN MX 10 mail.lz.cloud
NS 域名服务器 lz.cloud. IN NS dns.lz.cloud
PTR IP→域名(反向解析) 11.8.1.10.in-addr.arpa. IN PTR student.lz.cloud
SOA 区域起始授权(主 DNS、管理员邮箱、序列号、刷新时间) 区域文件第一行
四、Linux 用 BIND 搭建权威 DNS(实操全流程)
1. 安装 BIND(named)
#安装软件包
[root@server ~ 17:33:56]# yum install -y bind bind-utils
2. 主配置文件 /etc/named.conf
#配置服务器(修改配置文件)
[root@server ~ 17:33:57]# vim /etc/named.conf
# 增加:10.1.8.10;
options {
listen-on port 53 { 127.0.0.1;10.1.8.10; };
# 后续的相对路径都是基于该目录
directory "/var/named";
# 增加:允许客户端查询
allow-query { localhost; 10.1.8.0/24; };
# 递归查询
recursion yes;
# 修改:安全校验
dnssec-enable no;
dnssec-validation yes;
... ...
};
# 最后添加: 正向解析
zone "lz.cloud" IN {
type master;
file "lz.cloud.zone";
};
# 最后添加: 反向解析
zone "8.1.10.in-addr.arpa" IN {
type master;
file "10.1.8.zone";
};
3. 正向区域文件 /var/named/lz.cloud.zone
# 准备正向解析zone
[root@server ~ 17:33:58]# cd /var/named/
[root@server named 17:33:58]# cp -a named.localhost lz.cloud.zone
[root@server named 17:33:58]# vim lz.cloud.zone
[root@server named 17:33:58]# cat lz.cloud.zone
$TTL 1D
@ IN SOA dns.lz.cloud. admin.lz.cloud. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS dns.lz.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.lz.cloud.
mail IN A 10.1.8.200
web IN CNAME www
4. 反向区域文件 /var/named/10.1.8.zone
# 准备反向解析zone
[root@server named 17:33:59]# cp -a lz.cloud.zone 10.1.8.zone
[root@server named 17:33:59]# vim 10.1.8.zone
[root@server named 17:34:25]# cat 10.1.8.zone
$TTL 1D
@ IN SOA dns.lz.cloud. admin.lz.cloud. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
@ IN NS dns.lz.cloud.
10 IN PTR dns.lz.cloud.
10 IN PTR server.lz.cloud.
11 IN PTR client.lz.cloud.
100 IN PTR www.lz.cloud.
100 IN PTR web.lz.cloud.
200 IN PTR mail.lz.cloud.
5. 检查配置(关键!)
# 检查主配置文件语法
[root@server ~ 17:33:57]# named-checkconf /etc/named.conf
/etc/named.conf:36: 'dnssec-validation yes;' and 'dnssec-enable no;'
#可以根据提示进入配置文件修改
[root@server ~ 17:33:58]# vim /etc/named.conf
[root@server ~ 17:33:58]# named-checkconf /etc/named.conf
# 检查正zone文件语法
[root@server named 17:33:58]# named-checkzone lz.cloud lz.cloud.zone
zone lz.cloud/IN: loaded serial 0
OK
# 检查反zone文件语法
[root@server named 17:34:02]# named-checkzone 10.1.8 10.1.8.zone
zone 10.1.8/IN: loaded serial 0
OK
6. 启动服务 + 防火墙
#启动服务
[root@server named 17:34:38]# systemctl enable named.service
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
#设置防火墙
[root@server named 17:35:50]# cd
[root@server ~ 17:35:53]# systemctl stop firewalld
[root@server ~ 17:36:05]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
7. 客户端测试
(1)设置DNS
[root@client ~ 18:33:06]# nmcli connection
NAME UUID TYPE DEVICE
ens33 bc1c5b36-8427-4174-88f8-1799c3c0418d ethernet ens33
dynamic 102ce469-8c2d-4d4b-8eb1-dd014cb010bb ethernet ens36
virbr0 7e8e46b4-7289-4d10-9317-996df7942849 bridge virbr0
[root@client ~ 18:33:31]# nmcli con modify ens33 ipv4.dns 10.1.8.10
[root@client ~ 18:33:55]# nmcli connection up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/44)
[root@client ~ 18:34:05]# cat /etc/resolv.conf
# Generated by NetworkManager
search lz.cloud
nameserver 10.1.8.10
(2)常用测试命令
[root@client ~ 18:34:24]# ping server
PING server.lz.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from server.lz.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=0.993 ms
64 bytes from server.lz.cloud (10.1.8.10): icmp_seq=2 ttl=64 time=2.82 ms
^C
--- server.lz.cloud ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1014ms
rtt min/avg/max/mdev = 0.993/1.906/2.820/0.914 ms
[root@client ~ 18:41:08]# ping dns.lz.cloud
PING dns.lz.cloud (10.1.8.10) 56(84) bytes of data.
64 bytes from server.lz.cloud (10.1.8.10): icmp_seq=1 ttl=64 time=1.20 ms
64 bytes from server.lz.cloud (10.1.8.10): icmp_seq=2 ttl=64 time=1.21 ms
^C
--- dns.lz.cloud ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1005ms
rtt min/avg/max/mdev = 1.205/1.211/1.217/0.006 ms
(3)dig工具
[root@client ~ 18:37:53]# yum install -y bind-utils
[root@client ~ 18:40:02]# dig @10.1.8.10 lz.cloud NS
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.16 <<>> @10.1.8.10 lz.cloud NS
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33185
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;lz.cloud. IN NS
;; ANSWER SECTION:
lz.cloud. 86400 IN NS dns.lz.cloud.
;; ADDITIONAL SECTION:
dns.lz.cloud. 86400 IN A 10.1.8.10
;; Query time: 1 msec
;; SERVER: 10.1.8.10#53(10.1.8.10)
;; WHEN: 三 5月 27 18:40:23 CST 2026
;; MSG SIZE rcvd: 71
五、总结(面试 / 笔试必背)
1.DNS 作用:
域名 ↔ IP 解析,互联网电话簿。
2.查询类型:
递归(服务器代办)、迭代(客户端自查)。
3.核心记录:
A、AAAA、CNAME、MX、NS、PTR、SOA。
4.BIND 核心文件:
/etc/named.conf(主配置)
/var/named/xxx.zone(区域文件)
5.排错三步:
named-checkconf + named-checkzone
防火墙放通 53 端口
客户端 dig @服务器IP 域名 直接测试
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)