- DNS简介
- DNS域名的解析过程
- DNS服务器的资源记录
- 实验模拟DNS解析过程
DNS简介
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住不易于记忆的IP地址。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
DNS域名的解析过程
每个域都有自己的DNS服务器,负责解析本域名结尾的所有主机和ip地址的对应关系,同时也会指明下级子域的DNS服务器的ip地址,这个dns称为这个域的权威dns服务器。
主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
大致的解析流程:
1、客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
2、当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
3、如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域) 的主域名服务器的地址。
4、本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
5、重复第四步,直到找到正确的纪录。
6、本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
DNS服务器的资源记录
在DNS服务器的区域数据库中,DNS服务器的资源记录记录是域与IP地址之间的对应关系,以及子域的DNS服务器地址,或者是从DNS服务器的地址。在这里给大家简单介绍常见的资源记录类型。
SOA记录
SOA(Start Of Authority),起始授权记录,一个区域解析库有且只能有一个SOA记录,而且必须是解析库的第一条记录。SOA指示区域的源名称,并包含作为区域主要信息源的服务器的名称。它表示最初创建它的DNS服务器或现在是该区域的主服务器的DNS服务器。它还表示该区域的其他基本属性以及用于存储会影响区域更新或过期的其他属性,如版本信息和计时。
NS记录
NS(Name Server)名称服务器,NS记录实际上也是在DNS服务器之间,表明谁对某个区域有解释权,即权威DNS。
A记录
A: internet Address,主机地址(A) 资源记录,作用是将 DNS 域名映射成IPV4的32 位ip地址。
CNAME记录
CNAME(Canonical Name)通常称别名指向,可以为一个主机设置别名。作用是将owner 字段中的别名或备用的DNS 域名映射到canonical_name字段中指定的标准或主要DNS 域名。
PTR记录
PTR是pointer 的简写,PTR记录也被称为指针记录,PTR记录是A记录的逆向记录,作用是把IP地址解析为域名。DNS的反向区域负责从IP到域名的解析,因此如果要创建PTR记录,必须在反向区域中创建。
实验模拟DNS解析过程
模拟实验结构图实验准备
准备6台linux centos7机器,按照上图配置好IP地址,确保互相之间可以通信。为排除其他因素的干扰,实验之前必须确保所有机器的防火墙以及selinux全部禁用。
# 查询防火墙状态
systemctl status firewalld
# 如果防火墙处于打开状态,关闭防火墙
systemctl stop firewalld
# 禁用selinux
sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config
setenforce 0
在除了客户端(192.168.1.6)的其余5台机器上,查询是否安装了bind软件,如果没有安装,安装一下。
# 查询是否安装了bind软件
yum info bind
# 如果没有安装,安装一下
yum install bind
# 启动DNS服务
systemctl start named
配置
配置的原则是从底往上配置,配置一台,测试一下。下面是具体的配置过程。
一、在king.com的主DNS上
# 修改/etc/named.conf配置文件
vim /etc/named.conf
# 在options{}中注释两行,默认表示监听本机所有ip,以及接受所有主机查询
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
# 在options{}中添加一行
allow-transfer { 192.168.1.16; }; # 允许该主机可以从这里复制区域解析库文件
# 修改/var/named/named.ca,把根域DNS指向192.168.1.8,修改后内容为
. 518400 IN NS a.root-servers.net.
a.root-servers.net. 3600000 IN A 192.168.1.8
# 确保/var/named/named.ca的所属组是named,并且所属组队该文件有毒权限
# 把修改后的文件复制到所有参与实验的主机,根DNS服务器无需修改
scp /var/named/named.ca 192.168.1.16:/var/named/
scp /var/named/named.ca 192.168.1.7:/var/named/
scp /var/named/named.ca 192.168.1.14:/var/named/
scp /var/named/named.ca 192.168.1.6:/var/named/
# 修改区域数据库配置文件
vim /etc/named.rfc1912.zones
# 添加
zone "king.com" IN {
type master;
file "king.com.zone";
};
# 创建区域数据库king.com.zone
cd /var/named
vim king.com.zone
$TTL 1D
@ IN SOA dns1.king.com. admin.king.com. (
2017092415 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
604800 ; expire (1 week)
10800 ; minimum (3 hours)
)
NS dns1.king.com.
NS dns2.king.com.
dns1 A 192.168.1.15
dns2 A 192.168.1.16 # 从DNS
websrv A 192.168.1.88
www CNAME websrv
# 重启DNS服务
systemctl restart named
# 在客户端上测试通过
dig www.king.com @192.168.1.15
二、在king.com的从DNS上
# 修改/etc/named.conf配置文件
vim /etc/named.conf
# 在options{}中注释两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
# 在options{}中添加一行
allow-transfer { none; }; # 设置为任何人都不允许复制区域解析库文件
# 修改区域数据库配置文件
# 添加
zone "king.com" IN {
type slave;
masters { 192.168.1.15; };
file "slaves/king.com.slave.zone";
};
# 重启DNS服务
systemctl restart named
# 在客户端上测试通过
dig www.king.com @192.168.1.16
三、在com DNS上
# 修改/etc/named.conf配置文件
vim /etc/named.conf
# 在options{}中注释两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
# 修改/etc/named.rfc1912.zones
vim /etc/named.rfc1912.zones
# 添加
zone "com" IN {
type master;
file "com.zone";
};
# 添加区域数据库
cd /var/named
cp -p named.localhost com.zone
# com.zone内容为
$TTL 1D
@ IN SOA dns1 admin.king.com. (
2017092415 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
604800 ; expire (1 week)
10800 ; minimum (3 hours)
)
NS dns1
king NS dns2
king NS dns3
dns1 A 192.168.1.14
dns2 A 192.168.1.15
dns3 A 192.168.1.16
# 检查一下配置
named-checkconf
named-checkzone "com" /var/named/com.zone
# 重启DNS服务
systemctl restart named
# 在客户端上测试通过
dig www.king.com @192.168.1.14
四、在根域DNS上
# 修改/etc/named.conf
# 在options{}中注释两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
# 删除下面的行,根域DNS不需要不需要再去找根DNS
zone "." IN {
type hint;
file "named.ca";
};
# 修改/etc/named.rfc1912.zones
vim /etc/named.rfc1912.zones
# 添加
zone "." IN {
type master;
file "root.zone";
};
# 添加区域数据库
cd /var/named
cp -p named.localhost root.zone
# root.zone内容为
$TTL 1D
@ IN SOA dns1 admin.king.com. (
2017092419 ; serial
86400 ; refresh (1 day)
3600 ; retry (1 hour)
604800 ; expire (1 week)
10800 ; minimum (3 hours)
)
NS dns1
com NS dns2
dns1 A 192.168.1.8
dns2 A 192.168.1.14
# 检查一下配置
named-checkconf
named-checkzone "com" /var/named/com.zone
# 重启DNS服务
systemctl restart named
# 在客户端上测试通过
dig www.king.com @192.168.1.8
五、在电信DNS上面
# 修改/etc/named.conf
# 在options{}中注释几行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
// recursion yes;
# 修改下面两行,涉及到dns的安全监测,作为转发DNS需要关闭
dnssec-enable no;
dnssec-validation no;
# 重启DNS服务
systemctl restart named
客户端测试
一、直接测试
# 测试
dig www.king.com @192.168.1.7
# 显示的主要内容
;; QUESTION SECTION:
;www.king.com. IN A
;; ANSWER SECTION:
www.king.com. 86400 IN CNAME websrv.king.com.
websrv.king.com. 86400 IN A 192.168.1.88
;; AUTHORITY SECTION:
king.com. 86400 IN NS dns3.com.
king.com. 86400 IN NS dns2.com.
;; ADDITIONAL SECTION:
dns3.com. 86400 IN A 192.168.1.16
dns2.com. 86400 IN A 192.168.1.15
测试通过。
二、关闭king.com的主DNS测试
# 测试,发现仍然是可以解析的
dig www.king.com @192.168.1.7
至此,关于DNS的相关知识以及DNS的解析过程模拟实验就介绍完了。篇幅所限,没有涉及到反向解析的介绍,以及还存在很多其他的不足,请多指正。