bind早期是有伯克利维护,后来交给了ISC进行维护,官方站点www.isc.org
在linux主机上提供可供选择的域名解析机制,在/etc/nssswitch.conf文件提供了域名解析的平台,里面可以定义多重解析域名的方法以及本主机采用优先采用哪种域名解析方法。
hosts: files dns
其中files表示优先使用本地hosts文件来解析域名
dns表示其次使用dns服务来解析域名,这两者的顺序即表示他们使用时的优先级
而在/usr/lib64目录下有以下三口库文件可以实现域名解析:
libnss_files.so.2
libnss_dns.so.2
libnss_nis.so.2
接下来就是主要讲解DNS的简单介绍和一些基础配置。
DNS系统在全球有13个根节点服务器,分布在不同的地区,美国居多。
FQDN:叫做完全主机名,例如www.lw.com.
DNS系统的分布式架构:
根(.)
顶级域名(如.com表示商业性质的域名;.org表示一些国际组织的域名;如.net;.edu;等等,这些按照不通电功能或地区来划分的),顶级域名也可以称为一级域名。
二级域名:是一般公司或(个人用的。(一般对公司来说是较重要的,设计到业务的运转)
DNS查询方式:
递归查询:只需要自己发送一次查询请求,求他的解析请求都交给自己直接上层来进行查询。
迭代查询:每一次都需要自己来进行查询,得到最终结果
一般情况下一个主机的查询过程实际上是先递归、后迭代,而在DNS服务器之间的查询被称为递归查询。
DNS服务器的功能:一般只负责自己管辖域内的地址解析,如果要替不属于自己域内的主机进行解析查找其他域内的主机,是需要开启相应的功能的。
注意:正反向解析是两个不同的名称空间,可以或不使用同一个服务器来提供正反向解析
缓存dns服务器 :不负责解析域,只用来查找本域内的主机
转发dns服务器 :用来为指定的区域内的请求进行转发请求的服务器,必须开始允许递归的功能。
主dns服务器:维护所负责的域内的主机地址解析的服务器,解析库有管理员维护
从dns服务器:从主dns服务器或其他的从dns服务器那里“复制”一份解析库(被称为区域传送)
serial序列号:解析库的版本号。前提:任何时候主服务器解析库发生变化,其序列号应该递增,这个序列号是管理员手动修改的
refresh刷新时间:从服务器向主服务器请求同步解析库的时间间隔
retry重试时间:从服务器向主服务器请求同步但失败后再次发出同步请求的时间间隔
expire过期时长:从服务器始终联系不到主服务器时,多久后放弃从服务器角色,停止提供服务的时长
否定应答时间TTL:表示本服务器明确所查找的主机自己不负责的时候未来多久时间内不要在想自己发送请求解析的请求。
“通知”机制:指的是主服务器在解析库发送变化时主动向从服务器发出通知,从而让从服务器来进行解析库的同步
区域传送:
全量传送:传送整个解析库
增量传送:只传送解析库中变化的内容
DNS:
domain:
正向:FQDN-->IP
反向: IP-->FQDN
FQDN:full qualified domain name 完全主机域名
例如www.lipengwei.com.(。是不能省略的)
一次完整的查询请求经过的流程:
client--》hosts文件--》DNS service
local cache --》DNS server(recursion递归)--》server cache --》iteration(迭代)--》
解析答案:
肯定答案:明确知道自己能够找主机的对应的ip地址。
否定答案:请求的条目不存在等原因导致无法返回结果的答案。
权威答案:只要是自己的直接上级返回的答案都是权威答案。
非权威答案:通过其他(非直接上级)返回的答案都是非权威答案。
主从服务器同步分为:全部同步数据、增量数据同步数据
资源记录:resource record(rr)
资源记录类型:resource record type
区域解析库:由众多RR组成
SOA :start of authority,起始授权记录,一个区域只能有一个SOA记录,SOA还必须是第一条记录
NS:name server,名称服务器,专用于表明当前区域的dns服务器
CNAME:别名记录
MX:mail exchanger.邮件交换器
A: FQDN-->IPv4
AAAA: FQDN-->IPv6
PTR:pointer,指针,进行反向解析,ip--》FQDN
资源记录定义的格式:
通用语法格式:name 【TTL】 IN rr_type value
注意:
(1)TTL可以从全局继承
(2)@可用于引用当前区域的名字
(3)同一个名字可以通过多条记录定义多个不同的值,此时会以轮询方式解析相应(这就是简单的实现DNS轮询方式实现负载均衡)
(4)同一个值也可能有多个不同的定义名字,通过多个不同的名字定义同一个值(仅表示可以通过不同的名找到同一个主机)
SOA:
name:当前区域的名字。如“lipengwei.com”
value:有多部分组成
(1)当前区域的主DNS服务器的FQDN,也可以使用当前区域的名字
(2)当前区域管理员的邮箱地址:但地址中不能使用“ @”,要使用。代替
(3)主从服务器协调属性的定义以及否定答案的统一的TTL
例如:
lipengwei.com ttl IN SOA ns.lipengwei.com。 adminmail。lipengwei.com (
2015091401 //序列号,最多10位数
刷新时间
重试时间
过期时间
否定ttl值
);
注意:这value的值可以是当前区域名( @)或者使用在上级DNS服务器上填写的主DNS服务器名
NS:
name :当前区域的名字
value:当前区域内的某个dns服务器的名字,如ns.lipengwei.com.
注意:一个区域可以有多个NS记录
例如:
lipengwei.com. IN NS ns1.lipengwei.com.
lipengwei.com. IN NS ns2.lipengwei.com。
注意:
1、相邻的两个资源记录name相同时,后续的可省略
2、对NS记录而言,任何一个NS记录后面的服务器名字,都应该有与之对应的A记录
MX:
name:当前区域的名字
value:当前区域内的某个邮件服务器的主机名
注意:一个区域内可以有多高MX记录,但每个记录的value之间都应该有0-99的数字来表示其优先级,数字越小,优先级越高
例如:
lipengwei.com. IN MX 19 mx1.lipengwei.com.
IN MX 29 mx2.lipengwei.com.
注意:对MX记录而言,任何一个mx记录后面的服务器名字,都应该有一条与之对应的A记录
A:FQDN-->IP
name:某主机的FQDN,如www.lipengwei.com。
value:主机名对应的ip地址
例如:
www.lipengwei.com. IN A 1.1.1.1
www.lipengwei.com. IN A 1.1.1.2
mx1lipengwei.com. IN A 1.1.1.3
mx2lipengwei.com. IN A 1.1.1.3
注意:
*.lipengwei.com. IN A 1.1.1.4
lipengwei.com. IN A 1.1.1.4(在用户只输入域名时也可以解析至特定的主机)
用来避免用户写错名称是给错误答案,可通过泛域名解析进行解析到某个特定主机
AAAA:
name:FQDN
value:IPv6
PTR:
name:ip地址,有特定格式,把ip地址反过来写,有特定后缀in-addr.rapa.
如:
ip地址是1.2.3.4,写法是4.3.2.1.in-addr.arpa。
4 IN PTR www.lipengwei.com.
注意:网络地址以及后缀可省略,主机地址依然要反着写
CNAME:
name :别名的FQDN
value:正式FQDN
例如:
web.lipengwei.com. IN CNAME www.lipengwei.com.
子域授权:每个域的名称服务器,都是通过其上级名称服务器在解析库中进行授权。所谓的子域授权其实是
为了分担上级域的服务器的解析压力而进行的分割数据,使其一部分解析功能交给其子域来完成解析而采取的一种
分布式实现的方法。例如对正向区域的子域授权,只需要在其解析库中添加子域信息的NS记录和A记录即可。(反向区域的子域授权比较困难,很少这么做)
注意:只要父域在上级DNS服务器注册过,但是其子域是不需要再注册的。
例如:lpw.com.在。com。的名称服务器上,解析库中添加资源记录
$TTL 1d
@ IN SOA @ admin.lpw.com (
2015091502
1H
5M
3D
3D )
IN NS ns1.lpw.com.
ns1.lpw.com. IN A 172.16.1.112
www IN A 172.16.1.112
ftp IN CNAME www
aps.lpw.com. IN NS nt1.aps.lpw.com.
aps.lpw.com. IN NS nt2.aps.lpw.com.
nt1.aps.lpw.com. IN A 172.16.1.110
nt2.aps.lpw.com. IN A 172.16.1.119
* IN A 172.16.1.112
这些记录被称为glue record:也称做粘合记录
下面是bind程序包的组成以及配置实例:
安装包:
bind包
bind-util包
bind-chroot包
而程序名字是named
bind的服务脚本:/etc/rc.d/init.d/named
主配置文件:/etc/named.conf,/etc/named/rfc1912.zones,/etc/rndc.key
解析库文件:/var/named/ZONE.ZONE
注意:
1、一台物理物理服务器可以同时为多个区域提供域名解析
2、必须要有根区域文件,/var/named/named.ca
3、应该有两个(如果包括ipv6的,应该更多)实现localhost和本地回环地址解析的解析库:/var/named/named.localhost,/var/named/named.loopback
rndc:romote name domain controller,默认与bind安装在同一主机,且只能通过127.0.0.1来与named进程进行通信,tcp/953
主配置文件:
全局配置:options{};
日志子系统配置:logging{};
区域定义:本机能够为哪些zone进行解析,就要定义哪些zone:
zone “zone_name” IN {}
注意:任何服务程序如果期望能够通过网络被其他主机访问,则需要至少监听在一个能与外部通信的ip地址上
配置缓存名称服务器的配置:
1.只需要监听本地能与外部通信的外部地址即可
2、allow-query 改为 “any”
dnssec:dns secure :现代互联网为了避免dns被攻击和污染,使用了dns secure机制,需要每次对解析请求进行验证
在不是严格要求使用的时候可以禁用该项及其key相关配置
建议:禁用dnssec
recursion 表示是否允许递归
主DNS名称服务器配置:(在头部定义的$ORIGIN VALUE 可以用来代替下面配置中省略的部分)
1步、在主配置文件中定义区域
zone "zone_name" IN {
type {master|slave|hint|forword};
file "zone_name.zone";
};
2步、定义区域解析库文件(每一个区域对应一个其区域解析库文件)
@ IN SOA ns1.lpw.com. admin.lpw.com (
2015091501
1h
5m
7d
1d )
IN NS ns1.lpw.com.
IN NS ns2.lpw.com.
IN MX mx1.lpw.com.
IN MX mx2.lpw.com.
ns1.lpw.com. IN A 172.16.1.108
ns2 IN A 172.16.1.108
mx1 IN A 172.16.1.11
mx2 IN A 172.16.1.12
ns1.lpw.com. IN A 172.16.1.108
3步、修改区域解析库文件的权限和属组(为了安全起见)
反向区域配置:
区域名称:网络地址反写。in-addr.arpa
172.16.100. ---》 100.16.172.in-addr.arpa
第一步:定义区域:
zone "zone_name" IN {
type={hint|master|slave}
}
第二步:定义区域库文件
注意:不需要MX和A以及AAAA记录,以PTR记录为主
$TTL 1D
$ORIGIN 1.16.172
@ IN SOA ns1.lpw.com. admin.lpw.com. (
2015091601
3h
5m
1d
1d )
IN NS ns1.lpw.com.
IN NS ns2.lpw.com.
112 IN PTR ns1.lpw.com.
112 IN PTR ns2.lpw.com.
112 IN PTR www.lpw.com.
主从复制配置:
问题:启动新机器的bind时出现
[[email protected] etc]# service named start
Generating /etc/rndc.key:
网上解决办法:
rndc-confgen -r /dev/urandom -a,重启named服务即可
注释:rndc-confgen是rndc的key的管理工具
第一步:新建主机,安装bind,配置为缓存dns服务器
第二步:主服务器的区域解析库文件中必须有一条NS记录是指向从服务器
修改主master区域项 allow-transfer { 172.16.1.110; };
第三步:从服务器只需要定义区域,而无需提供解析库文件,解析库文件应该放置在/var/named/slaves/下面
第四步:主服务得允许从服务器做区域传送
第五步:主从服务器时间应该同步,可通过ntp进行
第六步:bind程序的版本应该保持一致,否则,应该从高、主低
注意:每次手动修改主DNS服务器区域文件时必须手动更新修改其序列号
rndc:
rndc --> rndc(953/tcp)
使用方法: rndc command
command:
reload:重载主配置文件和区域解析库文件
reload zone :重载区域解析库文件
retransfer zone :手动启动区域传送过程,而不管序列号
notify zone:重新对区域传送发通知
reconfig :重载主配置文件
querylog :开启或关闭查询日志功能
trace :递增debug级别
trace level :指定使用的级别
注意:对于正常工作环境中不应该开启日志调试功能,区域文件都是放在内存中的,因此如果开启querylog功能,就会对每一的查询都立即记录日志到磁盘,增加I/O开销,增大主机的负荷。所以非调试过程(在生产过程中)不要开启。
正向解析区域子域方法:
在正向解析库文件中添加子域的信息(NS和A记录)
注意:在使用主域查询子域时dig命令要加+norecurse
定义转发服务器:
注意:被请求转发的服务器需要能够为请求者做递归,否则转发请求不予处理
(1)全部转发:凡是对非本机所负责解析的区域的请求,统统转发给指定的服务器
在options配置项添加两项:
forward first|only; // first 表示先将请求委托给一个dns服务器来解析,如果他解析不到,则自己再向根请求解析
//only 表示所有的自己解析不了的请求都委托给一个dns服务器来解析,如果他解析不到,就认为这个请求是解析不到的。
forwarders { ip; };
(2)区域转发:仅转发对特定区域的请求至某服务器
zone "zone_name" IN {
type forward;
forward { first|only;};
forwarders { ip;};
};
问题:在做转发的dns服务器上请求被转发服务器管辖的主机时报错,查看/var/log/messages出现
verify failed due to bad signature (keyid=1518): RRSIG validity period has not begun
解决办法:原因是签证无效,最终原因是做实验的两个虚拟机的时间不一致,同步下时间就行了。
另外重要的一点:关闭dnssec功能:dnssec 是dns secure安全的dns服务器,指的是dns在每一次请求解析时都会要求验证对方的数字签名,所以在实验环境中可能对导致数字签名无效的错误提示从而不能够解析成功。
dnssec-enable no;
dnssec-validation no;
DNS中的安全相关的配置:
定义acl访问控制列表:
acl acl_name (
ip1;
ip2;
net/length;
);
bind有四个内置的acl:
none:没有一个主机
any:任意主机
local:本机
localnet:本机的ip同掩码运算后得到的网络地址
注意:acl只能先定义,后使用,因此,其一般定义在配置文件options前面
访问控制的指令:
allow-query{};允许哪些主机来本机进行查询的主机名单:白名单
allow-transfer{}:允许进行区域传送的主机
allow-recursion{} 允许递归的主机
allow-update{};允许更新区域数据库中内容的主机,一般情况下应该不允许任何主机来主动更新服务器解析库文件内容
bind 的view功能:
视图:一个bind服务器可定义多个view,每个view中可定义一个或多个zone,在多个view中可定义相同的zone,每一个view用来匹配一组请求的客户端,多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件,这是DNS可以实现CDN技术的主要原因。
view的设置:
view view_name{
match-clients{};
zone "zone_name" IN {};
};
注意:
(1)一旦启用了view,所有的zone都只能定义在view中
(2)仅有必要在匹配到允许递归请求的客户端所在的view中定义根区域
(3)客户端请求到达时,是自上而下检查每个view所服务的客户端列表
(4)bind提供的view功能可以实现简单的CDN的功能。
CDN :content delivery network 内容分发网络,也叫做智能DNS系统
智能DNS供应商:
如:dnspod和dns。la
编译安装bind9
第一步:解压源码包
第二步:创建普通用户named和组named
第三步:./configure --prefix=/usr/local/bind9 --sysconfig=/etc/bind/ --disable-ipv6 --disable-chroot --enable-threads
第四步:将编译后的可执行程序添加到PATH环境变量中(在/etc/profile.d/下新建named.sh【PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH】)
第五步:设置库文件(编辑/etc/ld.so.conf.d/named.conf【/usr/local/bind9/lib】),然后重读此文件,ldconfig
第六步:导出头文件:ln -sv /usr/local/bind9/include /usr/include/named
第七步:添加man手册,在/etc/man.config中添加编译后的man手册
第八步:手动编辑namd.conf配置文件
监听tcp|udp的53号端口
udp的53号端口主要用来监听解析地址的
tcp的53号端口主要是用来主从服务器通信的监听端口
named程序以root用户启动,然后切换至named用户,
linux上为了防止系统用户运行进程被劫持而取得不应该有的权限,通常的做法就有两个:
1、以系统用户启动进程后,切换至普通用户来运行
2、chroot 来切换运行程序的根目录
测试命令:dig命令
dig -t type name [@server] [query options]
dig 仅用于测试dns系统,因此,不会查询hosts文件进行解析
查询选项:
+[no]trace :跟踪解析过程
+[no]recurse:进行递归解析
测试反向解析:
dig -x ip server
模拟区域传送
dig -t axfr zone_name @server
例如:dig -t axfr lpw.com @172.16.1.108
注意:dig在查询时默认是递归查询,可以使用+norecurse
host命令:
host [-t type] name [servcer]
nslookup命令:
交互式查询
nslookup>
server ip :指明使用哪个dns server来进行查询
set q=rr_type:指明查询哪种类型的资源类型记录
name:要查询的名称