DNS(Domain Name System),域名解析系统,能够将名称与对应的IP进行相互解析的分布式数据库,是互联网架构模型中的一个基础服务。当用户在浏览器中输入一个网站的域名之后(如www.google.com),操作系统会将该请求发送给DNS服务器,DNS服务器将该域名对应的IP响应给用户,用户根据这个IP去访问相对应的网站以实现上网功能。具体过程请参考:浅谈一次URL请求过程
一、域名
用户在浏览器中输入域名www.google.com,但是,在进行解析的时候却是从后往前开始进行解析的。完整的域名为www.google.com.,注意在结尾有一个.
,也就是先解析.
,再解析com
,再解析google
,最后才解析www
。
.
:表示根域名服务器。全球总共有13组根域名服务器,这13组根域名服务器是互联网域名解析系统(DNS)中最高级别的域名服务器,负责返回顶级域名的权威域名服务器的地址。为了输入简单,最后一个.
往往可以省略不写。
com
:是域名解析系统中的顶级域名,又称之为一级域名。除了com
之外还有cn
、org
、net
、tech
、edu
等,这里不一一列举。这些顶级域包含着二级域的地址。
google
:是域名解析系统中的二级域名,二级域名众多是识别一个网站的标识。如baidu
、jd
、taobao
、tencent
等。
www
:是域名解析系统的三级域名。但是可能有的资料显示的不同,但是理解其中的意思就好。这个时候www
解析的地址就是真正的主机所在的地址。而返回给用户的IP就是www
解析出来的IP。
如果还有更多的子域的话依次往下类推即可,最高可达127个层级。域名解析只能从根域名往下进行解析,下级的域不可能知道上级域的地址。
DNS域名服务器解析域名方式分为两种:递归与迭代
递归:当DNS服务器接收到用户请求的时候发现解析库中没有该域名对应地址的记录或者本地没有缓存,那么就会将相应的请求转发给其他的DNS服务器,而这个DNS服务器必须将结果返回给我,不管结果是正确还是错误。
迭代:当DNS服务器接收到用户请求的时候发现解析库中没有该域名对应地址的记录或者本地没有缓存,那么该DNS就会进行以下操作:以www.google.com
为例
1、DNS服务器直接去查找根域名服务器是否知道
www.google.com
这个域名的地址,根域名服务器说不知道该域名的地址,但是我知道com
的域名地址,于是将com
的地址返还给DNS服务器
2、DNS服务器根据根域名服务器相应的com
域的地址去查询com
的域名服务器,问是否知道www.google.com
的地址,com
说我不知道这个域名的地址,但是我知道
3、DNS服务器根据com
域名服务器响应的www.google.com
的地址,www.google.com
的地址,并将该地址相应给客户端
二、DNS
DNS是一种应用层协议,监听在tcp的53号端口与udp的53号端口上。bind是DNS协议的实现,而bind的进程为named。DNS服务器分为四种:主DNS服务器、从DNS服务器、缓存DNS服务器、转发服务器
这里以CentOS为例:
安装bind程序
# yum install -y bind
查看bind生成的文件
# rpm -ql bind
/etc/named.conf bind主配置文件
/etc/named.rfc1912.zones 定义区域解析文件所在的路径
/usr/sbin/named bind的启动进程
/var/named/ 这个目录中存放着解析文件
/etc/named.conf
配置文件是bind的主配置文件,其中存储着named进程监听的端口,是否允许递归等众多功能。注意该配置文件的书写格式,要在结尾加上;
options
:全局配置
listen-on port 53 { 127.0.0.1; };
:监听的地址以及端口,通常我们需要将监听的地址改为localhost
,或者在后面加上当前主机的IP地址
listen-on-v6 port 53 { ::1; };
:IPv6的监听端口和地址,一般将这一个选项注释,在开头使用//
进行注释
directory "/var/named";
:记录的存放路径
allow-query { localhost; };
:允许到本主机进行查询记录的主机地址,可以将localhost
设置成any
也可以设置成从服务器的地址
recursion yes;
:是否允许递归查询,如果禁止的话,该DNS服务器就不会进行迭代
以上便是options
中比较重要的配置,其他的可以注释了
/etc/named.rfc1912.zones
中配置着资源记录的名称以及存放路径
实例:
zone "baidu.com" IN {
type master;
file "baidu.com.zone";
allow-update { none; };
};
zone "baidu.com" IN
:固定格式,要名称就是你要解析的二级域名
type master;
:master表示主节点,slave表示从节点,hint是根域名服务器的使用格式,forward表示转发服务器
file "baidu.com.zone";
:表示资源解析文件名称
allow-update { none; };
:表示不允许更新,这是针对从服务器的。如果有从服务器,那么一定要将此功能打开
/var/named/
此目录下存储着所有的资源记录的文件
资源记录:RR
记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX
SOA:起始授权记录。一个区域解析库有且只有一个SOA,并且为解析库的第一条记录。它标志着该解析库为哪个区域服务,并由谁负责
A:FQDN(Fully Qualified Domain Name,完全合格的域名) –> IPv4
AAAA: FQDN –> IPv6
PTR: PoinTer,IP –> FQDN
NS: Name Server, 专用于标明当前区域的DNS服务器
CNAME: 别名记录
MX:邮件服务
定义格式:
name [TTL] IN rr_type value
注:
① TTL可以从全局继承;
② @可用于引用当前区域的名字
③ 同一个名字可以通过多条记录定义多个不同的值,此时DNS会以轮询的方式响应
④ 同一个值也可能有多个不同定义的名字,通过多个不同的名字指向同一个值进行定义,仅表示通过多个不同的名字可以找到同一个主机
1、SOA:
name:当前区域的名字
value:由众多部分组成
(1) 当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字
(2) 当前区域管理员的邮箱地址,但地址中的@符号要换成.符号
(3) (主从服务协调属性的定义以及否定的答案的同意TTL)
2、NS:
name:当前区域的名字
value:当前区域的某DNS服务器的名字,一个区域可以有多个NS记录
例如:
baidu.com. IN NS ns1.baidu.com.
IN NS ns2.baidu.com.
注意:
相邻的两个资源记录的name相同时,后续的可以省略
对NS记录而言,任何一个NS记录后面的服务器名字,都应该在后续有一个A记录
3、MX:
name:当前区域的名字
value:当前区域的某邮件服务器(smtp服务器)的主机名
一个区域内,MX记录可以有多个,但每个记录的value之前应该有一个数字(0-99),表示此服务器的优先级,数字越小,优先级越高
例如
baidu.com. IN MX 10 mx1.baidu.com.
baidu.com. IN MX 20 mx2.baidu.com.
注意:对MX记录而言,任何一个MX记录后面的服务器名字,都应该在后续对应一个A记录
5、4:
name:某主机的FQDN
value:主机名对应主机的IP地址
例如:
www.baidu.com. IN A 1.1.1.1
www.baidu.com. IN A 1.1.1.2
mx1.baidu.com. IN A 1.1.1.2
mx2.baidu.com. IN A 1.1.1.3
5、AAAA: 类似A记录
IPv6的地址现在使用较少,而且定义格式与A记录相似,所以这里不作过多介绍
6、PTR:
name: IP, 有特定的格式,把IP地址反过来写,1.2.3.4要写作4.3.2.1 ,而且要有特定的后缀:in-addr.arpa
value: FQDN
例如
4.3.2.1.in-addr.arpa. IN PTR www.baidu.com.
简写成
4 IN PTR www.baidu.com.
注意:网络地址及后缀可以简写,主机地址仍然需要反着写
8、CNAME:
name: 别名的FQDN
value:正式名字的FQDN
例如
web.baidu.com. IN CNAME www.baidu.com.
三、DNS配置
1、一个简单的DNS配置实例
(1)配置主配置文件/etc/named.conf
,修改监听地址,修改允许请求地址
(2)配置区域文件,增加要解析的地址
# vim /etc/named.rfc1912.zones
在其中添加要解析的地址,例如
zone "baidu.com" IN {
type master;
file "baidu.com.zone"; //file表示"baidu.com"这个二级域的解析记录所在的配置文件的路径与名称,完整路径应该是/var/named/baidu.com.zone,但是在/etc/named.conf中的全局变量options中配置过directory "/var/named",所以这里不需要写
};
(3)编辑/var/named/baidu.com.zone
/var/named/baidu.com.zone
便是区域解析文件,里面存放着域名对应的地址记录,这个文件有着严格的格式,在前面就已经大致的描述过,现在看看到底该怎么去配置这个文件。注意:;
表示这个配置文件的注释
$TTL 1D //定义缓存时间的宏
$ORIGIN baidu.com. //定义显式的宏
@ IN SOA dns1 admin.baidu.com. (
;@表示当前区域定义的名称baidu.com.,如果当前区域没有定义$ORIGIN那么则表示在/etc/named.rfc1912.zones中定义的该文件的解析域
;SOA:SOA记录,必须定义在解析记录的第一条
;dns1:dns1只是简写,系统会自动在后面补上.baidu.com.,表示解析该地址的DNS服务器的名称
;admin.baidu.com.:管理员的邮箱,理应是admin@baidu.com.,但是规定@必须换成'.', 不然会与前面的@造成冲突
2017092200 ;序列号,最好为10位数字。每修改一次主服务器的配置文件,那么序列号都要手动加一,这样以便从服务器能够自动同步
2H ;从服务器来主服务器上同步的时间间隔
1H ;如果从服务器同步失败,那么失败后来主服务器上同步的时间间隔
1W ;如果从服务器一直同步失败,那么在一周后会替代主服务器
3H ;否定答案的保存时间,在DNS进行解析的过程中,有的域名能够正确解析到对应的地址,但是有的域名不存在,那么会给客户端返回一个域名不存在的错误答案,也就是否定答案
)
IN NS ns1 ;空表示上一条记录的名称。表示baidu.com.这个域名由ns1.baidu.com.这台域名服务器,这里都是简写。
IN NS ns2 ;表示baidu.com.这个域名也可以由ns2.baidu.com.这台域名服务器进行解析,两台域名服务器解析一个主机则可以进行轮询
ns1 IN A 1.1.1.1 ;A记录,指明ns1这台域名服务器所在的地址,也就是当前主机的地址
ns2 IN A 1.1.1.2 ;指明ns2这台域名服务器所在的地址
www IN A 1.1.1.3 ;表示www.baidu.com.这个域名所在的主机地址
ftp IN CNAME www ;别名,当访问ftp.baidu.com.时实质上访问的还是www.baidu.com.
2、从DNS服务器的配置
从服务器能够每隔一段时间就去主服务器上同步数据,而且当主服务器的数据发生改变之后从服务器也会随之改变
/etc/named.conf
的配置与主服务器相同,所以不一一赘述。
配置/etc/named.rfc1912.zones
# vim /etc/named.rfc1912.zones
zone "baidu.com" IN {
type slave; ;slave表示从
masters { 1.1.1.1 }; ;写明主服务器的地址
file "slaves/baidu.com.zone"; ;解析文件所在路径以及名称
};
注意:
1、从服务器与主服务器的配置不同,它不需要自己去定义解析文件,而是从主服务器上面复制过来的,而且从服务器的解析文件所在的路径也是比较独特的。必须放在/var/named/slaves
目录下
2、在配置从服务器的时候,主服务器的NS记录一定要指向从服务器,不然主服务器在修改了序列号的时候无法通知给从服务器
3、主从服务器时间应该保持一致
4、如果主从服务器的bind版本不一致,那么从服务器的版本应该高于主
3、转发服务器的配置
缓存服务器不具有解析文件,仅仅只是将请求转发给上一级域名服务器或者其他DNS服务器,同时将请求结果缓存至本地,并随之将结果发送给客户端。以便下次有相同的请求过来时能够进行快速响应。
转发服务器有两种:全局转发与局部转发
全局转发:修改/etc/named.conf
主配置文件即可
# vim /etc/named.conf
options {
listen-on port 53 { localhost; };
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 { any; };
recursion yes;
forward first|only; ;添加两项即可
forwarders { 8.8.8.8; };
dnssec-enable no; ;注意关闭dns安全功能
dnssec-validation no;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
forward first|only
:forward表示进行转发,原本是没有的,需要用户自己加进去。forward有两个参数,first与only。first表示先转发给指定的服务器,如果指定的服务器不能响应那么则再去迭代,only表示只转发给指定的服务器,如果指定的服务器不能响应则向客户端响应失败答案,二选一即可
forwarders { 8.8.8.8; };
:指明转发的服务器
局部转发:修改/etc/named.rfc1912.zones
即可
# vim /etc/named.rfc1912.zones
zone "baidu.com" IN {
type master;
forward first|only;
forwarders { 8.8.8.8; };
};
表示baidu.com
这个域名请求转发至8.8.8.8
这个主机上
4、缓存服务器
缓存服务器与转发服务器相似,但是缓存服务器不定义forward
。如果缓存没有命中则缓存服务器直接去迭代。
配置缓存服务器特别简单,只要将/etc/named.conf
这个配置文件按照配置主服务器那样修改一下即可。这里就不详述了。
5、反向解析文件
反向解析文件就是将地址解析为域名的解析文件。配置起来与之前的配置有一些差异,这里就来说说。
主配置文件与前面一样,这里主要从/etc/named.rfc1912.zones
开始描述:
# vim /etc/named.rfc1912.zones
zone "100.168.192.in-addr.arpa" IN {
type master;
file "192.168.100.zone";
};
反向解析文件要从后往前写,而且要加上后缀.in-addr.arpa
# vim /var/named/192.168.100.zone
$TTL 1D
$ORIGIN 100.168.192.in-addr.arpa.
@ IN SOA ns1.baidu.com. admin.baidu.com. (
2017092200
2H
1H
1W
3H
)
IN NS ns1.baidu.com.
IN NS ns2.baidu.com.
7 IN PTR ns1.baidu.com.
8 IN PTR ns2.baidu.com.
9 IN PTR www.baidu.com.
$ORIGIN 100.168.192.in-addr.arpa.
:这里要注意,$ORIGIN
要与定义在/etc/named.rfc1912.zones
中的域名一样
ns1.baidu.com.
:在写域名服务器的时候一定不能简写成ns1
,不然系统在不上后缀的时候会变成ns1.100.168.192.in-addr.arpa.
这样。
7 IN PTR ns1.baidu.com.
:表示7.100.168.192.in-addr.arpa.
的域名是ns1.baidu.com.
注意:
在反向解析文件中不需要出现其他的记录类型,只需要有ISO
、NS
、PTR
记录即可
一般的反向解析文件中的记录都是根据主服务器中的A
记录来进行写的,主服务器中解析的地址有多少个,那么反向解析文件中的PTR
记录就有多少个
6、DNS高级应用之智能DNS
什么是智能DNS?
智能DNS又称之为CDN,根据不同的地区,不同运营商的不同请求,将该请求转发至最佳的web缓存服务器中。如,当有上海电信的请求发送过来,DNS服务器将请求解析到上海电信机房的web缓存服务器中。
智能DNS的实现:view(视图)
1、一个bind服务器可以定义多个view,每个view中可定义一个或者多个zone
2、每个view用来匹配一组客户端
3、多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件
注意:
1、一旦启用了view,所有的zone都只能定义在view中
2、根区域解析文件可以仅定义在允许递归请求的view中
3、客户端请求到达时,是自上而下检查每个view所服务的客户端列表,如果被其中一个视图所匹配,则不会被其他视图所匹配
智能DNS的实现过程:
主配置文件/etc/named.conf
与上面定义的大致相同,但是要将根解析文件的定义删除,因为所有的zone
都要定义在view
中
编辑/etc/named.rfc1912.zones
# vim /etc/named.rfc1912.zones
view internal { ;internal表示视图名称,自定义
match clients { 127.0.0.0/8; 172.18.0.0/16 }; ;视图固定格式,表示客户端匹配模式
allow-recursion { 127.0.0.0/8; 172.18.0.0/16 }; ;允许递归
zone "." IN {
type hint;
file "named.ca";
};
... ;还要将原本里面的配置文件包含进去,如localhost
zone "baidu.com" IN {
type master;
file "baidu.com.internal"; ;区域解析文件名称可自行定义
};
};
view external {
match-clients { any; }; ;any表示所有
zone "baidu.com" IN {
type master;
file "baidu.com.external";
allow-update { none; }; ;表示不允许更新
};
};
这里对区域解析配置文件进行了省略,但是一定要注意,两个区域解析配置文件在解析www.baidu.com这个名称的时候所解析到的主机IP地址一定是不同的,也就是www所对应的A记录的IP地址不同。
在实现match-clients
上可以使用acl
,也就是访问控制列表,把一个或者多个地址归并为一个集合,并通过一个统一的名称调用,如:
# vim /etc/named.conf
acl mynet { ;acl在定义的时候一定要定义在options上方
172.18.0.0/16;
127.0.0.0/8;
};
options {
...
};
# vim /etc/named.rfc1912.zones
view internal {
match-clients { mynet };
...
};
这个例子实现了对不同网段的主机进行解析
www.baidu.com
的时候解析到了不同web上,如果在进一步可以实现不同地区的地址可以解析到该地区对应的最近的web上,这样做大大加快了响应速度。
–end–