我深入理解DNS原理与服务的详细配置

2026-01-03 07:47:49

一、DNS服务的介绍

DNS(Domain Name System)是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。

DNS系统使用的是网络的查询,那么自然需要有监听的port。DNS使用的是53端口,在/etc/services(搜索domain)这个文件中能看到。通常DNS是以UDP这个较快速的数据传输协议来查询的,但是没有查询到完整的信息时,就会再次以TCP这个协议来重新查询。 所以启动DNS时,会同时启动TCP以及UDP的port53。

DNS域名解析时使用UDP协议DNS主从服务器之间的通信使用TCP协议

1. 因特网的域名结构

由于因特网的用户数量较多,所以因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。“域”(domain)是名字空间中一个可被管理的划分。

域名只是逻辑概念,并不代表计算机所在的物理地点。顶级域名可分为三大类:

国家顶级域名:采用ISO3166的规定。如:cn代表中国,us代表美国,uk代表英国,等等。国家域名又常记为ccTLD(country code top-level domains,cc表示国家代码contry-code)。

通用顶级域名:最常见的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。

基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名。

2. 域名服务器的类型划分

根据域名服务器起的作用,可以把域名服务器划分为以下类型:

根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。

顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。

权限域名服务器:负责一个“区”的域名服务器。

本地域名服务器:本地域名服务器不属于域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。

缓存DNS服务器:不负责解析域,只是缓存域名解析的结果。

为了提高域名服务器的可靠性,DNS域名服务器都把数据复制到几个域名服务器来保存,其中的一个就是主DNS服务器(Master name server),负责解析至少一个域。其他的是辅助(从)DNS服务器(Slave name server):负责解析至少一个域,是主DNS服务器的辅助。当主域名服务器出故障时,辅助域名服务器可以保证DNS的查询工作不会中断。主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行。这样就保证了数据的一致性。

3. DNS域名解析的过程

​​1)客户端本地查询​​

​​浏览器缓存检查​​:浏览器优先查询自身缓存(如Chrome的DNS缓存),若存在域名对应的IP地址则直接返回结果。​​操作系统缓存/Hosts文件查询​​:若浏览器无缓存,操作系统检查本地缓存或hosts文件(如/etc/hosts),若有记录则直接使用。

​​若命中缓存,解析终止​​;否则进入下一步。

2)本地DNS服务器递归查询​​

​​本地DNS服务器缓存检查​​:客户端向配置的本地DNS服务器(如ISP提供的服务器或公共DNS如8.8.8.8)发起请求,本地DNS服务器先查询自身缓存。​​递归查询机制​​:若缓存未命中,本地DNS服务器作为代理,代表客户端向更高级DNS服务器发起查询,直至获得结果(客户端无需参与后续查询)。

​​3)DNS层级迭代查询​​

若本地DNS服务器无缓存,则依次向以下服务器发起迭代查询:

​​根域名服务器:返回管理目标域名的​​顶级域服务器地址​​。​​顶级域服务器:返回管理该域名的​​权威DNS服务器地址​​。​​权威域名服务器​​:返回域名对应的​​最终IP地址​​。

4)结果返回与缓存​​

​​本地DNS服务器缓存结果​​:将IP地址缓存一段时间(由域名的TTL值决定),后续相同请求直接响应。​​返回客户端​​:IP地址传回用户设备,浏览器据此与目标服务器建立连接(如HTTP/HTTPS请求)。

4. DNS解析方式

1)递归解析​

​​过程​​:

客户端向本地DNS服务器(如运营商或公共DNS)发起请求后,​​本地DNS服务器负责完成所有后续查询​​。若本地无缓存,它会从根DNS服务器开始逐级查询(根→顶级域→权威DNS),最终获取IP地址并返回客户端。​​特点​​:

​​客户端只需发起一次请求​​,后续查询由服务器代理完成。本地DNS服务器缓存结果,提升后续查询效率。

​​2)迭代解析​

​​过程​​:

本地DNS服务器收到客户端请求后,若自身无缓存,会​​逐级向上级DNS服务器查询​​:

先问根DNS,获得顶级域服务器地址;再问顶级域服务器,获得权威DNS地址;最后向权威DNS获取IP地址。

​​特点​​:

本地DNS服务器仅返回下一级服务器地址,​​客户端需主动联系多级服务器​​。减轻根服务器压力,适合复杂网络环境。

3)反向解析​

通过IP地址查询对应的域名,需在DNS服务器中配置​​PTR记录​​(Pointer Record),将IP反向映射到域名。

二、搭建DNS服务器

提供DNS服务的软件叫bind,服务名是named。

yum install bind -y

rpm -ql bind

/etc/named.conf # bind主配置文件

/etc/named.rfc1912.zones # 定义zone的文件

/etc/rndc.conf # rndc配置文件

/usr/sbin/named-checkconf # 检测/etc/named.conf文件语法

/usr/sbin/named-checkzone # 检测zone和对应zone文件的语法

/usr/sbin/rndc # 远程dns管理工具

/usr/sbin/rndc-confgen # 生成rndc密钥

/var/named/named.ca # 根解析库

/var/named/named.localhost # 本地主机解析库

/var/named/slaves # 从服务器文件夹

查看/etc/named.conf文件内容:

vim /etc/named.conf

options {

# 定义监听端口,如果所有地址都监听,则只写端口

listen-on port 53 { 127.0.0.1; };

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"; # 分配统计目录

allow-query { localhost; }; # 只允许本地主机进行查询

recursion yes; # 允许递归

logging {

# 指定日志记录分类和他们的目标位置

channel default_debug {

file "data/named.run";

severity dynamic;

};

};

zone "." IN {

# 定义区域

type hint; # hint:根域配置;master:主域名服务器;slave:从域名服务器

file "named.ca"; # 指定域的数据解析文件

};

# 包含其他的配置文件

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

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

实验一:正向解析

1. 修改named的配置文件

需要增改的内容如下:

[root@localhost ~]# vim /etc/named.conf # 主配置文件

options { # 全局选项

listen-on port 53 { 192.168.153.129; }; # 改为本机IP地址

allow-query { any; }; # 允许任何主机查询,也可以是IP或网段

};

# 区域定义:

zone "example.com" IN { # 正向解析example.com

type master; # 主服务器类型

file "example.zone"; # 区域文件名(可自定义)

};

2. 自定义配置区域文件

区域文件,即文件资源记录(Resource Record,RR)

创建example.zone区域文件并配置以下内容(要和上面区域定义中的file文件名一样)

vim /var/named/example.zone

$TTL 1D

@ IN SOA dns.example.com. test.163.com (

0 ; serial ; 该文件中分号代表注释

1D ; refresh

1H ; retry

1W ; expire

3H ) ; minimum

IN NS dns.example.com.

IN MX 10 mail.example.com.

mail.example.com. IN A 192.168.153.129 ; 邮件服务器IP

dns.example.com. IN A 192.168.153.129 ; DNS服务器IP

ftp IN A 192.168.153.130 ; ftp.example.com → 130

dhcp IN A 192.168.153.132 ; dhcp.example.com → 132

www IN A 192.168.153.130 ; www.example.com → 130

web IN CNAME www

注意:文件中的域名要写完全域名,也就是注意最后的那个“.”不要忘记,如果不是完全限定域名的格式,文件会默认追加区域使其成为完全限定域名(如文件中的mail)。

文件解读:

​​部分​​​​配置行示例​​​​作用​​说明默认TTL

$TTL 1D

定义全局缓存时间表示下游DNS服务器或客户端可缓存此文件中的记录时长。SOA记录@ IN SOA dns.example.com. admin.example.com. (...)域授权信息及同步策略SOA(Start of Authority)是区域文件的​​核心授权记录​​,定义了域名的管理属性和同步策略。必须是第一条记录且仅有一个。NS记录IN NS dns.example.com.指定权威DNS服务器必须存在至少一条,指向可解析的A记录(如dns.example.com已配置A记录)MX记录IN MX 10 mail.example.com.指定邮件服务器需配套A记录解析mail.example.com的IP。A记录www IN A 192.168.153.130主机名→IPv4映射直接指向服务器IP(www等价于www.example.com.)。CNAME记录web IN CNAME www别名指向不可与其他记录类型共存(如同时存在A和CNAME)。

SOA的参数解读:

​​参数​​​​含义​​​​配置值​​​​建议值/说明​​​​作用​​​​serial​​区域数据版本号0格式建议为YYYYMMDDNN(如2024071901)主从同步依据:从服务器通过比较序列号判断是否需同步更新。​​refresh​​从服务器检查主服务器的间隔1D通常数小时(如12H)从服务器定期查询主服务器SOA记录以检测更新。​​retry​​同步失败后的重试间隔1H通常数分钟(如15M)若从服务器无法连接主服务器,在此时间后重试。​​expire​​从服务器停止提供服务的超时1W通常数周(如4W)若超过此时间仍无法同步主服务器,从服务器不再响应查询。​​minimum​​否定响应(NXDOMAIN)的缓存时间3H通常数小时(如1H)当查询记录不存在时,此TTL生效。

3. 检查语法,重启named服务

# 检查主配置文件语法

named-checkconf

# 检查example.zone文件语法

named-checkzone example.com /var/named/example.zone

zone example.com/IN: loaded serial 0

OK

# 确认无误,重启服务

systemctl restart named

4. 客户端测试

# 修改DNS地址

nmcli con modify ens33 +ipv4.dns 192.168.153.129

nmcli con up ens33

# 安装测试工具

yum install -y bind-utils

# 测试

nslookup dhcp.example.com 192.168.153.129 # nslookup [域名] [dns服务器]

Server: 192.168.153.129

Address: 192.168.153.129#53

Name: dhcp.example.com

Address: 192.168.153.132

注:如果无法成功注意关闭防火墙

实验二:反向解析

1. 主配置文件添加

vim /etc/named.conf

zone "153.168.192.in-addr.arpa" IN { # ip要反写且要加上.in-addr.arpa

type master;

file "153.168.192.zone";

};

2. 配置反向区域文件

vim /var/named/153.168.192.zone

$TTL 1D

@ IN SOA dns.example.com. test.163.com (

0

1D

1H

1W

3H )

IN NS dns.example.com.

dns IN A 192.168.153.129

129 IN PTR dns.example.com.

130 IN PTR www.example.com.

​​记录类型​​​​语法格式​​​​作用​​​​示例与说明​​​​PTR​​IP反写 IN PTR 域名将IP映射到域名(核心记录)3 IN PTR www.example.com.(IP 192.168.1.3 → www.example.com)

3. 检验语法,重启服务

# 检查主配置文件语法

named-checkconf

# 检查153.168.192.zone文件语法

named-checkzone 153.168.192.in-addr.arpa /var/named/153.168.192.zone

zone 153.168.192.in-addr.arpa/IN: loaded serial 0

OK

# 确认无误,重启服务

systemctl restart named

4. 客户端测试

nslookup 192.168.153.130 192.168.153.129

130.153.168.192.in-addr.arpa name = www.example.com.

实验三:区域传送(主从服务)

将一个区域文件复制到多个服务器上的过程叫做区域传送。将主服务器上的区域文件复制到从服务器上来实现。

主服务器IP:192.168.153.129

从服务器IP:192.168.153.131

1. 完全区域传送

复制整个区域文件到从服务器上

主服务器:

# 1.修改主配置文件/etc/named.conf

vim /etc/named.conf

options {

allow-transfer { 192.168.1.101; }; # 仅允许从服务器同步

};

# 2.修改区域配置文件

vim /var/named/example.zone # 增加从服务器的记录

IN NS dns2.example.com.

dns2 IN A 192.168.153.131

vim /var/named/153.168.192.zone # 反向区域文件同理也增加

IN NS dns2.example.com.

dns2 IN A 192.168.153.131

131 IN PTR dns2.example.com.

# 3.重启服务

systemctl restart named

从服务器:

# 1.安装bind

yum install -y bind

# 2.修改主配置文件/etc/named.conf

vim /etc/named.conf

options {

listen-on port 53 { 192.168.153.131; };

allow-query { any; };

};

zone "example.com" IN {

type slave; # 类型为从服务器

masters { 192.168.153.129; }; # 主服务器IP

file "slaves/example.zone"; # 同步到的区域文件的存放路径

};

zone "153.168.192.in-addr.arpa" IN {

type slave;

masters { 192.168.153.129; };

file "slaves/153.168.192.zone";

};

# 3.重启服务

systemctl restart named

在从服务器上查看区域文件是否同步成功:

ls -l /var/named/slaves

total 8

-rw-r--r-- 1 named named 554 Jul 19 14:50 153.168.192.zone

-rw-r--r-- 1 named named 566 Jul 19 14:50 example.zone

2. 增量区域传送

增量区域传送:仅复制区域里变化的文件

修改主服务器的区域配置文件,将serial序号从0改为10重启服务手动触发从服务器同步

rndc retransfer example.com

rndc refresh example.com

# 查看同步状态​​

rndc status

4. 检验从服务器中example.zone的修改时间变化

ls -l /var/named/slaves/

total 8

-rw-r--r-- 1 named named 554 Jul 19 14:50 153.168.192.zone

-rw-r--r-- 1 named named 566 Jul 19 14:55 example.zone # 时间从14:50变成了14:55

5. 测试从服务器能否正常解析:

nslookup ftp.example.com 192.168.153.131

Server: 192.168.153.131

Address: 192.168.153.131#53

Name: ftp.example.com

Address: 192.168.153.130

over~