网络出现的早期是使用IP地址通讯的,那时就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和Windows也继承保留了这个文件)。这个文件中记录着主机名称和IP地址的对应表。这样只要输入主机名称,系统就会去加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。
但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪重负,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的演化,直到现今的多层架构体系。
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS可以使用TCP和UDP的53端口,基本使用UDP协议的53端口。
DNS 的分布式数据库是以域名为索引的,每个域名实际上就是一棵很大的逆向树中路径,这棵逆向树称为域名空间(domain name space)。
域是分层管理的。
第一层:根域
第二层 :顶级域 (tld top level domain)
第三层及以下:
顶级域下来就是普通的域,公司或个人在互联网上注册的域名一般都是这些普通的域,如jd.com。
注:正向解析与反向解析完全是两个不同的库,这儿只是为了方便理解。
以百度(www.baidu.com)和百度贴吧(tieba.baidu.com)来举例。
域名: 不论是 www.baidu.com 还是 tieba.baidu.com,它们的域名都是 baidu.com,严格地说是 “baidu.com.”。这是百度所购买的com域下的一个子域名。
主机名: 对于 www.baidu.com 来说,主机名是 www,对于 tieba.baidu.com 来说,主机名是 tieba。其实严格来说,www.baidu.com 和 tieba.baidu.com 才是主机名,它们都是 baidu.com 域下的主机。一个域下可以定义很多主机,只需配置好它的主机名和对应主机的IP地址即可。
FQDN: FQDN(Fully Qualified Domain Name),称为完整主机名,是指包含了所有域的主机名,其中包括根域。FQDN 可以说是主机名的一种完全表示形式,它从逻辑上准确地表示出主机在什么地方。例如 www.baidu.com 的 FQDN 是 “www.baidu.com.”,com 后面还有个点,这是根域;tieba.baidu.com 的 FQDN 是 “tieba.baidu.com.”。
这儿以我们访问 www.baidu.com 为例。
(1) 本地主机首先会查找本机 DNS 缓存,然後查询本地 hosts 文件是否有 www.baidu.com. 这个 FQDN 所对应的主机 IP 地址,若有,则直接使用;若没有,本机将向指定的 dns server 发起查询请求(这个 DNS 服务器就是计算机里设置指向的 DNS)。
(2) DNS 服务器收到询问请求,首先查看自己是否有 www.baidu.com 的缓存,如果有就直接返回给客户端,没有就越级上访到根域".",并询问根域。
(3) 根域只是记录了 .com 域的相关信息,所以将 .com 域的地址返回给 DNS 服务器。
(4) DNS 服务器根据根域返回的信息向 .com 域发起查询请求,由于 .com 域只记录了 baidu.com 的信息,所以将 baidu.com 域的地址返回给 DNS 服务器。
(5) DNS 服务器根据 .com 域返回的信息向 baidu.com 域发起查询请求,于是 baidu.com 域的 DNS 服务器就去查询本地的记录,找到了 www 主机对应 IP 地址,将该 IP 地址返回给 DNS 服务器。
(6) DNS 服务器将得到的 IP 地址返回给客户端,并缓存一份结果在自己机器中,方便下一次客户端再次访问该站点。
(7) 客户端得到回答的IP地址后缓存下来,并去访问 www.baidu.com,然后 www.baidu.com 就把页面内容发送给客户端,也就是百度页面。
注:
1.本机查找完缓存后如果没有结果,会先查找hosts文件,如果没有找到再把查询发送给DNS服务器,但这仅仅是默认情况,这个默认顺序是可以改变的。在/etc/nsswitch.conf中有一行" hosts: files dns"就是定义先查找hosts文件还是先提交给DNS服务器的,如果修改该行为"hosts: dns files"则先提交给DNS服务器,这种情况下hosts文件几乎就不怎么用的上了。
2.由于缓存是多层次缓存的,所以真正的查询可能并没有那么多步骤,上图的步骤是完全没有所需缓存的查询情况。假如某主机曾经向DNS服务器提交了www.baidu.com的查询,那么在DNS服务器上除了缓存了www.baidu.com的记录,还缓存了".com"和"baidu.com"的记录,如果再有主机向该DNS服务器提交ftp.baidu.com的查询,那么将跳过".“和”.com"的查询过程直接向baidu.com发出查询请求。
3.DNS解析过程中存在两种查询类型:递归查询(从客户机至指定DNS服务器)、迭代查询(从DNS服务器至各个域)。
主DNS服务器: 就是一台存储着原始资料的DNS服务器。
从DNS服务器: 使用自动更新方式从主DNS服务器同步数据的DNS服务器。也成辅助DNS服务器。
缓存服务器: 不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的结果,也叫递归服务器。
转发器: 这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。
DNS服务器是如何根据主机名解析出 IP 地址,或从 IP 地址解析出主机名的呢?这儿我们就要用到资源记录(Resource Record),简称 RR。常用的记录类型有:A、AAAA、SOA、NS、PTR、CNAME、MX 等。
资源记录的定义格式:
name [TTL] IN RR_TYPE value
SOA(Start Of Authority): 起始授权记录,一个区域解析库有且只能有一个SOA记录,而且必须放在第一条。
name:当前域的名称,如 "baidu.com.",或"4.3.2.in-addr.arpa."。
value:由多部分组成。
(1) 当前域的名称(也可使用主DNS服务器名称);
(2) 当前域管理员的邮箱地址,但地址中不能使用@符号,一般使用 "." 来代替;
(3) 主从服务协调属性的定义;
第一个值是区域数据文件的序列编号serial,每次修改此区域数据文件都需要修改该编号值以便让slave dns服务器同步该区域数据文件。
第二个值是刷新refresh时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件的时间间隔。
第三个值是重试retry时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件时,如果联系不上master,则等待多久再重试联系,该值一般比refresh时间短,否则该值表示的重试就失去了意义。
第四个值是过期expire时间值,表示slave dns服务器上的区域数据文件多久过期。
第五个值是negative answer ttl,表示客户端找dns服务器解析时,否定答案的缓存时间长度。
这几个值可以分行写,也可以直接写在同一行中使用空格分开。
例如:
test.com. IN SOA test.com. admin.test.com. (
2018110601 ;serial
2H ;refresh 2 hours
10M ;retry 10 min
1W ;expire 1 week
1D ;negative answer ttl 1 day
)
NS(Name Server):存储的是该域内的 DNS 服务器相关信息。即 NS 记录标识了哪台服务器是 DNS 服务器。
name:当前域的名称。
value:当前域的某 DNS 服务器的名称,如 "ns.test.com."。
例如
test.com IN NS ns1.test.com
test.com IN NS ns2.test.com
注:一个域内可以有多个 ns 记录,即可以存在多台 DNS 服务器。
A(Address):存储的是域内主机名所对应的ip地址。
name:某 FQDN,如 "www.test.com."。
value:某 IPv4 地址。
例如:
www.test.com. IN A 192.168.100.200
注:AAAA记录格式和A记录格式相似,但 value 是某 IPv6 地址。
PTR(Pointer):和A记录相反,存储的是 ip 地址对应的主机名,该记录只存在于反向解析的区域数据文件中(并非一定)。
name:IP 地址,有特定格式,且加上特定后缀,如:"1.2.3.4" 的记录应该写为 "4.3.2.in-addr.arpa"。
value:某 FQDN
例如:
4.3.2.in-addr.arpa IN PTR www.test.com.
CNAME(Canonical Name):表示规范名的意思,其所代表的记录常称为别名记录。之所以如此称呼,就是因为为规范名起了一个别名。什么是规范名?可以简单认为是 FQDN。
name: FQDN 格式的别名
value: FQDN 格式的初始名
例如:
web.test.com. IN CNAME www.test.com
MX(Mail Exchanger):邮件交换器 。
name:当前的域名
value:当前域内某邮件交换器的主机名
例如
test.com. IN MX 10 mx1.test.com.
test.com. IN MX 20 mx2.test.com.
注:MX记录可以有多个,但每一个记录的value之前应该有一个数字表示优先级 。优先级:0-99,数字越小优先级越高。
Bind 是一款开放源码的 DNS 服务器软件,Bind由美国加州大学 Berkeley 分校开发和维护的,全名为 Berkeley Internet Name Domain 它是目前世界上使用最为广泛的 DNS。
实验环境:CentOS 7
~]# yum info bind
...
Installed Packages
Name : bind
Arch : x86_64
Epoch : 32
Version : 9.9.4
Release : 61.el7_5.1
Size : 4.3 M
Repo : installed
From repo : updates
Summary : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server
URL : http://www.isc.org/products/BIND/
License : ISC
Description : BIND (Berkeley Internet Name Domain) is an implementation of the DNS
: (Domain Name System) protocols. BIND includes a DNS server (named),
: which resolves host names to IP addresses; a resolver library
: (routines for applications to use when interfacing with DNS); and
: tools for verifying that the DNS server is operating properly.
~]# yum install -y bind
...
配置文件列表:
主配置文件:/etc/named.conf
主配置文件包含进来的其他文件:
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
解析库文件
/var/named/目录下:一般名字为:ZONE_NAME.zone
主配置文件:named.conf
options { ----> 全局配置段
...
};
logging { ----> 日志配置段
...
};
zone "." IN { ----> 区域配置段,可定义在主配置文件,也可定义在"/etc/named.rfc1912.zones"文件中
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
注:每个配置语句必须以分号结尾。
这里以解析 chuan.com 域为例。
1.修改主配置文件:
~] vim /etc/named.conf
listen-on port 53 { 192.168.179.110; }; # DNS服务器地址
2.修改 named.rfc1912.zones 文件:
~]# vim /etc/named.rfc1912.zones
zone "chuan.com" IN { ----> 域定义格式
type master; ----> [hint|master|slave|forward] 根、主、从、转发
file "chuan.com.zone"; ----> 自定义解析域文件名称
};
#添加到最后即可
3.创建"chuan.com.zone"文件:
~]# cd /var/named/
~]# vim chuan.com.zone
$TTL 1D
@ IN SOA @ admin.qq.com. (
20181105 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
ns1 A 192.168.179.110
www A 192.168.179.115
A 192.168.179.116
web CNAME www
bbs A 192.168.179.115
~]# chown root:named chuan.com.zone
~]# chmod 640 chuan.com.zone
注:
(1) "$"符号:定义宏。最常见的是"$TTL"、"$ORIGIN"。
(2) FQDN自动补齐:在区域数据文件中,没有使用点号"."结尾的,在实际使用的时候都会自动补上域名,使其变为 FQDN。
例如:上面文件中的 ns1,会自动补全为 ns1.chuan.com.
(3) 若上一条记录与下一条记录主机名相同,则下一条可以省略,默认为上一条的主机名。如上文件中 www下为空,默认为下一条主机名也为www。
(4) "@" 默认代表代表域名。
4.检查配置文件
~]# checkconf #默认检查 named.conf 和 named.rfc1912.zones 文件
~]# named-checkzone chuan.com chuan.com.zone
zone chuan.com/IN: loaded serial 20181105
OK
5.启动服务
~]# systemctl start named
~]# netstat -lnput
tcp 0 0 192.168.179.110:53 0.0.0.0:* LISTEN 6365/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 6365/named
udp 0 0 192.168.179.110:53 0.0.0.0:* 6365/named
6.修改本机DNS服务器指向
现在我们知道,一台主机访问另一台主机,需要通过FQDN 解析出对应的 IP,首先会先查找本地缓存以及 hosts文件,若没有就会向本机指向的 DNS 服务器发起递归请求。所有此处我们需要将本机指向的 DNS 服务器指向我们自己搭建的 DNS 服务器,否则将无法被解析。
~]# vim /etc/resolv.conf
nameserver 192.168.179.110
6.测试DNS解析
常用的测试DNS解析的命令有 nslookup、host、dig。这儿以 dig 进行测试。若没有 dig 工具,可装上 bind-utils 包。
dig:
用法:
dig [-t RR_TYPE] name [@SERVER] [query options]
正向解析:
dig -t A name [@SERVER]
反向解析:
dig -x IP
~]# dig -t A www.chuan.com @192.168.179.110
...
;; ANSWER SECTION:
www.chuan.com. 86400 IN A 192.168.179.116
www.chuan.com. 86400 IN A 192.168.179.115
...
此配置与正向解析配置大体相同,仅给出差异配置。
1.修改named.rfc1912.zones 文件:
zone "179.168.192.in-addr.arpa" IN {
type master;
file "179.168.192.in-addr.arpa.zone";
};
2.创建"179.168.192.in-addr.arpa.zone"文件:
$TTL 1D
@ IN SOA @ admin.dns.com (
2018110601 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1.chuan.com.
110 IN PTR ns1.chuan.com.
115 IN PTR www.chuan.com.
116 IN PTR www.chuan.com.
115 IN PTR bbs.chuan.com.
注:记得修改文件权限,然后重启服务即可。
在只有一台dns服务器时,所有的dns解析过程都由这台dns服务器负责,压力极大。而且极不安全,因为这台dns服务器一垮掉,所有的解析服务都停止,整个网站也就垮了。
无论是出于负载均衡考虑,还是数据安全可靠的考虑,至少都应该配置2台或2台以上的dns服务器,其中必须有一台是master服务器,其余的是slave服务器。
master 和 slave 服务器都可以配置成向外提供解析服务。但 slave 上的区域数据从何而来?不是自行书写区域数据文件而来,而是从 master 服务器上复制而来。从 master 复制区域数据到 slave 的过程,DNS 术语称之为"区域传送"。
基于上面配置的192.168.179.110为主DNS,将192.168.179.113配置为从DNS。
master:192.168.179.110
~]# vim /etc/named.rfc1912.zones
zone "chuan.com" IN {
type master;
file "chuan.com.zone";
allow-transfer { 192.168.179.113; }; #表示允许谁来同步数据,不设置默认任意主机都可以来同步
};
~]# vim /var/named/chuan.com.zone
...
NS ns1
NS ns2
ns1 A 192.168.179.110
ns2 A 192.168.179.113
...
注:若不加上这条记录,主DNS服务器将不能解析到从服务器的地址。
slave:192.168.179.113
~]# vim /etc/named.conf
listen-on port 53 { 192.168.179.113; };
~]# vim /etc/named.rfc1912.zones
zone "chuan.com" IN {
type slave;
file "slaves/chuan.com.zone"; ----> 同步文件放置在slaves目录下
masters { 192.168.179.110; }; ----> 指定主服务器
};
~]# systemctl start named ----> 每次启动时都会进行一次"区域传送",可在/var/named/slaves/ 下查看同步文件。
注:上面的示例中使用 file 指令,但实际上 slave 是可以不要区域数据文件的,它从master上传送复制区域数据后会将其缓存下来,并从缓存中提供查询解析服务。如果在slave区域内指定 file 指令,则表示在区域传送时还将备份一份数据到file指定的文件中,所以该文件对named组要求有写权限。在安装 bind 后,在/var/named目录下自动生成了一个 /var/named/slaves 目录,其属组和权限已经设置好,正适合放置区域传送的备份文件。如果自定义存放备份文件的路径,则其存放目录属组要求为 named,且属组有rwx权限。
在上面的 DNS 解析流程中,我们将 DNS 解析请求发送给本机指定的 DNS 服务器后,它将会一级一级的去查找域名进行解析,这里的每一级都是一个域,并且每个域都是上级域的子域,那为什么这个域能告诉我们的 DNS 服务器它的子域的 DNS 地址呢?这里就有一个新话题,叫做子域授权,也就是说本级域只负责解析该域名,对于下一级域名的解析我只告诉你它所对应的 DNS 服务器地址,具体的解析权交给下级来完成。
如我们查找 www.baidu.com 的时候,根反馈说我只负责解析根域的主机,但我可以告诉你我的子域 com 的 DNS 服务器地址。然后我们又去找 .com 域进行解析,.com 域告诉我们它只负责 .com 的解析,但它可以告诉我们 baidu.com 域的 DNS 服务器地址等,从而找到 www.baidu.com 的地址。
如何配置子域:
(1) “chuan.com” 的区域数据文件中,需要添加子域 “ftp.chuan.com” 的 DNS 服务器的NS记录和A记录,如果该子域有多个 DNS 服务器,则需要添加多个NS记录和对应的A记录。
(2).子域 master dns 服务器上的区域数据文件中,需要书写SOA记录,NS记录和NS对应的A记录。
192.168.179.110: "chuan.com"域
~]# vim /var/named/chuan.com.zone
NS ns1
ftp NS ns2.ftp
ns1 A 192.168.179.110
ns2.ftp A 192.168.179.113
注:其余配置与正向解析配置相同。
192.168.179.113:"ftp.chuan.com"域
~]# vim /etc/named.rfc1912.zones
zone "ftp.chuan.com" IN {
type master;
file "ftp.chuan.com.zone";
};
]# vim /var/named/ftp.chuan.com.zone
$TTL 1D
@ IN SOA @ admin.dns.com. (
2018110601 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1
ns1 A 192.168.179.113
www A 192.168.179.115
web A 192.168.179.116
注:子域必须要有SOA记录,否则将不会有权限单独管理,解析也交由赋予处理。
注:以上配置注意文件权限,以及防火墙等对实验造成的影响。
访问控制是指仅对定义的网络进行解析。访问控制是通过 acl 函数来实现的,acl 把一个或多个地址归并为一个集合,并通过一个统一的名称调用。需要注意的是:acl 只能先定义,后使用。因此,其一般在 named.conf 文件的 options 字段的前面定义。
acl 的格式:
acl acl_name {
ip;具体的ip地址
net/prelen;表示一个网段
};
例如:
acl mynet {
172.168.179.110
172.168.179.0/24
};
allow-query { localhost; };
allow-query { mynet; };
...
bind 内置的 acl:
none :没有一个主机
any :任意主机
localhost :本地主机
localnets:本机的IP同掩码
总结:以上是我初学 DNS 的一些理解,希望能对大家有一点帮助,有错误也希望大家指出,谢谢。