DNS 域名系统(英文:Domain Name System,缩写:DNS)是因特网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。
是一个域名服务,应用层协议。
原理篇
DNS组成
根域(.)
顶级域(.com, .net, .org, .gov, .edu, .mil,.ac)
二级域(baidu.com,google.com ... ...)
dns查询
迭代查询
递归查询
如下图,从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间的交互查询就是迭代查询。
总结:
1.递归查询:
一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机;
2.迭代查询(反复查询):
一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求;
所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询)”
也就是递归就是交给下一个服务器解决(下一个就相当于客户了,所以他也可以选择去递归,或者迭代)(迭代就是返回给当前的,当前自己再去处理)
递归即递给服务器,所有操作都有服务器来完成。
举例:比如学生问老师一个问题,王老师告诉他答案这之间的叫递归查询。这期间也许王老师也不会,这时王老师问张老师,这之间的查询叫迭代查询!
DNS解析
正向解析区域和反向解析区域
正向解析是将域名映射为IP地址
www.baidu.com --> 202.108.22.5
反向解析是将IP地址映射为域名
202.108.22.5 --> www.baidu.com
注意:二者的名称空间,非为同一个空间,即非为同一棵树;因此,也不是同一个解析库;
主-从DNS服务器
主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操作均可进行;
从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操作;
“复制”操作的实施方式:
序列号:serial, 也即是数据库的版本号;主服务器数据库内容发生变化时,其版本号递增;
刷新时间间隔:refresh, 从服务器每多久到主服务器检查序列号更新状况;
重试时间间隔:retry, 从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;
过期时长:expire,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;
否定答案的缓存时长:
主服务器”通知“从服务器随时更新数据;
区域传送:
全量传送:axfr, 传送整个数据库;
增量传送:ixfr, 仅传送变量的数据;
区域(zone)和域(domain):
baidu.com域:
FQDN --> IP
正向解析库;区域
IP --> FQDN
反向解析库;区域
区域数据库文件:
资源记录:Resource Record, 简称rr;
记录有类型:A, AAAA, PTR, SOA, NS, CNAME, MX
SOA:Start Of Authority,起始授权记录; 一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;
NS:Name Service,域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主的;
A: Address, 地址记录,FQDN --> IPv4;
AAAA:地址记录, FQDN --> IPv6;
CNAME:Canonical Name,别名记录;
PTR:Pointer,IP --> FQDN
MX:Mail eXchanger,邮件交换器;
优先级:0-99,数字越小优先级越高;
资源记录的定义格式:
语法:name [TTL] IN RR_TYPE value
SOA:
name: 当前区域的名字;例如”mageud.com.”,或者“2.3.4.in-addr.arpa.”;
value:有多部分组成
(1) 当前区域的区域名称(也可以使用主DNS服务器名称);
(2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代;
(3) (主从服务协调属性的定义以及否定答案的TTL)
例如:
baidu.com. 86400 IN SOA baidu.com. admin.magedu.com. (
2017010801 ; serial
2H ; refresh
10M ; retry
1W ; expire
1D ; negative answer ttl
)
NS:
name: 当前区域的区域名称
value:当前区域的某DNS服务器的名字,例如ns.magedu.com.;
注意:一个区域可以有多个ns记录;
例如:
baidu.com. 86400 IN NS ns1.baidu.com.
baidu.com. 86400 IN NS ns2.baidu.com.
MX:
name: 当前区域的区域名称
value:当前区域某邮件交换器的主机名;
注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级;
例如:
baidu.com. IN MX 10 mx1.baidu.com.
baidu.com. IN MX 20 mx2.baidu.com.
A:
name:某FQDN,例如www.baidu.com.
value:某IPv4地址;
例如:
www.baidu.com. IN A 1.1.1.1
www.baidu.com. IN A 1.1.1.2
bbs.baidu.com. IN A 1.1.1.1
AAAA:
name:FQDN
value: IPv6
PTR:
name:IP地址,有特定格式,IP反过来写,而且加特定后缀;例如1.2.3.4的记录应该写为4.3.2.1.in-addr.arpa.;
value:FQND
例如:
4.3.2.1.in-addr.arpa. IN PTR www.baidu.com.
CNAME:
name:FQDN格式的别名;
value:FQDN格式的正式名字;
例如:
web.baidu.com. IN CNAME www.baidu.com.
注意:
(1) TTL可以从全局继承;
(2) @表示当前区域的名称;
(3) 相邻的两条记录其name相同时,后面的可省略;
(4) 对于正向区域来说,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录;
实战篇
首先安装bind程序包
bind:
主配置文件:/etc/named.conf
或包含进来其它文件;
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
解析库文件:
/var/named/目录下;
一般名字为:ZONE_NAME.zone
注意:(1) 一台DNS服务器可同时为多个区域提供解析;
(2) 必须要有根区域解析库文件: named.ca;
(3) 还应该有两个区域解析库文件:localhost和127.0.0.1的正反向解析库;
正向:named.localhost
反向:named.loopback
rndc:remote name domain contoller(远程域名控制)
953/tcp,但默认监听于127.0.0.1地址,因此仅允许本地使用;
bind程序安装完成之后,默认即可做缓存名称服务器使用;如果没有专门负责解析的区域,直接即可启动服务;
CentOS 6.x: service named start
CentOS 7.x: systemctl start named.service
主配置文件格式:
全局配置段:
options { ... }
日志配置段:
logging { ... }
区域配置段:
zone { ... }
那些由本机负责解析的区域,或转发的区域;
注意:每个配置语句必须以分号结尾;
缓存名称服务器的配置:
监听能与外部主机通信的地址;
listen-on port 53;
listen-on port 53 { 172.16.100.67; };
学习时,建议关闭dnssec
dnssec-enable no;
dnssec-validation no;
dnssec-lookaside no;
关闭仅允许本地查询:
//allow-query { localhost; };
检查配置文件语法错误:
named-checkconf [/etc/named.conf]
测试工具:
dig, host, nslookup等
配置解析一个正向区域
步骤:
1、定义区域(在/etc/named.conf或/etc/named.rfc1912.zones)
2、定义数据文件(/var/named/xxx.zone)
权限及属组修改
修改该文件的权限为640,属主属组为root:named
检查语法错误
# named-checkzone ZONE_NAME ZONE_FILE
# named-checkconf
3、重载配置文件
详细
1、定义区域
zone "baidu.com" IN {
type master;
file "baidu.com.zone";
};
注意:区域名字即为域名;
2、定义数据文件(编辑一个名为baidu.com.zone的文件与第一步的file所指的相同)
文件为:/var/named/baidu.com.zone
$TTL 3600
baidu.com. IN SOA ns1.baidu.com. dnsadmin.baidu.com. (
2017010801
1H
10M
3D
1D )
IN NS ns1
IN MX 10 mx1
IN MX 20 mx2
ns1 IN A 172.16.100.67
mx1 IN A 172.16.100.68
mx2 IN A 172.16.100.69
www IN A 172.16.100.67
web IN CNAME www
bbs IN A 172.16.100.70
bbs IN A 172.16.100.71
权限及属组修改
修改该文件的权限为640,属主属组为root:named
检查语法错误
# named-checkconf
3、重载配置文件
rndc reload
配置反向区域
步骤:
1、定义区域(在/etc/named.conf或/etc/named.rfc1912.zones)
2、定义区域解析库文件(/var/named/xxx.zone)
3、重载配置文件
1、定义区域
zone "100.16.172.in-addr.arpa" IN {
type master;
file "172.16.100.zone";
};
注意:反向区域的名字
反写的网段地址.in-addr.arpa
如:100.16.172.in-addr.arpa
2、定义区域解析库文件(主要记录为PTR)
示例,区域名称为100.16.172.in-addr.arpa;
$TTL 3600
$ORIGIN 100.16.172.in-addr.arpa.
@ IN SOA ns1.baidu.com. nsadmin.baidu.com. (
2017010801
1H
10M
3D
12H )
IN NS ns1.baidu.com.
67 IN PTR ns1.baidu.com.
68 IN PTR mx1.baidu.com.
69 IN PTR mx2.baidu.com.
70 IN PTR bbs.baidu.com.
71 IN PTR bbs.baidu.com.
67 IN PTR www.baidu.com.
别忘了修改权限和属主属组
检查语法错误
named-checkconf
3、重载配置文件
rndc reload
配置主从DNS服务器
步骤:
1、定义一个从区域(/var/named/slaves)
2、重载配置
1、定义区域(从区域)
zone "ZONE_NAME" IN {
type slave;
file "slaves/ZONE_NAME.zone";
masters { MASTER_IP; };
}
配置文件语法检查:named-checkconf
(2) 重载配置
rndc reload
注意:(1) 确保区域数据文件中为每个从服务配置NS记录,并且在正向区域文件需要每个从服务器的NS记录的主机名配置一个A记录,且此A后面的地址为真正的从服务器的IP地址;
注意:时间要同步;
ntpdate命令;
DNS子域授权
子域授权就相当于是划片管理,是由上至下的授权。由根开始"."。
例如:.com .net 就是由根授权名称空间,其实就是由.决定要划分什么的名称空间,由它委派子名称空间。
例:若有个baidu.com.的域名,自己想再分多点子域名,如zhangsan.baidu.com. 就需要子域授权 。这就和51cto的博客一样,我的博客地址为http://zhaoyongtao.blog.51cto.com/ 这就是在blog.51cto.com.下的一个子域。
DNS中最重要的就是NS记录,其中每个NS里面的负责人就是SOA,在父域上定义一条NS记录和一条A记录就可以完成子域授权了
正向解析区域授权子域(/var/named/baidu.com.zone):
zhangsan.baidu.com. IN NS ns1.zhangsan.baidu.com.
s1. zhangsan.baidu.com. IN A IP.AD.DR.ESS(子域服务器ip)
lisi.baidu.com. IN NS ns1.lisi.baidu.com.
ns1.lisi.baidu.com. IN A IP.AD.DR.ESS
此子域就相当于一个域了,可以再给此子域添加正向解析记录。
定义转发:
注意:被转发的服务器必须允许为当前服务做递归;
(1) 区域转发:仅转发对某特定区域的解析请求;
zone "ZONE_NAME" IN {
type forward;
forward {first|only};
forwarders { SERVER_IP; };
};
first:首先转发;转发器不响应时,自行去迭代查询;
only:只转发;
(2) 全局转发:针对凡本地没有通过zone定义的区域查询请求,通通转给某转发器;
options {
... ...
forward {only|first};
forwarders { SERVER_IP; };
.. ...
};
bind中的安全相关的配置:
acl:访问控制列表;把一个或多个地址归并一个命名的集合,随后通过此名称即可对此集全内的所有主机实现统一调用;
acl acl_name {
ip;
net/prelen;
};
示例:
acl mynet {
172.16.0.0/16;
127.0.0.0/8;
};
bind有四个内置的acl
none:没有一个主机;
any:任意主机;
local:本机;
localnet:本机所在的IP所属的网络;
访问控制指令:
allow-query {}; 允许查询的主机;白名单;
allow-transfer {}; 允许向哪些主机做区域传送;默认为向所有主机;应该配置仅允许从服务器;
allow-recursion {}; 允许哪此主机向当前DNS服务器发起递归查询请求;
allow-update {}; DDNS,允许动态更新区域数据库文件中内容;
bind view:
视图:
view VIEW_NAME {
zone
zone
zone
}
view internal {
match-clients { 172.16.0.0/8; };
zone "magedu.com" IN {
type master;
file "magedu.com/internal";
};
};
view external {
match-clients { any; };
zone "magecdu.com" IN {
type master;
file magedu.com/external";
};
};