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: 三 527 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 域名 直接测试

Logo

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

更多推荐