一、什么是名称解析?
我们知道,主机之间通信必需要知道对方的ip地址,但是,ip地址并不好记,而且互联网上主机那么多,不可能都记下来。有一个解决办法,我们可以给主机取个方便记忆的名称,让名称与ip地址建立关联,然后我们就可透过主机的名称访问主机了。例如,用户要访问网易,并不是直接输入其web主机的ip地址,而是输入其名称www.163.com,这个名称会被某种机制解析为对应的ip地址,用户获取到其ip地址后就能发起连接请求了
所以,名称解析就是根据用户所提供的一种名称,去查询解析库,以得到另一种名称(地址)。解析库实际上是某种存储,存储着名称和地址之间的对应关系,这种存储有多种形式:
文本文件:不适宜存储大量的记录,检索缓慢;如本地的/etc/hosts文件;
关系型数据库:有索引机制,检索快;如mysql,oracle
LDAP(lightweight directory access protocol,轻量目录访问协议):检索比关系型数据库更快
二、DNS基础
DNS(domain name system,域名系统)就是一种名称解析机制或协议
DNS采用C/S架构:
server:bind,53/udp(用于DNS查询,较快),53/tcp(用于区域传送)
client:共享库
1、DNS的分级授权管理:
由于互联网主机太多,名称解析请求量太过庞大,在一个或多个DNS服务器上存储所有的记录完全不现实,为此,DNS实行分级授权管理:将整个名称空间分成多级多个域,每个DNS服务器管理一片区域。每级DNS服务器管理下一级DNS服务器,不越级管理,直至最后一级DNS服务器解析一块区域的主机。好比地球上有多个国家,国家又分省、省分市、市分区、一个区由多个公民组成;中央管理省、省管理市...,但中央不会直接管理公民。
根域:root domain,整个名称空间,由一个“.”表示。全球有13组DNS根服务器
一级域(顶级域):top-level domain
组织域:.com, .org, .net, .mil, .edu, .gov
二级域:公司、组织、个人使用;如.sohu,.amazon
主机:如www,mail
例如 www.163.com,实际上末尾省略了一个“.”,完整的应写作www.163.com.,我们称为之为 FQDN(full qulified domain name,完全限定域名),从右到左其区域逐渐缩小:其一级域为“.com”,二级域为“.163”,因此域名为“.163.com.”,而主机名为www
▲FQDN中的主机名与主机的hostname是两个不同概念,不要求一样:前者是在网络上公开的用于通信的主机标识,可供解析;后者只是某个特定主机的代号,不能被解析。例如www.163.com这个站点可能对应多个ip,即对应多个web主机,这些主机在网络上有个共同的标识www,而在本地我们可以分别给它们取名node1,node2....以作区分
2、DNS解析:
正向解析:FQDN --> IP,一个名称可以对应多个ip
反向解析:IP --> FQDN,一个ip也可对应多个名称
正向解析和反向解析分别使用一个解析库
3、DNS查询过程:
总体过程为:浏览器缓存 --> /etc/hosts --> local dns cache --> dns server (cache) --> 迭代
先查询客户端本地DNS缓存及本地hosts文件,无结果再请求本地设置的DNS服务器(LDNS),若无结果LDNS会从DNS系统的根(".")开始发起迭代查询,获取到解析结果后会发给客户端并缓存,客户端也会将解析的结果缓存。详细过程见上图
本机DNS缓存加速了名称解析过程,减轻了服务器端压力。本机DNS缓存和DNS服务器缓存都是有有效期的,因为名称对应的ip地址是可能会发生改变的
根据DNS的分级管理和迭代查询机制,一个DNS服务器要在互联网上工作,必须到域名注册商那里注册(在父域DNS服务器的区域解析库中添加NS和A记录)
4、DNS服务器类型:
主从DNS服务器解析库文件同步的过程:区域传送 (单方向传送),基于53/tcp
完全区域传送:axfr
周期性检查 + 通知
5、区域解析库
资源记录:rr(resource record)
㈠资源记录类型:表示此记录解析的属性
㈡资源记录格式:
name [ttl] IN RRType value
①SOA:Start Of Authority,任何解析文件的第一个记录的类型必须是SOA且一个区域文件只能有一个
IN SOA ns.hello.com. admin.hello.com.(邮箱) (
serial number #解析库的版本号,例如2014080401;若有配置主从,每次修改解析文件,要更新版本号,以便从服务器同步
说明:@表示当前当前定义的区域,按上面的例子,完整地应写为hello.com.
因@在解析库中有特殊意义,故邮箱地址中不能使用,而用.代替,如上面的admin.hello.com.
②NS:name server
IN NS ns.hello.com.
如果有多台NS服务器,每一个都必须有对应的NS记录;
对于正向解析文件来讲,每一个NS的FQDN都应该有一个A记录;
@ IN MX 10 mail.hello.com.
@ IN MX 20 mail2.hello.com.
注意:
如果有多台MX服务器,每一个都必须有对应的MX记录;但各MX记录还有优先级属性(0-99)
④A:Address
pop3.hello.com. IN A 1.1.1.3
泛域名解析:将所有匹配不到资源记录的请求都解析到指定ip地址
IN A 1.1.1.1
用途:
⑴可以让域名支持无限的子域名;
⑵防止用户错误输入导致的网站不能访问的问题;例如 wwww.hello.com
⑥CNAME:Canonical Name
⑦PTR:pointer,反向解析
name: 逆向的IP地址加后缀.in-addr.arpa.,例如172.16.100.7,其name为7.100.16.172.in-addr.arpa.
7.100.16.172.in-addr.arpa. IN PTR www.hello.com.
三、DNS服务器基本配置
配置文件:/etc/named.conf, /etc/named.rfc1912.zones
安全起见,DNS服务进程是以系统用户named的身份运行的。named可运行于chroot环境,即可以/var/named/chroot/作为named进程的根,要实现这一功能需要另外安装bind-chroot包。
Linux有一个特性:只有管理员才能使用小于1024的端口,因此named进程得由管理员启动,启动完成后再切换为以named系统用户的身份运行
1、安装配置过程
yum install bind
②修改配置文件:
...
// directory "/var/named"; #工作目录;必不可少
...
■options中几个重要参数:
1、listen-on port 53 { any; };
监听在哪些地址上。预设是监听在127.0.0.1,亦即只有本机可以对DNS服务进行查询,所以应改成any或直接用//将本条目注释掉
2、directory "/var/named";
工作目录,解析库的存放位置。必不可少
3、allow-query { any; };
这个是针对用户端的设定,指定谁可以对我的DNS服务提出查询请求
4、recursion yes; #允许递归
recursion no; #不递归,意思就是本机管理的域名之外的DNS请求都不回答
allow-recursion { ip; };
★区域既可定义在主配置文件/etc/named.conf中,也中定义在/etc/named.rfc1912.zones中,因为主配置文件默认已 include 后者了
反向区域的名称为逆向网络地址加.in-addr.arpa做后缀。例如172.16.100.7/16, 其网络地址为172.16,那么反向区域名称则为"16.172.in-addr.arpa"
③为每一个区域提供解析库
变量的定义
资源记录
说明:
⑴正向解析和反向解析文件中的名称可以仅使用相对名称,它们均相对当前区域而言;
⑵绝对后缀可以使用$ORIGIN来定义;
2、检查工具
①named-checkconf:检查配置文件的语法和完整性
②named-checkzone:检查区域解析库文件的语法和完整性
用法:named-checkzone zonename filename
例如named-checkzone hello.com /var/named/hello.com.zone
③service named configtest
[root@node2 ~]# yum -y install bind
...
Installed:
bind.x86_64 32:9.8.2-0.37.rc1.el6_7.4
Dependency Installed:
bind-libs.x86_64 32:9.8.2-0.37.rc1.el6_7.4
Complete!
[root@node2 ~]# rpm -ql bind
/etc/NetworkManager/dispatcher.d/13-named
/etc/logrotate.d/named
/etc/named
/etc/named.conf #主配置文件
/etc/named.iscdlv.key
/etc/named.rfc1912.zones #配置文件
/etc/named.root.key
/etc/portreserve/named
/etc/rc.d/init.d/named #服务脚本
/etc/rndc.conf
/etc/rndc.key
/etc/sysconfig/named
/usr/lib64/bind
...
/usr/sbin/named
/usr/sbin/named-checkconf #检查配置文件的语法和完整性
/usr/sbin/named-checkzone #检查区域解析库文件的语法和完整性
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc #域名服务控制工具
/usr/sbin/rndc-confgen
...
/var/log/named.log
/var/named #各种解析文件的存放目录
/var/named/data
/var/named/dynamic
/var/named/named.ca #根区域解析库,记录着全球13台根DNS服务器的地址
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback
/var/named/slaves
/var/run/named
[root@node2 ~]# vim /etc/named.conf
...
options {
//listen-on port 53 { 127.0.0.1; }; #用双斜线注释掉,表示监听在所有地址上。或者改成 0.0.0.0/0
//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; #DNS安全扩展,防止DNS响应报文被篡改
//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; #hint表示定义的是互联网中根域名服务器
file "named.ca";
};
include "/etc/named.rfc1912.zones";
//include "/etc/named.root.key";
[root@node2 ~]# vim /etc/named.rfc1912.zones
...
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 "inception.com" IN { #定义一个正向区域
type master;
file "inception.com.zone";
};
zone "30.168.192.in-addr.arpa" { #定义一个反向区域
type master;
file "192.168.30.zone";
};
[root@node2 ~]# named-checkconf #配置文件语法检查
[root@node2 ~]# cd /var/named
[root@node2 named]# vim inception.com.zone #创建正向区域解析文件
$TTL 3600 #DNS缓存时长
@ IN SOA ns.inception.com. admin.inception.com. (
2015120201
2H
10M
7D
1D )
@ IN NS ns.inception.com.
@ IN MX 10 mail.inception.com.
ns.inception.com. IN A 192.168.30.20
mail.inception.com. IN A 192.168.30.11
www.inception.com. IN A 192.168.30.10
web.inception.com. IN CNAME www.inception.com.
# @表示当前定义的区域,完整的可定为“inception.com.”。除了第一条的@,后面的@都可省略;除了第一条SOA记录必须写全之外,其它都可使用相对名称,例如ns.inception.com.可简写为ns
[root@node2 named]# vim 192.168.30.zone #创建反向区域解析文件
$TTL 3600
@ IN SOA ns.inception.com. admin.inception.com. (
2015120201
2H
10M
7D
1D )
IN NS ns.inception.com.
20 IN PTR ns.inception.com.
11 IN PTR mail.inception.com.
10 IN PTR www.inception.com.
# 20是20.30.168.192.in-addr.arpa.的简写;反向区域中无A、MX和CNAME记录
[root@node2 named]# named-checkzone inception.com inception.com.zone #检查解析文件
zone inception.com/IN: loaded serial 2015120201
OK
[root@node2 named]# named-checkzone 30.168.192.in-addr.arpa 192.168.30.zone
zone 30.168.192.in-addr.arpa/IN: loaded serial 2015120201
OK
[root@node2 named]# ls -ld #/var/named目录权限为750
drwxr-x--- 5 root named 120 Dec 4 21:11
[root@node2 named]# ll
total 36
-rw-r--r-- 1 root root 559 Dec 4 22:12 192.168.30.zone
drwxrwx--- 2 named named 4096 Nov 29 10:21 data
drwxrwx--- 2 named named 4096 Sep 3 11:24 dynamic
-rw-r--r-- 1 root root 680 Dec 4 22:07 inception.com.zone
-rw-r----- 1 root named 2075 Apr 23 2014 named.ca
-rw-r----- 1 root named 152 Dec 15 2009 named.empty
-rw-r----- 1 root named 152 Jun 21 2007 named.localhost
-rw-r----- 1 root named 168 Dec 15 2009 named.loopback
drwxrwx--- 2 named named 4096 Sep 3 11:24 slaves #slaves目录的属主属组均为named
[root@node2 named]# chgrp named inception.com.zone 192.168.30.zone #将解析文件的属组改为named
[root@node2 named]# chmod 640 inception.com.zone 192.168.30.zone #安全起见,不应让其它用户对解析文件具有任何权限
[root@node2 named]# service named configtest #综合检查
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
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: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
zone inception.com/IN: loaded serial 2015120201
zone 30.168.192.in-addr.arpa/IN: loaded serial 2015120201
[root@node2 named]# service named start
Generating /etc/rndc.key: [ OK ]
Starting named: [ OK ]
[root@node2 named]# netstat -tuanp | grep 'named' #953/tcp是named进程接受rndc控制的端口
tcp 0 0 192.168.30.20:53 0.0.0.0:* LISTEN 8576/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 8576/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 8576/named
tcp 0 0 ::1:953 :::* LISTEN 8576/named
udp 0 0 192.168.30.20:53 0.0.0.0:* 8576/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 8576/named
[root@node2 named]# iptables -F
#若有开启防火墙,应放行端口,这里为操作方便,直接清除所有规则,实际环境中不可这样做
3、查询和测试工具
bind-utils包提供的几个工具:
①host:常用的域名查询工具,可以用来测试域名系统工作是否正常
用法:host -t type name [server]
-v: 输出详细信息
类型可使用AXFR
若不指定server,则默认为/etc/resolv.conf文件中指定的DNS服务器
例如:host -t NS hello.com 172.16.100.7
②nslookup:域名查询工具
用法:交互式和非交互式
交互式:
nslookup
> server [IP]
> set type={A|SOA|NS|MX}
> name
非交互式:nslookup name [server] #这种用法只能查询特定类型(A、PTR)
③dig:常用的域名查询工具,可以用来测试域名系统工作是否正常
用法:dig -t type name [@server]
反向解析不使用-t PTR,而使用-x
查询选项:
+trace
+notrace
+recurse
+norecurse:不递归
dig -x 192.168.30.10 @192.168.30.20
dig +trace www.baidu.com @8.8.8.8 #显示解析过程
[root@node1 ~]# host
-bash: host: command not found
[root@node1 ~]# yum -y install bind-utils
...
[root@node1 ~]# host -t A www.inception.com #默认server为/etc/resolv.conf中指定的DNS服务器地址
www.inception.com has address 72.52.4.121
[root@node1 ~]# host -t A www.inception.com 192.168.30.20
Using domain server:
Name: 192.168.30.20
Address: 192.168.30.20#53
Aliases:
www.inception.com has address 192.168.30.10
[root@node1 ~]# host -t PTR 192.168.30.10 192.168.30.20
Using domain server:
Name: 192.168.30.20
Address: 192.168.30.20#53
Aliases:
10.30.168.192.in-addr.arpa domain name pointer www.inception.com.
[root@node1 ~]# nslookup
> server 192.168.30.20
Default server: 192.168.30.20
Address: 192.168.30.20#53
> set type=NS
> inception.com
Server: 192.168.30.20
Address: 192.168.30.20#53
inception.com nameserver = ns.inception.com.
> ^C
[root@node1 ~]# dig -t AXFR inception.com @192.168.30.20
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t AXFR inception.com @192.168.30.20
;; global options: +cmd
inception.com. 3600 IN SOA ns.inception.com. admin.inception.com. 2015120208 7200 600 604800 86400
inception.com. 3600 IN NS ns.inception.com.
inception.com. 3600 IN MX 10 mail.inception.com.
mail.inception.com. 3600 IN A 192.168.30.11
ns.inception.com. 3600 IN A 192.168.30.20
web.inception.com. 3600 IN CNAME www.inception.com.
www.inception.com. 3600 IN A 192.168.30.10
inception.com. 3600 IN SOA ns.inception.com. admin.inception.com. 2015120201 7200 600 604800 86400
;; Query time: 1 msec
;; SERVER: 192.168.30.20#53(192.168.30.20)
;; WHEN: Sat Dec 5 06:02:02 2015
;; XFR size: 8 records (messages 1, bytes 217)
四、DNS主从同步
1、准备工作
①到域名注册商那里添加一条NS和A记录
父域的区域解析库中:
hello.com. IN NS ns2.hello.com.
ns2.hello.com. IN A 172.10.200.7
②主从时间同步
ntpdate NTP_SERVER
crontab:
*/3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null
③bind版本差异:只能相同或主低从高
2、在主服务器区域解析库中添加NS和对应的A记录
3、在从服务器上定义从区域
zone "ZONE_NAME" IN {
type slave;
file "slaves/ZONE_NAME.zone";
masters { 172.16.100.7; }; #既可指向主,又可指向其它的从
};
说明:从服务器的解析文件从主DNS服务器同步而来,不能手动创建和修改
named进程对工作目录/var/named是没有写权限的,而在从服务器上又不能像在主服务器上那样以管理员的身份手动创建解析库,故bind提供了一个目录/var/named/slaves用来专门存放同步而来的解析文件。named进程对该目录是有写权限的
在以下的示例中,node2为主,centos7为从
[root@node2 ~]# ntpdate 202.120.2.101
...
[root@node2 ~]# crontab -e #创建一个时间同步的任务计划
*/5 * * * * /usr/sbin/ntpdate 202.120.2.101 &> /dev/null
[root@node2 ~]# cd /var/named
[root@node2 named]# vim inception.com.zone
$TTL 3600
@ IN SOA ns.inception.com. admin.inception.com. (
2015120203 #更新版本号
2H
10M
7D
1D )
IN NS ns
IN NS ns2 #添加一条NS和A记录
IN MX 10 mail
ns IN A 192.168.30.20
ns2 IN A 192.168.30.30
mail IN A 192.168.30.11
www IN A 192.168.30.10
web IN CNAME www
[root@node2 named]# vim 192.168.30.zone
$TTL 3600
@ IN SOA ns.inception.com. admin.inception.com. (
2015120203
2H
10M
7D
1D )
IN NS ns.inception.com.
IN NS ns2.inception.com.
20 IN PTR ns.inception.com.
30 IN PTR ns2.inception.com.
11 IN PTR mail.inception.com.
10 IN PTR www.inception.com.
[root@node2 named]# named-checkzone inception.com inception.com.zone
zone inception.com/IN: loaded serial 2015120203
OK
[root@node2 named]# named-checkzone 30.168.192.in-addr.arpa 192.168.30.zone
zone 30.168.192.in-addr.arpa/IN: loaded serial 2015120203
OK
[root@node2 named]# rndc reload #重新装载
server reload successful
[root@centos7 ~]# ntpdate 202.120.2.101
[root@centos7 ~]# crontab -e
*/5 * * * * /usr/sbin/ntpdate 202.120.2.101 &> /dev/null
[root@centos7 ~]# yum -y install bind
...
[root@centos7 ~]# vim /etc/named.conf
...
[root@centos7 ~]# vim /etc/named.rfc1912.zones
...
zone "inception.com" IN { #定义一个正向从区域
type slave;
file "slaves/inception.com.zone"; #从服务器上的解析库存放于slaves目录下
masters { 192.168.30.20; };
};
zone "30.168.192.in-addr.arpa" IN { #定义一个反向从区域
type slave;
file "slaves/192.168.30.zone";
masters { 192.168.30.20; };
};
[root@centos7 ~]# named-checkconf
[root@centos7 ~]# iptables -F
[root@centos7 ~]# systemctl start named.service #CentOS 7上的服务启动方式
[root@centos7 ~]# ss -tuan | grep ':53'
tcp UNCONN 0 0 192.168.30.30:53 *:*
tcp UNCONN 0 0 127.0.0.1:53 *:*
tcp UNCONN 0 0 *:5353 *:*
tcp LISTEN 0 10 192.168.30.30:53 *:*
tcp LISTEN 0 10 127.0.0.1:53 *:*
[root@node2 named]# tail /var/log/messages
...
Dec 5 06:15:18 node2 named[8576]: zone 30.168.192.in-addr.arpa/IN: loaded serial 2015120203
Dec 5 06:15:18 node2 named[8576]: zone 30.168.192.in-addr.arpa/IN: sending notifies (serial 2015120203)
Dec 5 06:15:18 node2 named[8576]: zone inception.com/IN: loaded serial 2015120203
Dec 5 06:15:18 node2 named[8576]: zone inception.com/IN: sending notifies (serial 2015120203)
Dec 5 06:20:21 node2 named[8576]: client 192.168.30.30#58139: transfer of '30.168.192.in-addr.arpa/IN': AXFR started
Dec 5 06:20:21 node2 named[8576]: client 192.168.30.30#58139: transfer of '30.168.192.in-addr.arpa/IN': AXFR ended
Dec 5 06:20:22 node2 named[8576]: client 192.168.30.30#39481: transfer of 'inception.com/IN': AXFR started
Dec 5 06:20:22 node2 named[8576]: client 192.168.30.30#39481: transfer of 'inception.com/IN': AXFR ended
[root@centos7 ~]# ls /var/named/slaves #可以看到从服务器已同步生成解析文件
192.168.30.zone inception.com.zone
[root@centos7 ~]# file /var/named/slaves/inception.com.zone
/var/named/slaves/inception.com.zone: data #从服务器上的解析库为非文本类型
[root@centos7 ~]# host -t A www.inception.com 192.168.30.30
Using domain server:
Name: 192.168.30.30
Address: 192.168.30.30#53
Aliases:
www.inception.com has address 192.168.30.10
五、bind的访问控制功能
bind acl:
内置的acl:
none, any, localhost, localnet(本机所在网络)
自定义acl:
acl ACL_NAME {
ip;
network;
};
例如:
acl localnetwork {
172.16.0.0/16;
192.168.0.0/24;
};
访问控制:
allow-transfer {};
allow-transfer { ip; ip; ip; ... }; #可以是网段,还可使用!ip
allow-transfer { localnet; }
allow-recursion {};
recursion yes;
allow-query {};
allow-update {};
六、区域传送的限制
DNS服务器默认允许其它DNS服务器来同步,或者直接在dig命令中指定AXFR类型就可获取DNS服务器端全部资源记录。这样无疑很危险,某些恶意用户可能利用这些信息进行进攻。因此对DNS服务器的区域传送范围进行限制是必要的
allow-transfer { ... };
[root@node2 ~]# vim /etc/named.rfc1912.zones
...
zone "inception.com" IN {
type master;
file "inception.com.zone";
allow-transfer { 192.168.30.30; 192.168.30.20; 127.0.0.1; }; #只给本机和指定的从服务器区域传送
allow-update { none; }; #不允许动态DNS更新
};
...
[root@node2 ~]# named-checkconf
[root@node2 ~]# rndc reload
[root@centos7 ~]# vim /etc/named.rfc1912.zones
...
zone "inception.com" IN {
type slave;
file "slaves/inception.com.zone";
masters { 192.168.30.20; };
allow-transfer { none; }; #从服务器不给其它任何主机区域传送
};
...
[root@centos7 ~]# named-checkconf
[root@centos7 ~]# rndc reload
[root@node1 ~]# dig -t AXFR inception.com @192.168.30.20
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t AXFR inception.com @192.168.30.20
;; global options: +cmd
; Transfer failed.
[root@node1 ~]# dig -t AXFR inception.com @192.168.30.30
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t AXFR inception.com @192.168.30.30
;; global options: +cmd
; Transfer failed.
七、rndc
rndc是BIND安装包提供的一种控制域名服务运行的工具,通过这个工具可以了解本地或远程域名服务器的运行状况,也可以对域名服务进行关闭、重载、刷新缓存、增加删除zone等操作。
rndc与DNS服务器连接时,需要通过加密认证。在当前版本下,rndc和named都只支持HMAC-MD5认证算法,在通信两端使用共享密钥。rndc在连接通道中发送命令时,必须使用经过服务器认可的密钥加密。为了生成双方都认可的密钥,可以使用rndc-confgen命令产生密钥和相应的配置,再把这些配置分别放入named.conf和rndc的配置文件rndc.conf中
HMAC-MD5原理:
HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行hash计算,将所得hash值与该密钥混合,然后再次进行hash计算,输出的hash值长度为 128 位。
在rndc端(发送方)和named端(接受方)共享密钥的前提下,HMAC 可用于确定通过不安全信道发送的消息是否已被篡改。rndc端将原始数据和hash值放在一个消息中同时传送。named端重新计算所接收消息的hash值,并检查其是否与接收到的hash值相同。因为更改消息和重新生成正确的hash值需要共享密钥,所以对数据或hash值的任何更改都会导致不匹配。因此,如果原始的hash值与计算得出的hash值相匹配,则通过身份验证。
1、可以注意到,在首次启动named服务进程中,会自动生成一个本机rndc和named共享的密钥文件/etc/rndc.key,因此我们可直接通过rndc管理本机上的域名服务
rndc远程控制很危险,通常只让named进程接受本机rndc控制
查看named启动脚本就可知道,这个密钥实际上由rndc-confgen命令生成的:
rndc-confgen [-a] -r randomfile
选项:
-r randomfile:指定随机数生成源
随机数生成源:
/dev/urandom:先返回熵池(当前系统的环境噪音)中的随机数,耗尽后会用软件算法生成随机数;进程不会阻塞;
/dev/random:只返回熵池中的随机数;随机数耗尽,进程会被阻塞;
[root@node2 ~]# service named start
Generating /etc/rndc.key: [ OK ]
Starting named: [ OK ]
[root@node2 ~]# cat /etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "LwH/DX11ZL1HQqx72npQiA=="; #rndc端和named端要共享一个密钥才能通过认证
};
[root@node2 ~]# less /etc/init.d/named
...
if [ ! -s /etc/rndc.key -a ! -s /etc/rndc.conf ]; then
# Generate rndc.key if doesn't exist AND there is no rndc.conf
echo -n $"Generating /etc/rndc.key:"
if /usr/sbin/rndc-confgen -a -r /dev/urandom > /dev/null 2>&1; then
chmod 640 /etc/rndc.key
chown root.named /etc/rndc.key
[ -x /sbin/restorecon ] && /sbin/restorecon /etc/rndc.key
success $"/etc/rndc.key generation"
echo
else
failure $"/etc/rndc.key generation"
echo
fi
fi
...
2、在启动named过程中,有时可能会卡在"Generating /etc/rndc.key"阶段,这通常是由于启动脚本中指定的随机数生成源为/dev/random且当前熵池中的随机数已被耗尽,进程被阻塞了。解决的方法有:
①修改启动脚本中的随机数源为/dev/urandom
②rndc-confgen -a -r /dev/urandom
3、rndc工具的使用
用法:rndc [-s server] COMMAND
rndc命令后可接的管理命令有:
reload:重新装载
reconfig:重新装载配置文件
flush:释放DNS缓存
status:查看named服务状态
query log on|off:是否开启查询日志;在繁忙的服务器上会产生大量I/O,影响性能,故一般只在调试时开启
trace
[root@node2 named]# rndc reload
server reload successful
[root@node2 named]# rndc status
version: 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4
CPUs found: 2
worker threads: 2
number of zones: 21
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
八、DNS子域授权
当一个企业的部门和主机数量越来越多,为便于管理,我们可再划分若干个DNS子域
正向子域授权:
只需要在父域的区域解析库中添加“胶水记录”,glue record
子域名称 IN NS 子域的名称服务器
ops IN NS ns.ops
ns.ops IN A 172.16.100.77
dev IN NS ns.dev
ns.dev IN A 172.16.100.88
授权子域后再配置各子域的DNS服务器即可
以下的示例中,node2为父域DNS服务器,node3为子域DNS服务器
[root@node2 ~]# cd /var/named
[root@node2 named]# vim inception.com.zone
$TTL 3600
@ IN SOA ns.inception.com. admin.inception.com. (
2015120204 #更新版本号
2H
10M
7D
1D )
IN NS ns
IN NS ns2
IN MX 10 mail
ns IN A 192.168.30.20
ns2 IN A 192.168.30.30
mail IN A 192.168.30.11
www IN A 192.168.30.10
web IN CNAME www
ops IN NS ns.ops #添加胶水记录
ns.ops IN A 192.168.30.13
[root@node2 named]# named-checkzone inception.com inception.com.zone
zone inception.com/IN: ops.inception.com/NS 'ns.ops.inception.com' (out of zone) has no addresses records (A or AAAA)
zone inception.com/IN: loaded serial 2015120204
OK
[root@node2 named]# rndc reload
server reload successful
[root@node3 ~]# yum -y install bind
...
[root@node3 ~]# vim /etc/named.conf
...
[root@node3 ~]# vim /etc/named.rfc1912.zones
...
zone "ops.inception.com" IN {
type master;
file "ops.inception.com.zone";
[root@node3 ~]# named-checkconf
[root@node3 ~]# cd /var/named
[root@node3 named]# vim ops.inception.com.zone #在子域DNS服务器中创建解析文件
$TTL 3600
$ORIGIN ops.inception.com.
@ IN SOA ns.ops.inception.com. admin.ops.inception.com. (
2015120501
2H
10M
7D
1D )
IN NS ns
IN MX 10 mail
ns IN A 192.168.30.13
mail IN A 192.168.30.15
www IN A 192.168.30.14
[root@node3 named]# named-checkzone ops.inception.com ops.inception.com.zone
zone ops.inception.com/IN: loaded serial 2015120501
OK
[root@node3 named]# chgrp named ops.inception.com.zone
[root@node3 named]# chmod 640 ops.inception.com.zone
[root@node3 named]# ll ops.inception.com.zone
-rw-r----- 1 root named 499 Dec 5 19:37 ops.inception.com.zone
[root@node3 named]# service named start
...
[root@node3 named]# netstat -tuanp | grep 'named'
tcp 0 0 192.168.30.13:53 0.0.0.0:* LISTEN 4402/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 4402/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 4402/named
tcp 0 0 ::1:953 :::* LISTEN 4402/named
udp 0 0 192.168.30.13:53 0.0.0.0:* 4402/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 4402/named
[root@node3 named]# iptables -F
[root@node3 named]# dig -t A www.ops.inception.com @192.168.30.13
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.ops.inception.com @192.168.30.13
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52791
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.ops.inception.com. IN A
;; ANSWER SECTION:
www.ops.inception.com. 3600 IN A 192.168.30.14
;; AUTHORITY SECTION:
ops.inception.com. 3600 IN NS ns.ops.inception.com.
;; ADDITIONAL SECTION:
ns.ops.inception.com. 3600 IN A 192.168.30.13
;; Query time: 1 msec
;; SERVER: 192.168.30.13#53(192.168.30.13)
;; WHEN: Sat Dec 5 20:09:49 2015
;; MSG SIZE rcvd: 88
[root@node3 named]# dig -t A www.inception.com @192.168.30.13 #无法通过子域DNS服务器查询到父域中的主机,除非父域的DNS服务器已在域名服务商注册
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.inception.com @192.168.30.13
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55017
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 7
;; QUESTION SECTION:
;www.inception.com. IN A
;; ANSWER SECTION:
www.inception.com. 423 IN A 72.52.4.121
...
[root@node3 named]# dig -t A www.ops.inception.com @192.168.30.20 #通过父域DNS服务器是可查询到子域中的主机的
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.ops.inception.com @192.168.30.20
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32208
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.ops.inception.com. IN A
;; ANSWER SECTION:
www.ops.inception.com. 3512 IN A 192.168.30.14
;; AUTHORITY SECTION:
ops.inception.com. 3512 IN NS ns.ops.inception.com.
;; ADDITIONAL SECTION:
ns.ops.inception.com. 3512 IN A 192.168.30.13
;; Query time: 18 msec
;; SERVER: 192.168.30.20#53(192.168.30.20)
;; WHEN: Sat Dec 5 20:11:13 2015
;; MSG SIZE rcvd: 88
九、配置转发器
转发所有的非本机负责的区域的请求至某指定的DNS服务器
options {
forward only|first;
#only表示完全转发,即使上游服务器(接受转发请求的DNS服务器)查询无结果,也接受
first表示先转发,若上游服务器查询无结果则自己再发起迭代查询
forwarders { IP; }; #转发至哪台服务器
[root@node3 ~]# vim /etc/named.conf
...
options {
...
recursion yes;
forward only;
forwarders { 192.168.30.20; };
...
};
...
[root@node3 ~]# named-checkconf
[root@node3 ~]# rndc reload
server reload successful
[root@node3 ~]# dig -t A www.inception.com @192.168.30.13 #配置转发器后,可通过子域DNS服务器查询到父域中的主机了
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.inception.com @192.168.30.13
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4123
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;www.inception.com. IN A
;; ANSWER SECTION:
www.inception.com. 3600 IN A 192.168.30.10
;; AUTHORITY SECTION:
inception.com. 3600 IN NS ns2.inception.com.
inception.com. 3600 IN NS ns.inception.com.
;; ADDITIONAL SECTION:
ns.inception.com. 3600 IN A 192.168.30.20
ns2.inception.com. 3600 IN A 192.168.30.30
;; Query time: 5 msec
;; SERVER: 192.168.30.13#53(192.168.30.13)
;; WHEN: Sun Dec 6 03:42:37 2015
;; MSG SIZE rcvd: 118
十、配置转发区域
上面的配置是转发所有的非本机负责的区域请求,我们也可只转发特定区域:
zone "hello.com" IN {
十一、bind view
bind的视图功能,又称脑裂(split-brain):
根据客户端来源的不同,将同一个名称解析至不同的值。
例如,一个企业有两台web主机,对应于一个FQDN,一台位于电信机房,一台位于联通机房,为了用户访问的便利,我们欲将电信用户的域名查询请求解析为电信那台主机的ip地址,将联通用户的请求解析为另一台主机的地址,bind的视图功能就可实现这种需求。
acl telecom {
...
};
acl unicom {
...
};
view VIEW_NAME {
match-clients { telecom; };
zone "hello.com" IN {
type master;
file "hello.com.tel";
};
};
view VIEW_NAME {
match-clients { unicom; };
zone "hello.com" IN {
type master;
file "hello.com.uni";
};
};
view VIEW_NAME {
...
};
■使用view注意的事项:
1、通常只为内网客户端提供递归功能,提供根区域等;
2、通常只为外网客户端提供本机所负责的区域的解析;
在以下的例子中,node2为DNS服务器,node4为一外网客户端,我们给node2新增一个接口用于连接外网。为测试方便,将node2的外网接口地址与node4的接口地址置于一个局域网VMnet2中,这样它们就可直接通信了
[root@node2 ~]# ifconfig eth1 150.16.100.5/16
[root@node2 ~]# vim /etc/named.rfc1912.zones
...
view internal { #定义视图
match-clients { 192.168.30.0/24; 127.0.0.1; }; #匹配本机以及内网所有客户端
recursion yes; #允许内网客户端递归
zone "." IN { #将主配置文件中的根区域定义剪切到此处
type hint;
file "named.ca";
};
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
...
zone "inception.com" IN {
type master;
file "inception.com.int";
allow-transfer { 192.168.30.30; 192.168.30.20; 127.0.0.1; };
allow-update { none; };
};
zone "30.168.192.in-addr.arpa" {
type master;
file "192.168.30.zone";
};
};
view external {
match-clients { any; }; #因客户端是按照从上到下的顺序匹配视图,故这里匹配的是非内网客户端
allow-recursion { none; }; #不给外网客户端递归
zone "inception.com" IN {
type master;
file "inception.com.ext";
};
};
[root@node2 ~]# named-checkconf
[root@node2 ~]# cd /var/named
[root@node2 named]# mv inception.com.zone inception.com.int
[root@node2 named]# vim inception.com.ext
$TTL 3600
@ IN SOA ns.inception.com. admin.inception.com. (
2015120206
2H
10M
7D
1D )
IN NS ns
ns IN A 150.16.100.5
www IN A 128.10.25.3
web IN CNAME www
[root@node2 named]# named-checkzone inception.com inception.com.ext
zone inception.com/IN: loaded serial 2015120206
OK
[root@node2 named]# chgrp named inception.com.ext
[root@node2 named]# chmod 640 inception.com.ext
[root@node2 named]# ll
...
-rw-r----- 1 root named 411 Dec 6 16:18 inception.com.ext
-rw-r----- 1 root named 639 Dec 5 13:11 inception.com.int
...
[root@node2 named]# service named restart #因增加了监听的地址,故要重启服务
Stopping named: . [ OK ]
Starting named: [ OK ]
[root@node2 named]# host -t A www.inception.com 192.168.30.20
Using domain server:
Name: 192.168.30.20
Address: 192.168.30.20#53
Aliases:
www.inception.com has address 192.168.30.10 #内网客户端查询到的结果