深入理解DNS原理与服务的详细配置
一、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.comtype 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 ; refresh1H ; retry1W ; 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 |
| 定义全局缓存时间 | 表示下游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#53Name: dhcp.example.com
Address: 192.168.153.132
注:如果无法成功注意关闭防火墙
实验二:反向解析
1. 主配置文件添加
vim /etc/named.conf
zone "153.168.192.in-addr.arpa" IN { # ip要反写且要加上.in-addr.arpatype master;file "153.168.192.zone";
};
2. 配置反向区域文件
vim /var/named/153.168.192.zone
$TTL 1D
@ IN SOA dns.example.com. test.163.com (01D1H1W3H )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.131vim /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; }; # 主服务器IPfile "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
- 重启服务
- 检验从服务器中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
4. 测试从服务器能否正常解析:
nslookup ftp.example.com 192.168.153.131
Server: 192.168.153.131
Address: 192.168.153.131#53Name: ftp.example.com
Address: 192.168.153.130
over~