DNS的注册与使用
1.在注册商提供的管理后台编辑建立资源记录
注册域名的时候,域名服务提供商会自动的帮用户建立2个资源记录(NS)将NS指向域名商的服务器,所以域名可以得到解析。
2.自建dns:
自建DNS首先必须在.com或其他域注册自己的授权,将NS指向自己的服务器IP地址,而后将服务器上安装bind提供正向域名解析,这样用户在互联网就可以找到自己的DNS服务器。
Bind主配置主配置文件注释
[root@test~]# cat /etc/named.conf
//
// named.conf
//
//Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
//server as a caching only nameserver (as a localhost DNS resolver only).
//
// See/usr/share/doc/bind*/sample/ for example named configuration files.
//
#在全局选项中,最关键的只有一项,directory需要保留,其他都可以删掉,只留此行即可。
options{
// listen-on port 53 { 127.0.0.1; };
// 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 { localhost; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file"/etc/named.iscdlv.key";
managed-keys-directory"/var/named/dynamic";
};
#日志记录,此功能非常灵活,可以定义日志的记录路径记录过程、记录级别等,将在后文中有所体现
logging{
channel default_debug {
file"data/named.run";
severity dynamic;
};
};
#定义根域
zone"." IN {
type hint;
file "named.ca";
};
#专门定义区域
include"/etc/named.rfc1912.zones";
#主要实现一些DNS安全
include"/etc/named.root.key";
常规搭建请鉴 http://yijiu.blog.51cto.com/433846/1339911
确保配置无误,之前莫忘检查配置文件,便可启动named
rndc命令
rndc是BIND安装包提供的一种控制域名服务运行的工具,它可以运行在其他计算机上,通过网络与DNS服务器进行连接,然后根据管理员的指令对named进程进行远程控制,此时,管理员不需要DNS服务器的根用户权限。使用rndc可以在不停止DNS服务器工作的情况进行数据的更新,使修改后的配置文件生效。在实际情况下,DNS服务器是非常繁忙的,任何短时间的停顿都会给用户的使用带来影响。因此,使用rndc工具可以使DNS服务器更好地为用户提供服务。
如果看到有监听地址和端口,就说明可以使用了,如果有公网地址的话,说明可以在互联网当做DNS服务器来使用,当然,这里我们是测试环境没有公网地址,如下所示:
[root@test~]# ss -tunl | grep 53
udp UNCONN 0 0 192.168.1.115:53 *:*
udp UNCONN 0 0 10.0.10.60:53 *:*
udp UNCONN 0 0 127.0.0.1:53 *:*
tcp LISTEN 0 3 192.168.1.115:53 *:*
tcp LISTEN 0 3 10.0.10.60:53 *:*
tcp LISTEN 0 3 127.0.0.1:53 *:*
tcp LISTEN 0 128 ::1:953 :::*
tcp LISTEN 0 128 127.0.0.1:953 *:*
953端口是由rndc来使用管理的。而rndc只监听的本地127.0.0.1 ,rndc与DNS服务器实行连接时,需要通过数字证书进行认证,而不是传统的用户名/密码方式.
1.rndc认证
rndc在联系服务器上所使用的秘钥位于/etc/rndc.key
[root@test~]# cat /etc/rndc.key
key"rndc-key" {
algorithm hmac-md5;
secret"ltpL9+9+JWFZrmMwlnaAaA==";
};
named在使用DNS在与根服务器通信使用的key
[root@test~]# cat /etc/named.root.key
managed-keys{
# DNSKEY for the root zone.
# Updates are published onroot-dnssec-announce@icann.org
. initial-key 257 3 8"AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjFFVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoXbfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaDX6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpzW5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relSQageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq QxA+Uk1ihz0=";
};
可以不使用rndc.key,用命令rndc-confgen手工建立来生成key,生成完后可以保存在/etc/rndc.conf里,而后将rndc.key删除,只保留rndc.conf文件,将rdnc.conf文件下一半复制到name.root.key来实现
此后,对于dns完全可以使用rndc来完成
2.使用rndc查看当前服务运行状态
(1)使用rndc status命令来查当前bind运行的状态
[root@test~]# rndc status
version:9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6
CPUsfound: 1 #当前服务器有多少颗CPU
workerthreads: 1 #bind有多少个工作线程,每个线程对应一个cpu
numberof zones: 21 #有多少个区域在工作
debuglevel: 0 #是否开启了调试模式,如果开启调试模式那么调试级别是多少
xfersrunning: 0 #区域传送正在进行的个数
xfers deferred:0 #区域传送时有多少延迟发送
soaqueries in progress: 0 #正在进行SOA查询,辅助名称服务器过来刷新查询都会出现SOA查询,因为会请求主DNS的序列号
querylogging is ON #打开查询日志,每一次查询请求都会被服务器记录下来。如dig -t NS. @ip
recursiveclients: 0/0/1000 #正在做查询的客户端最高位1000个
tcpclients: 0/100 #以TCP协议模式来工作,最多客户连接数
serveris up and running #当前服务状态:服务正处于运行状态
3.使用rndc trace命令可以切换到调试模式
显示程序运行中的详细信息:程序运行的每一次的信息的输出;只有在某些特殊情景下才会开启调试模式
比如:服务器总是不符合期望,不知道哪里出错等,这时可以将调试模式开启一步一步去找问题,不然一定不要开启
每执行一次调试级别便+1,如下所示
[root@test~]# rndc trace
[root@test~]# rndc trace
查看bind当前状态:
[root@test~]# rndc status
version:9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6
CPUsfound: 1
workerthreads: 1
numberof zones: 21
debuglevel: 2
xfersrunning: 0
xfersdeferred: 0
soaqueries in progress: 0
querylogging is OFF
recursiveclients: 0/0/1000
tcpclients: 0/100
serveris up and running
关闭调试模式
[root@test ~]# rndcnotrace
[root@test~]# rndc status
version:9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6
CPUsfound: 1
workerthreads: 1
numberof zones: 21
debuglevel: 0
xfersrunning: 0
xfers deferred:0
soaqueries in progress: 0
querylogging is OFF
recursiveclients: 0/0/1000
tcpclients: 0/100
serveris up and running
4.使用rndc查询日志-query
[root@test ~]# rndc status | grep que
soaqueries in progress: 0
querylogging is ON
打开查询日志
[root@test~]# rndc querylog
[root@test~]# rndc status
version:9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6
CPUsfound: 1
workerthreads: 1
numberof zones: 21
debuglevel: 0
xfersrunning: 0
xfersdeferred: 0
soaqueries in progress: 0
querylogging is ON
recursiveclients: 0/0/1000
tcpclients: 0/100
serveris up and running
使用10.0.10.60对根域做解析
[root@test~]# dig -t NS . @10.0.10.60
完后查看日志信息:
[root@test~]# tail /var/log/messages
Dec 1618:49:00 test named[1808]: query logging is now on
#query根的 NS记录
Dec 1618:51:33 test named[1808]: client 10.0.10.60#49393: query: . IN NS +(10.0.10.60)
5.使用rndc清除dns缓存,避免测试得到不正确的结果
[root@test~]# rndc flush
6.使用rndc重新加载配置文件
[root@test~]# rndc reconfig
[root@test~]# rndc reload
reload重读配置文件以及域解析库,而reconfig只重读配置文件,对于量级的DNS服务器,用哪个命令来加载十分重要。
dig命令信息补充
查看本地测试环境的A记录
[root@test~]# dig -t A www.test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.test.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62035
;;flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2
aa:权威答案它本身就是负责这个域的解析的,所以是权威答案;需要注意的是dig命令是不会查缓存的,也不会查host文件,直接提交到服务器上去解析的,因此得到的答案是权威答案,如果非aa 则非权威答案
;;QUESTION SECTION: #用户请求(问题)是什么
;www.test.com. IN A #请求是查询www.test.com的A记录是什么
;;ANSWER SECTION: #授权段,表示哪台服务器给用户的响应
www.test.com. 600 IN A 10.0.10.61
www.test.com. 600 IN A 10.0.10.60
;;AUTHORITY SECTION: #授权段,表示哪台NS服务器给用户的响应
test.com. 600 IN NS dns2.test.com.
test.com. 600 IN NS dns.test.com.
;;ADDITIONAL SECTION: #额外段,ns明确说明了是由dns.test.com响应的答案,但这台主机的ip是60
dns.test.com. 600 IN A 10.0.10.60
dns2.test.com. 600 IN A 10.0.10.61
;;Query time: 1 msec #查询花费的时间毫秒
;;SERVER: 10.0.10.60#53(10.0.10.60) #服务器的IP
;;WHEN: Thu Dec 19 18:21:17 2013 #查询的时间是多少
;; MSGSIZE rcvd: 131 #接收到服务器响应的报文大小
配置DNS转发
1. bind中常用3个控制参数
allow-transfer :允许做区域传送的主机,格式如下:
allow-transfer{ ip; };
allow-query :允许做查询的指令,格式如下:
allow-query{ ip; }
allow-recursion :允许做递归查询的ip列表一般来说只允许给本地客户端做递归查询,格式如下:
allow-recursion {none; };
以上3段可以放到全局配置中对全局配置生效,也可放在某个区域中,只针对于某个区域生效;而allow-recursion参数要加入到全局配置中,其他两项一般是放到区域配置中。
2.ACL转发规则
如果allow-transfer 和 allow-query 放到区域配置中一般后期修改ip地址会非常的麻烦,所以可以定义acl访问规则:
#对于配置文件的格式以及参数调整,具体可以查看man手册 ,命令:man named.conf
定义acl的格式如下:
acl string { address_match_element; ...};
acl 名字 定义acl规则
可以看到如上所示信息,定义格式非常简单:使用bind访问控制列表,明确定义一组客户端或者一组主机并使用一个名称来定义它们;
其中,定义的参数有四种,分别是:any、none、locale、localnet。
acl只有先定义才可以使用,因此acl定义必须在acl调用的最上方即配置文件的最上方。
3.定义ACL访问控制规则
定义允许区域传送的主机:
[root@test~]# vim /etc/named.conf
切换至最上方定义acl(acl可以定义嵌套的acl),定义允许区域传送的主机,如下所示:
aclallowxfer { #定义acl名称是alloxfer;
127.0.0.1; #定义本地主机IP;
10.0.10.60; #定义本机主机IP;
10.0.10.61; #辅DNSServer IP;
};
现在一个acl就定义好了,那么假设test.com这个正向区域只允许acl中定义的ip可以传送区域,可将上面定义的acl加入到test.com这个域中使其生效:
编辑配置文件
[root@test~]# vim /etc/named.rfc1912.zones
加入acl参数
zone"test.com" IN {
type master;
file "test.com.zone";
allow-transfer { allowxfer; };
};
保存退出,检测语法并重新加载配置文件
[root@test~]# named-checkconf
[root@test~]# rndc reload
serverreload successful
在主从2台机器查看是否可以传送
[root@test~]# dig -t axfr test.com
#在测试机上查看是否可以传送
[root@test~]# dig -t axfr test.com @10.0.10.60
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -taxfr test.com @10.0.10.60
;;global options: +cmd
test.com. 600 IN SOA dns.test.com.admin.test.com. 20131223 7200 600 604800 21600
test.com. 600 IN NS dns.test.com.
test.com. 600 IN NS dns2.test.com.
test.com. 600 IN MX 10mail.test.com.
#================================下部分略======================================
可以正常获取数据,那么再次测试:将acl中的10.0.10.60 行删除 然后重新加载 再来测试10.0.10.x段与127.0.0.1分别测试:
[root@test~]# vim /etc/named.conf
aclallowxfer {
127.0.0.1;
// 10.0.10.60; #将此段注释或删除
10.0.10.61;
};
保存退出并检测语法
[root@test~]# named-checkconf
[root@test~]# rndc reload
serverreload successful
[root@test~]# rndc flush
[root@test~]# dig -t axfr test.com @10.0.10.60
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -taxfr test.com @10.0.10.60
;;global options: +cmd
;Transfer failed.
在10.0.10.60上测试:
[root@test2~]# dig -t axfr test.com @10.0.10.60
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -taxfr test.com @10.0.10.60
;;global options: +cmd
test.com. 600 IN SOA dns.test.com. admin.test.com. 20131223 7200600 604800 21600
test.com. 600 IN NS dns.test.com.
test.com. 600 IN NS dns2.test.com.
test.com. 600 IN MX 10 mail.test.com.
dep1.test.com. 600 IN NS dns.dep1.test.com.
dns.dep1.test.com. 600 IN A 10.0.10.62
dns.test.com. 600 IN A 10.0.10.60
dns2.test.com. 600 IN A 10.0.10.61
ftp.test.com. 600 IN CNAME www.test.com.
icmp.test.com. 600 IN A 10.0.10.60
mail.test.com. 600 IN A 10.0.10.60
www.test.com. 600 IN A 10.0.10.60
www.test.com. 600 IN A 10.0.10.61
test.com. 600 IN SOA dns.test.com.admin.test.com. 20131223 7200 600 604800 21600
可以看到,完全可以获取其数据信息
将10.0.10.61删除,再次测试。在主机61上测试获取数据是否成功:
[root@test2~]# dig -t axfr test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -taxfr test.com
;;global options: +cmd
;Transfer failed.
4.配置allow-query 允许查询
定义acl
[root@test~]# vim /etc/named.zones
在其上定义访问控制的基础,在下面加入参数:
aclquery { #定义acl名称为query
10.0.10.60;
127.0.0.1;
10.0.10.61;
};
[root@test~]# vim /etc/named.rfc1912.zones
加入allow-query参数
zone"test.com" IN {
type master;
file "test.com.zone";
allow-transfer { allowxfer; };
allow-query { query; };
// allow-transfer { 10.0.10.61; };
};
保存退出,检测配置文件并重新加载配置
5.验证:
切换至windows客户端使用nslookup对test.com域进行查询操作,可以看到如下所示:
修改配置文件,将windows主机的IP添加至acl
aclquery {
10.0.10.60;
127.0.0.1;
10.0.10.61;
10.0.10.1;
};
再次测试,可以看到,完全可以对其进行查询操作:
基于dns请求转发:
某些网络连接不鼓励向本地以外发送很大的数据流量,这要么是因为网络连接是按流量计费的,或网络连接本身是带宽不足。在这样的情况下,如果想将发往外部的 DNS 流量限制到尽可能的小,就需要使用 BIND 的转发机制
DNS转发流程:设置了转发后,所有非本域的和在缓存中无法找到的域名查询都将转发到设置的 DNS 转发器上,由这台 DNS 来完成解析工作并做缓存,因此这台转发器的缓存中记录了丰富的域名信息。因而对非本域的查询,很可能转发器就可以在缓存中找到答案,避免了再次向外部发送查询,减少了流量。
说白了,首先客户端本身不能连接至互联网,但是内网dns是可以访问到互联网,如下所示
使用dig @指定主机来进行域名解析,如下所示:
[root@test~]# dig www.baidu.com @10.0.10.60
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>>www.baidu.com @10.0.10.60
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25378
;;flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 5
;;QUESTION SECTION:
;www.baidu.com. IN A
;;ANSWER SECTION:
www.baidu.com. 1200 IN CNAME www.a.shifen.com.
www.a.shifen.com. 300 IN A 220.181.112.143
www.a.shifen.com. 300 IN A 220.181.111.148
;;AUTHORITY SECTION:
#=====================================以下信息略============================================
通过dig命令我们可以看到其可以与10.60通信,而10.60是可以访问到互联网的。而自己的服务器只负责test.com域的解析 ,只在本地解析。
假设10.60是访问不了互联网的 ,那么有一个客户端将DNS服务器指向了10.60,如果客户端只请求解析test.com域是可以解析的 而且是权威答案,如果请求baidu.com 则没有返回答案,因为其没有连接外网
1.dns转发的实现
对于test.com这个域的话,10.60可以做为解析,但是其他域是解析不了的,如果想解析其他域名的话,必须通过dns转发来实现:
首先test.com域不会及时去响应而是将请求转发出去,得出的结果返回至test.com再返回给用户。如下图所示:
2.bind转发类型
对于bind可以指定2种类型的转发:
转发类型:
(1)转发所有针对非本机负责解析的区域的请求
(2)仅转发对特定区域的请求
以第一种情况为例:
假如不是本机的区域的请求全部将请求转发到dnsserver上,其test.com不会将去找根不会去做迭代查询,dns server得到请求返回一个最终答案(递归)
如果DNS server 不给其做递归,那么不能将转发指向它。
转发的前提:接收转发请求的服务器必须能够为请求者做递归查询,不然转发是没有任何意义。
假如dns server过了半天回应没有找到答案,假设都能连接到互联网,但是为了统一规范的解析10.60都转向了dns server ,但是dns server返回没有答案,dns server没有链接互联网,那么其10.60自己连接互联网是否一定可以找到?
所以,递归出去请求,返回结果没有答案,那么是否还需10.60重新迭代查询,要不要迭代也是可以自己定义的
3.定义转发:
bind服务定义转发规则语法很简单,参数为:
forwardyes|no;
forwarders{ IP; };
forwardonly | first;
#only:返回结果是什么就是什么
#first:先转发,没有答案那么则重新迭代出去查询,如果再找不到才死心
配置大致格式如下:
#转发所有针对非本机负责解析的区域的请求
options{ };
#仅转发对特定区域的请求
zone {
typeforward;
};
配置转发:
切换至主服务器
查看本地DNS指定IP
[root@test~]# cat /etc/resolv.conf
;generated by /sbin/dhclient-script
nameserver10.0.10.60
nameserver10.0.10.61
查看是否可以正常解析NS
[root@test~]# host -t NS test.com
test.comname server dns2.test.com.
test.comname server dns.test.com.
编辑配置文件,加入以下参数
[root@test~]# cat /etc/named.conf
options{
// listen-on port 53 { 127.0.0.1; };
// 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 { localhost; };
recursion yes;
forwarders { 10.0.10.61; }; #将请求都转发给10.61
forward only; #全部转发,因为上不了互联网 自己迭代没有意义
// dnssec-enable yes;
// dnssec-validation yes;
// dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file"/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
保存退出并检测语法
[root@test~]# named-checkconf
[root@test~]# rndc reload
serverreload successful
验证:
为了避免结果有误,需要将外网网口关闭再使用dig进行解析
[root@test~]# ifdown eth1
对于本机test.com永远都是权威答案因为本机是负责这个域的解析,可以使用dig来查看,答案是aa,如下所示
[root@test~]# dig -t A www.test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.test.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33047
;;flags: qr aa rd ra;QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2
;;QUESTION SECTION:
;www.test.com. IN A
;;ANSWER SECTION:
www.test.com. 600 IN A 10.0.10.60
www.test.com. 600 IN A 10.0.10.61
;;AUTHORITY SECTION:
test.com. 600 IN NS dns2.test.com.
test.com. 600 IN NS dns.test.com.
###########以下信息略###
对51cto.com进行解析,可以看到如下所示信息:
[root@test~]# dig -t A www.51cto.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.51cto.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54098
;;flags: qr rd ra; QUERY: 1, ANSWER: 2,AUTHORITY: 2, ADDITIONAL: 6
;;QUESTION SECTION:
;www.51cto.com. IN A
;;ANSWER SECTION:
www.51cto.com. 600 IN A 118.144.78.54
www.51cto.com. 600 IN A 118.144.78.52
;;AUTHORITY SECTION:
51cto.com. 172799 IN NS ns1.dnsv2.com.
51cto.com. 172799 IN NS ns2.dnsv2.com.
4.配置指定域名转发
如果只想转发51cto的域名则可以进行如下操作:
将named.conf之前配置的参数删除,并自建区域。
[root@test~]# vim /etc/named.rfc1912.zones
追加以下参数
zone"www.51cto.com" IN {
type forward; #定义类型为转发
forward only; #对于此域名全部转发
forwarders { 10.0.10.61; }; #需要委派转发的DNS服务器的IP地址
};
保存退出
[root@test~]# named-checkconf
[root@test~]# rndc reload
验证:
[root@test~]# dig -t A www.51cto.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.51cto.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11946
;;flags: qr rd ra; QUERY: 1, ANSWER: 2,AUTHORITY: 0, ADDITIONAL: 0
;;QUESTION SECTION:
;www.51cto.com. IN A
;;ANSWER SECTION:
www.51cto.com. 600 IN A 118.144.78.52
www.51cto.com. 600 IN A 118.144.78.54
;;Query time: 1855 msec
;;SERVER: 10.0.10.60#53(10.0.10.60)
;;WHEN: Thu Dec 19 23:43:11 2013
;; MSGSIZE rcvd: 63
子域的授权
在现实生活中我们世界互联网中的每个主机并不是在同一个域内,而是通过不同的依据将将其划分到不同的“小域”中,犹如一个倒立的树状结构,由一点出发,一层层的向下分成了多个分支,而这些分支就是其上级域的子域,其上级域就是相对的父域,子域是从父域中划出来的一个域,子域中的主DNS服务器负责这个子域中的地址解析,从而减轻了父域中DNS服务器的压力,这不仅提高了解析服务的效率,同样也提高了解析服务的稳定性。
·子域授权分类:
(1)域内:划分出小域即为子域。
(2)授权:委派授权。
·子域授权创建步骤:
(1)划分子域。
(2)完成授权。
1.创建子域授权
首先需要新添加一台测试机,规划如下:
服务器IP地址 |
服务器角色 |
10.0.10.60 |
主DNS服务器 |
10.0.10.61 |
辅DNS服务器 |
10.0.10.62 |
子域 |
2.将test.com划分子域
规划如下:
父域 |
子域 |
test.com. |
dep1.test.com |
dep2.test.com |
明确说明dep1.test.com是test.com的子域,而子域内只有一个dns服务器叫dns.dep1.test.com.
3. 配置正向子域授权
只需要在区域解析文件添加一条NS记录,并加入一条与之对应的A记录即可
$TTL 600
$ORIGINtest.com.
@ IN SOA dns.test.com. admin.test.com. (
20131224 #更改ID号+1
2H
10M
7D
6H )
IN NS dns
IN NS dns2
IN MX 10 mail
dns IN A 10.0.10.60
dns2 IN A 10.0.10.61
www IN A 10.0.10.60
mail IN A 10.0.10.60
ftp IN CNAME www.test.com.
www IN A 10.0.10.61
icmp IN A 10.0.10.60
dep1 IN NS dns.dep1 #如果没有声明ORIGIN所以必须写全
dns.dep1 IN A 10.0.10.62
解释如下:
#明确说明dep1.test.com是子域 而子域内只有一个dns服务器叫dns.dep1.test.com.
dep1.test.com. IN NS dns.dep1
#A记录是否在当前服务器无关紧要关键是必须有A记录
dns.dep1 IN A 10.0.10.62
#如果在子域中使用多台DNS服务器,那么每台DNS服务器在它的父域上都必须是授权的服务器,如下所示:
dep1.test.com. IN NS dns.dep1.test.com.
dns.dep1.test.com. IN A 10.0.10.60
dep2.test.com. IN NS dns.dep2.test.com.
dns.dep2.test.com. IN A IP地址 (ip地址不在同一网段也可以,因为DNS并不依赖必须在同一网段中,只有能实现路由通信即可)
检测语法并重启即可
到此,主域的配置已经完成,切换至从域并进行以下操作:
编辑rfc1912.conf 加入以下参数参数
zone"dep1.test.com" IN { #定义从域域名
type master; #类型为master
file "dep1.test.com.zone"; #配置文件存放路径
};
创建配置文件
[root@test3~]# vim /var/named/dep1.test.com.zone
键入以下参数:
$TTL600
@ IN SOA dns.dep1.test.com. admin.dep1.test.com. (
2013121701 #id号不用改
1H
10M
3D
2H
)
IN NS dns
IN MX 10 mail
dns IN A 10.0.10.62 #本地ip地址
mail IN A 10.0.10.62
www IN A 10.0.10.62
保存退出,并检测语法
[root@test3named]# chown :named dep1.test.com.zone
[root@test3named]# named-checkzone "dep1.test.com" /var/named/dep1.test.com.zone
zonedep1.test.com/IN: loaded serial 2013121701
OK
[root@test3named]# rndc reload
serverreload successful
如果同步不成功,日志提示如下信息:
named : error (failure) resolving
则将配置文件里的dnssec参数注释即可
验证:
在子域上使用dig命令来查询自己的A记录:
[root@test3named]# dig -t A www.dep1.test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.dep1.test.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43133
;;flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;;QUESTION SECTION:
;www.dep1.test.com. IN A
;;ANSWER SECTION:
www.dep1.test.com. 600 IN A 10.0.10.62
;;AUTHORITY SECTION:
dep1.test.com. 600 IN NS dns.dep1.test.com.
;;ADDITIONAL SECTION:
dns.dep1.test.com. 600 IN A 10.0.10.62
;;Query time: 0 msec
;;SERVER: 10.0.10.62#53(10.0.10.62)
;;WHEN: Fri Dec 20 00:59:36 2013
;; MSGSIZE rcvd: 85
可以发现,能够正常解析也是我们所意料之中,那么再去解析父域,发现无法去解析,如下所示
[root@test3named]# dig -t A www.test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.test.com
;;global options: +cmd
;;connection timed out; no servers could be reached
再来测试,在父域解析子域:
[root@test~]# dig -t A www.dep1.test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.dep1.test.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20850
;;flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;;QUESTION SECTION:
;www.dep1.test.com. IN A
;;ANSWER SECTION:
www.dep1.test.com. 591 IN A 10.0.10.62
#####以下信息略
验证结果:在父域解析子域是完全没问题的,但是在子域上无法解析父域,因为上级域知道自己的直接下属,而子域无法解析test.com 所以只能去找根. 所以刚才在子域上无法去获取父域的信息。
4.让子域可以解析父域:
最简单的方法则是只转发对父域的请求
在子域服务器编辑named.rfc1912.conf,加入以下参数:
zone"test.com" IN {
type forward;
forward only;
forwarders { 10.0.10.61; }; #将请求转发到我们的辅DNS服务器
};
[root@test3named]# named-checkconf
[root@test3named]# rndc reload
serverreload successful
[root@test3named]# rndc reload
serverreload successful
使用dig查看解析状态
[root@test3named]# dig -t A www.test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.test.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31772
# ra为转发得到的答案
;;flags: qr rd ra; QUERY:1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 2
;;QUESTION SECTION:
;www.test.com. IN A
;;ANSWER SECTION:
www.test.com. 600 IN A 10.0.10.60
www.test.com. 600 IN A 10.0.10.61
;;AUTHORITY SECTION:
test.com. 600 IN NS dns2.test.com.
test.com. 600 IN NS dns.test.com.
;;ADDITIONAL SECTION:
dns.test.com. 600 IN A 10.0.10.60
dns2.test.com. 600 IN A 10.0.10.61
;;Query time: 3 msec
;;SERVER: 10.0.10.62#53(10.0.10.62)
;;WHEN: Fri Dec 20 01:11:14 2013
;; MSGSIZE rcvd: 131
5.总结:
(1)子域授权分类:
·域内:划分出小域即为子域。
·授权:委派授权。
(2)子域授权创建步骤:
·划分子域。
·完成授权。
(3)子域是无法解析父域,从而必须向根请求,而父域可以解析子域的请求,因为子域是父域的下属
(4)如果想让子域解析父域,最简单的办法就是设置转发
实现bind view视图
view主要功能就是明确说明对某个区域的请求先区分它的客户端来源再定义这些区域的,所以对一个特定区域来讲来自不同的客户端请求得到的响应的答案是不同的,所以一个view最关键的就是如何对客户端来源进行分类,要想实现来自不同的客户端用户的结果不同需要定义多个view,而每个view中的zone对应的区域数据文件跟以下例子对应的文件是不同的:
例:
view"" {
match-clients { 10.0.0.60/24 };
zone "test.com" IN {
FILE "interal"
}
}
viewview_name {
match-clients { any; }
zone "test.com" IN {
type master;
file"external";
}
}
1.定义view
首先需要新添加一块虚拟网卡(10.0.0.x/24),定义如下:
10.0.10.0/24: www.test.com 得到的地址是 10.0.10.60
10.0.0.0/24 : www.test.com 得到的地址是 10.0.0.60
2.配置view
编辑配置文件
[root@test~]# vim /etc/named.conf
将以下参数(根域配置参数) 剪切到rfc1912中,因为在view中不允许配置额外域的
zone"." IN {
type hint;
file "named.ca";
};
编辑named.rfc1912.zones
[root@test~]# vim /etc/named.rfc1912.zones
viewinternal { #定义视图名
match-clients { 10.0.10.0/24; }; #定义定义匹配的client,可以使用IP,也可以使用之前定义的acl名称
recursion yes; #是否递归(默认是允许),可写可不写,根据个人需求来定义
zone"." IN {
type hint;
file "named.ca";
};
zone"localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone"localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone"1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa"IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone"1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone"0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
zone"test.com" IN {
type master;
file "test.com.zone";
allow-transfer { allowxfer; };
allow-query { query; };
};
zone"10.0.10.in-addr.arpa" IN {
type master;
file "10.0.10.zone";
};
zone"www.51cto.com" IN {
type forward;
forward only;
forwarders { 10.0.10.61; };
};
};
如上所示,一个视图区域就创建完成了,接下来创建第二个视图区域:
继续编辑配置文件,追加入以下参数:
viewexternal {
match-clients { any; };
zone"test.com" IN {
type master;
file "x.test.com.zone";
};
zone"10.0.10.in-addr.arpa" IN {
type master;
file "x.10.0.0.zone";
};
};
3.创建any view
保留权限复制文件
[root@testnamed]# cp -p test.com.zone x.test.com.zone
修改配置文件,如下所示
[root@testnamed]# cat x.test.com.zone
$TTL 600
$ORIGINtest.com.
@ IN SOA dns.test.com. admin.test.com. (
20131223
2H
10M
7D
6H )
IN NS dns
IN NS dns2
IN MX 10 mail
dns IN A 10.0.10.60
dns2 IN A 10.0.10.60
www IN A 10.0.0.60
mail IN A 10.0.0.60
ftp IN CNAME www.test.com.
www IN A 10.0.0.61
icmp IN A 10.0.0.60
4.配置反向:
创建zone对应文件名称,并加入以下参数:
[root@testnamed]# cat x.10.0.0.zone
$TTL 600
@ IN SOA dns.test.com. admin.test.com. (
20131214
2H
10M
7D
6H )
IN NS dns.test.com.
IN NS dns2.test.com.
60 IN PTR www.test.com.
60 IN PTR mail.test.com.
60 IN PTR dns.test.com.
61 IN PTR dns2.test.com.
测试:将测试机的10.0.10.x段网卡关闭再使用dig进行查询
[root@test3~]# ifdown eth0
[root@test3~]# ifconfig
eth1 Link encap:Ethernet HWaddr 00:0C:29:EF:9C:EF
inet addr:192.168.74.133 Bcast:192.168.74.255 Mask:255.255.255.0
inet6 addr:fe80::20c:29ff:feef:9cef/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:109 errors:0 dropped:0overruns:0 frame:0
TX packets:34 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:16600 (16.2 KiB) TX bytes:3574 (3.4 KiB)
eth2 Link encap:Ethernet HWaddr 00:0C:29:EF:9C:F9
inet addr:10.0.0.62 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr:fe80::20c:29ff:feef:9cf9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:628 errors:0 dropped:0overruns:0 frame:0
TX packets:738 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:68371 (66.7 KiB) TX bytes:78366 (76.5 KiB)
使用dig查询结果
[root@test3~]# dig -t A www.test.com
;<<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> -tA www.test.com
;;global options: +cmd
;; Gotanswer:
;;->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11976
;; flags:qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL:2
;;QUESTION SECTION:
;www.test.com. IN A
;;ANSWER SECTION:
www.test.com. 600 IN A 10.0.0.61
www.test.com. 600 IN A 10.0.0.60
;;AUTHORITY SECTION:
test.com. 600 IN NS dns2.test.com.
test.com. 600 IN NS dns.test.com.
;;ADDITIONAL SECTION:
dns.test.com. 600 IN A 10.0.10.60
dns2.test.com. 600 IN A 10.0.10.60
;;Query time: 0 msec
;;SERVER: 10.0.0.60#53(10.0.0.60)
;;WHEN: Fri Dec 20 19:13:54 2013
;; MSGSIZE rcvd: 131
5.总结:
(1) 根据网段来划分的不同视图,如有其他需求或ip量过大,可以定义acl
(2) 参考文献:http://www.centos.bz/2012/02/cnc-chinanet-bind-intelligent-dns-deploy/
bind日志功能
在默认情况下,bind服务把日志消息写到 /var/log/messages 文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息;而将调试日志信息写入 BIND 服务器工作目录中的 named.run 文件。bind日志配置是非常灵活,可以详细记录服务运行状况,自定义某些敏感信息、日志轮询等等。
由此对bind来讲他的所有日志功能都是在主配置文件named.conf中的logging段中来记录的,而bind系统非常灵活,是由2组来定义:
而bind系统非常灵活,是由2组来定义
(1)定义一个channel,channel主要定义日志被发送到哪里去
(2)定义哪些日志发送至channel或channel的日志发送到哪个位置中去
格式如下:
logging{
channel default_debug { #定义channel,defualt_debug 为自定义名称
file"data/named.run"; #记录日志自动保存在bind管理的文件中
severity dynamic; #定义日志级别为dynamic定义哪些日志发送至channel,或channel的日志发送到哪个位置中去
};
};
1.日志定义流程:
(1)定义channel,主要定义日志被发送到哪里去;
(2)category:比如启动一次区域传送,区域传送本身会产生日志或发送了一次区域查询也会产生日志,这是2个所谓不同功能所产生的日志;
(3)事实上bind一共内置15种category,在定义日志信息产生日志位置的时候也只能使用其中一种;
(4)产生的信息可以被发往channel中去,由channel来决定发往哪个位置;
(5)而同一个category可以发往多个channel,但是一个channel只能记录一个category发来的信息;
2.日志级别
所谓日志级别是所产生的信息有些是纯粹的调试信息有些是说明信息,有些是警告,有些是紧急信息,所以这些信息的紧急程度也是有级别的。
syslog级别分别是:
criticalerror warning notice info debug[level] dynamic
当我们指定日志级别之后包括这个级别以及比这个级别高的所有信息都会记录,而critical 是最高级别
query日志级别分别是
default
#default类别匹配所有未明确指定通道的类别,但是不匹配不属于任何类别的消息。这些不属于任何类别的消息属于下面列出的这些类别。
general
#包括所有未明确分类的BIND消息。
client
#处理客户端请求。
config
#配置文件分析和处理。
database
#同BIND内部数据库相关的消息,用来存储区数据和缓存记录。
dnssec
#处理DNSSEC签名的响应。
lame-servers
#发现错误授权。
network
#网络操作
notify
#异步区变动通知。
queries
#查询日志
resolver
#名字解析,包括对来自解析器的递归查询的处理。
security
#认可/非认可的请求。
update
#动态更新事件。
xfer-in
#从远程名字服务器到本地名字服务器的区传送。
xfer-out
#从本地名字服务器到远程名字服务器的区传送。
3.定义日志
编辑主配置文件,找到logging段
[root@test~]# cat /etc/named.conf
加入以下参数
logging{
channel default_debug {
file"data/named.run";
severity dynamic;
};
channel querylog { #定义channel
file"/var/log/bind_query.log" versions 10 size 10M ; #定义日志文件保存绝对路径,指定vsersions版本为10 日志大小为10M,超过10M则自动轮询
severity dynamic; #定义日志级别为dynamic (动态)
print-time yes; #记录额外信息
print-category yes; #记录category信息
print-severity yes; #记录日志级别信息
};
category queries { querylog; }; #query必须是15个级别中的其中一个,将query日志信息保存至刚定义的querylog组里去,category日志可以发送至多个channel,但一个channel只能接收一个category信息
};
再次强调:
query必须是15个级别中的其中一个,将query日志信息保存至刚定义的querylog组里去,category日志可以发送至多个channel,但一个channel只能接收一个category信息
最开始是没有日志文件的,方便起见,来手动创建配置文件,并授权
[root@test~]# touch /var/log/bind_query.log
[root@test~]# chown named.named /var/log/bind_query.log
[root@test~]# named-checkconf
[root@test~]# rndc reload
测试:
我们使用另外一台测试机来对其使用dig命令查询解析
[root@test3~]# dig -t A www.test.com
再反过来查看其日志文件:
[root@test~]# tail /var/log/bind_query.log
19-Dec-201300:19:56.028 queries: info: client 10.0.10.60#32960: view internal: query:www.test.com IN A + (10.0.10.60)
这里是使用query来实现日志的定义,如果将日志发往syslog的话,syslog会自动记录时间
4.总结:
(1)bind日志通过named.conf中的logging段来自定义的
(2)channel:用来定义日志信息记录在何处,一般有两种形式:1:file 2:syslog
(3)category:记录哪个功能产生的日志信息,内置有15种category,不能自定义,只能使用其中一个,一个category产生的日志可以发往多个channel;而一个channel只能为一个category记录日志。