域名系统(DNS)是一个分层的分布式数据库。它存储用于将Internet主机名映射到IP地址(反之亦然)的信息、邮件路由信息以及Internet应用程序使用的其他数据。
客户端通过调用解析器库在DNS中查找信息,解析器库向一个或多个名称服务器发送查询并解释响应。BIND 9软件发行版包含一个名称服务器,named和一个名为liblwres的解析器库。
1、域名的系统结构
域名分为根域、顶级域、二级域、三级域和主机名这5类。
一般格式为“主机名.三级域.二级域.顶级域.”,后面这个点表示根域,在浏览器下不用输入。
2、域名服务器的分类
域名服务器可分为主域名服务器,辅助域名服务器,缓存域名服务器和转发服务器。
3、dns域名解析的过程
第一步:本地电脑会检查浏览器缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束。
第二步:如果浏览器缓存中没有数据,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果,windows中可以通过配置C:\Windows\System32\drivers\etc\hosts文件来设置,Linux中可以通过/etc/hosts文件来设置。
第三步:前两个过程无法解析时,就要用到我们网络配置中的"DNS服务器地址"了。操作系统会把这个域名发送给这个本地DNS服务器。每个完整的内网通常都会配置本地DNS服务器,例如用户是在学校或工作单位接入互联网,那么用户的本地DNS服务器肯定在学校或工作单位里面。它们一般都会缓存域名解析结果,当然缓存时间是受到域名的失效时间控制的。大约80%的域名解析到这里就结束了,后续的DNS迭代和递归也是由本地DNS服务器负责。
第四步:如果本地DNS服务器仍然没有命中,就直接到根DNS服务器请求解析。
第五步: 根DNS服务器返回给本地DNS域名服务器一个顶级DNS服务器地址,它是国际顶级域名服务器,如.com、.cn、.org等
第六步:顶级域名服务器会返回一个二级域名服务器的地址,例如baidu。
第六步:二级域名找到了主机名的地址,就会返回给本地域名服务器,并且缓存下来。
递归和迭代查询的示意图:
4、资源记录
资源记录即添加到区域文件的记录,资源记录有许多类型,每一种类型的功能各不相同。
A 表示 Address,A记录就是地址记录,是域名到ipv4地址的映射信息。
AAAA也是地址记录,是域名到ipv6地址的映射信息。
PTR记录与A记录相反,是ip地址到域名的映射信息。
SOA记录意为起始7授权记录,用于声明DNS服务器是DNS域中数据表的信息来源,是主机的管理者。
NS记录是名称服务。用于记录表明区域权威DNS服务器,即在NS记录中指定的服务器会被其他服务器当作权威的来源,并能应答。
CNAME记录用于为特定FQDN创建别名,为多台主机提供相同的别名。
MX记录指向一个邮件服务器,用于指定邮件交换服务器。
[root@control ~]# dnf install bind bind-utils -y
配置文件解析
[root@kittod ~]# cat /etc/named.conf
options {
/*
监听方式,服务监听指定ip的53号端口
服务器可能有多张网卡,any表示所有网卡监听53端口的DNS解析请求
todo 可以个实验:1、ip指定为本机ip。2、ip指定为同网段随便的ip
*/
listen-on port 53 { 127.0.0.1; any;}; /**/
/*数据文件目录*/
directory "/var/named";
/*DNS缓存位置*/
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
/*
允许哪些client来查询dns服务,默认是localhost。
any表示所有人都能进行dns查询
*/
allow-query { localhost;any; };
/*是否递归*/
recursion yes;
/*DNS安全扩展机制,默认开启,直接关闭即可*/
dnssec-enable no;
dnssec-validation no;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
/*之所以全部DNS服务器都知道根域名服务器的位置,就是下面的配置在生效*/
zone "." IN {
type hint;
file "named.ca";
};
/*子配置文件*/
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
区域配置文件模板
cat /etc/named.rfc1912.zones
域类型的几种取值:
hint:若本地找不到相关解析,可查询根域名服务器
master:定义权威域名服务器
slave:定义辅助域名服务器
forward:定义转发域名服务器
dns正向解析实验
[root@control ~]# vim /etc/resolv.conf 可以设置dns
[root@control ~]# vim /etc/named.conf
listen-on port 53 { localhost; }; 修改为本机ip地址
allow-query { any; }; 允许哪个主机可以过来查询,同时还可以帮你查询他不知道的域名
zone "xiaogang.com" IN{
type master;
file "named.xiaogang.com"; 写一个区域文件
};
[root@control ~]# vim /var/named/named.xiaogang.com
可以cp -p 复制named.localhost这个文件的模板
$TTL 1D 域名解析记录在DNS服务器中的存留时间
@ IN SOA ns1 admin.xiaogang.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
ns1 A 192.168.85.133
www CNAME webser
webser A 192.168.85.134
webser A 192.168.85.135 两个IP地址对应着这个主机,在一些大公司里可以分担流量
* A 192.168.85.134 *号表示,你的主机名错误但还是给你解析成www的
@ A 192.168.85.134 @表示本机,比如xiaogang.com
例如:
[root@control ~]# host www.xiaogang.com
www.xiaogang.com is an alias for webser.xiaogang.com.
webser.xiaogang.com has address 192.168.85.135
webser.xiaogang.com has address 192.168.85.134
[root@control ~]# host wwwss.xiaogang.com
wwwss.xiaogang.com has address 192.168.85.134
[root@control ~]# host xiaogang.com
xiaogang.com has address 192.168.85.134
准备两台主机,第一台主机安装好dns服务器的软件。另一台不安装软件,把dns改为第一台的ip地址。
在第二台主机上测试
[root@manged ~]# host www.xiaogang.com
www.xiaogang.com is an alias for webser.xiaogang.com.
webser.xiaogang.com has address 192.168.85.134
webser.xiaogang.com has address 192.168.85.135
[root@manged ~]# host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 183.2.172.185
www.a.shifen.com has address 183.2.172.42
www.a.shifen.com has IPv6 address 240e:ff:e020:9ae:0:ff:b014:8e8b
www.a.shifen.com has IPv6 address 240e:ff:e020:966:0:ff:b042:f296
在本地域名服务器找不到解析时,本地域名服务器会充当转发服务器向根域进行递归和迭代查询
只做转发服务器实验
[root@kittod ~]# cat /etc/named.conf
options {
listen-on port 53 { 192.168.226.130; };
forward only;
forwarders { 114.114.114.114; };
};
[root@kittod ~]# systemctl restart named