正向,反向,主从,子域,转发器,安全控制。
介绍:
top level domain(tld) 顶级域
域的组织络式,我们也看到箭头是单向的,这也是域名解析的方式,在本地DNS服务器无法解析的情况下,本地DNS服务器会直接去找根域,再找顶级域,找到组织域再找到主机名。注册域名一般就是注册的组织域,现在也有那种net.co,这种不知道是怎么个情况。
递归 迭代:
现在我们先来看看左下角这个用户是如何解析到redhat.com下面的主机的。server是对应的dns服务器。用户向本地的DNS服务器,发送解析请求。本地的DNS服务器出去饶了一大圈最终返回给用户结果。
这种隐藏背后的操作,直接为用户返回结果就是对用户支持递归。
但是对于DNS服务器来说,它自己没有请求的答案,所以就直接去找根,而根告诉DNS服务器去找com.,服务器收到以后就再去找com.,com又告诉我们的DNS服务器再去找redhat.com,服务器再去找redhat.com,redhat.com这个DNS服务器上面有这个答案,所以直接返回给我们本地的DNS服务器。本地的DNS服务器再返回给用户最终答案。
上面DNS服务器一次又一次的重复去找同一个答案,这种过程就是迭代。
如果是redhat下面的主机想要解析google下面主机的主机名。redhat的DNS服务器没有答案也是会直接去找根,不会去找上级COM的,即使看起来这样更近。
因为要达到这样的效果太难了,本地的DNS服务器需要有每个负责com域服务器的IP地址,其它的同级域当然也要有了,而且那些服务器发生变化也还要同步更新。所以,结果就是我们的DNS服务器上面只有全球13个根的服务器地址。
正向解析与反向解析:
名称 --> IP:正向解析
IP --> 名称:反向解析
二者的名称空间,非为同一个空间,即非为同一棵树;因此,也不是同一个解析库;
反向的树有点这个姿势。
地址就是从上到下的IP地址块。不过这个在公网上没有物理存在的解析树,只是在公司组织内部有时候会使用。
正向解析是 倒置的域名树。
反向解析是 倒置的IP树。
很明显它们一点也不一样。所以在做DNS服务的时候要明白这是两个完全不同的东西,没有交集。
DNS服务器类型:
主DNS服务器
辅助DNS服务器
缓存名称服务器
只要是DNS服务器默认情况下都会把不是自己管辖的区域的解析记录,缓存下来。
而这种主要是用来给客户端做递归的DNS服务器就是缓存名称服务器。
一次完整的查询请求经过的流程:
Client --> hosts文件 --> DNS Local Cache --> DNS Server (recursion) -->
自己负责解析的域:直接查询数据库并返回答案;
不是自己负责解析的域:Server Cache --> iteration(迭代)
解析答案:
肯定答案:
否定答案:不存在查询的键,因此,不存在与其查询键对应的值;
权威答案:由直接负责的DNS服务器返回的答案;
非权威答案:
主-辅DNS服务器:
主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操作均可进行;
从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操作;
“复制”操作的实施方式:
序列号:serial, 也即是数据库的版本号;主服务器数据库内容发生变化时,其版本号递增;
刷新时间间隔:refresh, 从服务器每多久到主服务器检查序列号更新状况;
重试时间间隔:retry, 从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;
过期时长:expire,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;并且自己也停止提供服务;
否定答案的缓存时长:
主服务器可以”通知“从服务器随时更新数据;
区域传送:区域数据文件
全量传送:axfr, 传送整个数据库;一般刚建立完成DNS的时候。
增量传送:ixfr, 仅传送变化的数据;
区域数据库文件:
资源记录:Resource Record, 简称rr;
记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX
资源记录类型,用于资源的功能。
SOA: Start Of Authority, 起始授权 区域管理者,一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;
NS: Name Server 域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主的;
MX: Mail eXchange: 邮件交换器, 优先级:0-99,数字越小优先级越高;
A: Address : (FQDN-->IP) 地址记录,FQDN --> IPv4;
PTR: PoiTeR, IP --> FQDN 反向地址记录,IP --> FQDN
AAAA: Address FQDN --> IPv6 地址记录,FQDN --> IPv6
CNAME: Canonical Name, 别名记录
资源记录的定义格式:
语法: name [TTL] IN RR_TYPE value
资源记录的格式:
name [ttl] IN RRtype Value
name: 需要解析的名称
ttl : 客户端缓存可以保留的时间。
IN : 关键字
RRtype: 记录类型
Value :所解析名称得值
SOA :
name 只能是区域名称 可以用@来表示区域。
value 区域名称(也可以用主dns的FQDN), 管理员邮箱 , 附加信息。 ; 分号代表注释。
@ 600 IN SOA ds.star.com. dd.star.com. (
serial number ;序列号,用来表示记录是否有变动,十位以内的十进制数字
refresh time ;刷新时间,多久到服务器检查一次数据。
retry time ;重试时间, 刷新失败后,再尝试时间。
expire time ;过期时间, 辅助DNS将停止工作。
negative answer ttl ;否定答案的ttl,客户端缓存否定答案的时间。
)
上面中括号里的数据可以写在同一行。用空格分隔。
dd.star.com 就是 [email protected]. 因为文件中@有特殊意义。
SOA 必须是区域数据库文件的第一条记录。
刷新时间单位 秒。 也可以用 M 分 H 小时, D 天
SOA中定义的序列号只要是增长,主服务器就会触发通知机制,序列号减少不会触发。
NS : 代表DNS服务器,一个区域可以有多个。
name 区域名称, 可以用@表示。
value dns服务器的FQDN.
@ 600 IN NS dns.star.com.
@ 600 IN NS ns 不写全自动补上区域名称。
A : 如果有多个相同主机名的A记录,就会轮询着给客户端地址。
name: FQDN
value: IP
MX: 代表这个区域里的smtp服务器,一个区域可以有多个 指定优先级。
用来标识区域里的邮件服务器的。要不然这也不知道发给谁啊 [email protected]
name:区域名称
value: 包含优先级和FQDN.
优先级: 0-99 ,数字越小,级别越高。此优先级不是轮询用是,是用来备份的。
@ 600 IN MX 10 mail
这个域的邮件服务器是mail,要有相对应的A记录。
CNAME:
name : FQDN 别名
value: FQDN 真实的名
ftp 600 IN CNAME www
ftp 的正式名称是www, www 的别名是ftp
PTR : IP-->FQDN, 反向查找,在正向区域物理文件中虽然也可以写PTR记录,但最好还是把它们分开的好。 可以有多条记录。
name: IP 反向IP地址。
value: FQDN
区域名称为: 网络地址反向.in-addr.arpa.
注意主机名的 . 和相对名称 、绝对名称。相对名称就是会自动会在主机名后加上区域名称的。绝对名称一定要以.点结尾。 要不然会再加上区域名称。
一个区域只能有一个主DNS服务器。
注意:
(1) TTL可以从全局继承; $TTL 3600
(2) @表示当前区域的名称;
(3) 相邻的两条记录其name相同时,后面的name可省略;
(4) 对于正向区域来说,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录;
环境:
bind:BIND 9.9.4-RedHat-9.9.4-18.el7 (Extended Support Version)
系统:CentOS Linux release 7.1.1503 (Core)
各主机:
172.16.40.10 | 主DNS服务器 |
172.16.40.11 | 从DNS |
172.16.40.12 | 子DNS |
172.16.249.218 | 测试机 |
注意事项:时间同步。
安装:
BIND:Berkeley Internet Name Domain 伯克利创建,现由ISC.ORG维护。
isc(www.isc.org) dhcp软件也是由isc来维护。
直接yum安装即可,而且也省去了自己创建一些所必须的区域文件。
我们这里就只安装bind包了,其它的如chroot功能包这里就不介绍了。
[root@localhost ~]# yum install bind -y
Package bind.x86_64 32:9.9.4-18.el7 will be installed
[root@localhost ~]# rpm -ql bind
.....
/etc/named
/etc/named.conf
/etc/named.rfc1912.zones
/etc/named.root.key #在CentOS6上面如果不能转发,可以把这个注释试试。
/etc/rndc.conf #用于rndc与bind通信
/etc/rndc.key #用于rndc与bind通信
/usr/sbin/named-checkconf #用来检查bind的配置文件。
/usr/sbin/named-checkzone #用来检查区域数据文件
/usr/sbin/rndc
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback
/var/named/slaves
主配置文件:
/etc/named.conf
包含进来的其它文件:
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
解析库文件:
/var/named/目录下;
一般名字为:ZONE_NAME.zone
rndc: Remote Name Domain Controller 远程名称域管理。953/tcp,默认监听于127.0.0.1地址,因此仅允许本地使用;为了安全着想一般也不用设置。
看到生成了几个named开头的文件,这些都是所必须的区域数据文件。
(1) 一台DNS服务器可同时为多个区域提供解析;
(2) 必须要有根区域解析库文件: named.ca;
(3) 还应该有两个区域解析库文件:localhost和127.0.0.1的正反向解析库;
正向:named.localhost
反向:named.loopback
rpm安装的会自己带,就是上面的那几个named.*文件,如果是编译安装就要自己写了。
bind程序安装完成之后,默认即可做缓存名称服务器使用;如果没有专门负责解析的区域,直接即可启动服务;
CentOS 6: service named start
CentOS 7: systemctl start named.service
配置:
options {
全局选项;
};
zone "ZONE name" {
区域数据文件;
logging {
定义日志系统;
如:
options {
directory "/var/named";
zone "." IN {
type hint;
file "named.ca";
zone "star.com." IN {
type master;
file "star.com.zone";
type包括:
hint 根提示
master 主区域
slave 辅助区域
forward 转发区域
注意每行后面的分号。
options {
listen-on port 53 { 127.0.0.1; }; #默认监听127,要改为监听的网卡
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的安全扩展认证机制,如果出现问题可以禁用试试。
dnssec-validation yes; #
dnssec-lookaside auto; #
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones"; #包含的配置文件,里面有很多区域的定义。
include "/etc/named.root.key"; #在centos6上面如果不能转发,可以注释掉试试。
我这里的配置
/etc/named.conf 全局配置,其它部分没有改。
options {
listen-on port 53 { 172.16.40.10; };
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; };
我们先来启动下看看。
[root@localhost ~]# ss -unl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 172.16.40.10:53 *:*
UNCONN 0 0 *:123 *:*
UNCONN 0 0 127.0.0.1:323 *:*
UNCONN 0 0 ::1:53 :::*
[root@localhost ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 10 172.16.40.10:53 *:*
tcp/udp的53号端口。
172.16.249.218测试:
[root@localhost ~]# dig -t A www.baidu.com @172.16.40.10
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t A www.baidu.com @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50339
;; 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 61.135.169.121
www.a.shifen.com. 300 IN A 61.135.169.125
;; AUTHORITY SECTION:
a.shifen.com. 1198 IN NS ns4.a.shifen.com.
a.shifen.com. 1198 IN NS ns1.a.shifen.com.
a.shifen.com. 1198 IN NS ns2.a.shifen.com.
a.shifen.com. 1198 IN NS ns3.a.shifen.com.
a.shifen.com. 1198 IN NS ns5.a.shifen.com.
;; ADDITIONAL SECTION:
ns2.a.shifen.com. 1198 IN A 180.149.133.241
ns3.a.shifen.com. 1198 IN A 61.135.162.215
ns5.a.shifen.com. 1198 IN A 119.75.222.17
ns1.a.shifen.com. 1198 IN A 61.135.165.224
ns4.a.shifen.com. 1198 IN A 115.239.210.176
;; Query time: 3253 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan 9 17:00:12 2016
;; MSG SIZE rcvd: 260
工具介绍:
dig命令:
dig [-t RR_TYPE] name [@SERVER] [query options]
用于测试dns系统,因此其不会查询hosts文件;
查询选项:
+[no]trace:跟踪解析过程;
+[no]recurse:进行递归解析;
反向解析测试
dig -x IP
模拟完全区域传送:
dig -t axfr DOMAIN [@server]
host命令:
host [-t RR_TYPE] name SERVER_IP
nslookup命令:
nslookup [-options] [name] [server]
交互式模式:
nslookup>
server IP:以指定的IP为DNS服务器进行查询;
set q=RR_TYPE:要查询的资源记录类型;
name:要查询的名称;
nslookup在windows上也有。
配置一个正向解析区域:
1、定义区域
在主配置文件中或主配置文件辅助配置文件中实现;
zone "ZONE_NAME" IN {
type {master|slave|hint|forward};
file "ZONE_NAME.zone";
};
注意:区域名字ZONE_NAME即为域名;
我这里是在named.rfc1912.zones文件中添加的,也可以在named.conf文件中添加。
注意分号。
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "star.com" IN {
type master;
file "star.com.zone";
};
文件的位置是相对于主配置文件中的directory而言的。
检测一下配置文件有没有错误:
[root@localhost named]# named-checkconf
没有消息就是最好的消息。
2、 建立区域数据文件(主要记录为A或AAAA记录),在/var/named目录下建立区域数据文件;
[root@localhost ~]# cd /var/named
[root@localhost named]# ls
data dynamic named.ca named.empty named.localhost named.loopback slaves
[root@localhost named]# vim star.com.zone
$TTL 3600
@ IN SOA ns nsadmin.star.com. (
2016011001
30M
10M
1D
1H )
IN NS ns
ns IN A 172.16.40.10
www IN A 172.16.40.101
@ IN MX 10 mail
mail IN A 172.16.40.102
pps IN CNAME www
pop3 IN CNAME mail
检查一下区域数据文件:
[root@localhost named]# named-checkzone star.com star.com.zone
zone star.com/IN: loaded serial 2016011001
OK
[root@localhost named]#
提示加载了一个区域,并且序列号为2016011001,只要这个数字增长就会通知所有从服务器来拿数据。
我们现在只有主服务器。
重读一下置配:
[root@localhost named]# rndc reload
server reload successful
[root@localhost named]
这里也可以用systemctl reload named来重载配置文件。
不过在数据文件很多的时候用这个可能会卡住的。在最后会介结下rndc的常用使用。
[root@localhost ~]# dig -t MX star.com @172.16.40.10
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t MX star.com @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40815
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; QUESTION SECTION:
;star.com. IN MX
;; ANSWER SECTION:
star.com. 3600 IN MX 10 mail.star.com.
;; AUTHORITY SECTION:
star.com. 3600 IN NS ns.star.com.
;; ADDITIONAL SECTION:
mail.star.com. 3600 IN A 172.16.40.102
ns.star.com. 3600 IN A 172.16.40.10
;; Query time: 12 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan 9 17:01:50 2016
;; MSG SIZE rcvd: 96
[root@localhost ~]# dig -t axfr star.com @172.16.40.10
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr star.com @172.16.40.10
;; global options: +cmd
star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
star.com. 3600 IN MX 10 mail.star.com.
star.com. 3600 IN NS ns.star.com.
mail.star.com. 3600 IN A 172.16.40.102
ns.star.com. 3600 IN A 172.16.40.10
pop3.star.com. 3600 IN CNAME mail.star.com.
pps.star.com. 3600 IN CNAME www.star.com.
www.star.com. 3600 IN A 172.16.40.101
star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
;; Query time: 27 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan 9 17:05:19 2016
;; XFR size: 9 records (messages 1, bytes 233)
模拟区域传送,这里可以用来看看star.com区域里面有哪些条目,看来我们刚才写的全部都生效了。
这里忽略了一个问题,看一下区域数据文件的权限:
[root@localhost named]# ll
total 20
drwxrwx---. 2 named named 22 Jan 10 11:44 data
drwxrwx---. 2 named named 58 Jan 10 14:44 dynamic
-rw-r-----. 1 root named 2076 Jan 28 2013 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 6 Mar 6 2015 slaves
-rw-r--r--. 1 root root 212 Jan 10 14:11 star.com.zone
现在的权限是其它人可读的。来修改下。
[root@localhost named]# chown :named star.com.zone
[root@localhost named]# chmod o= star.com.zone
[root@localhost named]# ll star.com.zone
-rw-r-----. 1 root named 212 Jan 10 14:11 star.com.zone
[root@localhost named]#
配置一个反向解析区域:
我们先在配置文件中添加区域:
[root@localhost named]# vim /etc/named.rfc1912.zones
zone "16.172.in-addr.arpa" IN {
type master;
file "172.16.zone";
};
上面的区域名称也可以写成40.16.172.in-addr.arpa。
我这里只是为了说明在数据文件中的地址的写法。
[root@localhost named]# named-checkconf
没有错误。
对区域添加对应的区域数据文件:
[root@localhost named]# vim 172.16.zone
$TTL 3600
@ IN SOA @ nsadmin.star.com. (
2016011001
30M
10M
1D
1H )
IN NS ns.star.com.
10.40 IN PTR ns.star.com.
10.101 IN PTR www.star.com.
102.40 IN PTR mai.star.com.
102.40 IN PTR pop3.star.com.
我这里的第10行的name部分写错了,正常应该是101.40。就是反着写ip地址。做到下边才发现,我实验的主机改了下。这里就不改了。
检测一下:
[root@localhost named]# named-checkzone 16.172.in-addr.arpa 172.16.zone
zone 16.172.in-addr.arpa/IN: loaded serial 2016011001
OK
[root@localhost named]#
[root@localhost named]# rndc reload
server reload successful
[root@localhost named]#
172.16.249.128再来看看:
[root@localhost ~]# dig -x 172.16.40.10 @172.16.40.10
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -x 172.16.40.10 @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46366
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;10.40.16.172.in-addr.arpa. IN PTR
;; ANSWER SECTION:
10.40.16.172.in-addr.arpa. 3600 IN PTR ns.star.com.
;; AUTHORITY SECTION:
16.172.in-addr.arpa. 3600 IN NS ns.star.com.
;; ADDITIONAL SECTION:
ns.star.com. 3600 IN A 172.16.40.10
;; Query time: 1 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan 9 17:47:19 2016
;; MSG SIZE rcvd: 98
[root@localhost ~]# dig -x 172.16.40.102 @172.16.40.10
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -x 172.16.40.102 @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23950
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;102.40.16.172.in-addr.arpa. IN PTR
;; ANSWER SECTION:
102.40.16.172.in-addr.arpa. 3600 IN PTR mai.star.com.
102.40.16.172.in-addr.arpa. 3600 IN PTR pop3.star.com.
;; AUTHORITY SECTION:
16.172.in-addr.arpa. 3600 IN NS ns.star.com.
;; ADDITIONAL SECTION:
ns.star.com. 3600 IN A 172.16.40.10
主从配置:
区域传送:主从复制:
主服务器是时刻敞开的,只有用权限来控制。如果没有权限控制,任何人都可以来复制。
所以: 从服务设置区域类型为slave,从服务器做的就是去主服务器复制这个数据。别的不管。
服务器就会给它数据。
而父服务器上设置的从服务器的NS和A记录只是为了在区域文件序列号增加以后通知从服务器来获取数据。
从服务器是用的随机端口向服务器的53号端口开启传送的。从服务器扮演的是客户端。
辅助DNS服务器从主DNS服务器或其它辅助DNS服务器处请求传输数据的过程。
辅助DNS服务器上面不用建立任务数据库文件,会从主DNS上面同步。
完全区域传送: 传送区域的所有数据, AXFR , 一般刚建立完成DNS的时候。
增量区域传送: 传送区域中改变的数据部分, IXFR.
主的bind版本可能低于从的,从的不能低于主的。因为从的要兼容于主的。主的版本高会有新的功能,而从的没有。从的去同步数据,可能就会出现问题。对于系统的版本没有太大的要求,是软件层面的同步。
从服务器设置:
[root@localhost ~]# yum install bind -y
options {
listen-on port 53 { 172.16.40.11; };
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; };
配置文件中添加区域:
[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "star.com" IN {
type slave;
file "slaves/star.com.zone";
masters { 172.16.40.10; };
};
说明:
这里的类型为 slave。 文件放在slaves目录下是因为这个目录的的权限是named用户可写的,bind的工作用户。masters 可以在大括号中写多个,以分号分隔。
[root@localhost named]# ll
total 16
drwxrwx---. 2 named named 6 Mar 6 2015 data
drwxrwx---. 2 named named 6 Mar 6 2015 dynamic
-rw-r-----. 1 root named 2076 Jan 28 2013 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 6 Mar 6 2015 slaves
看最下面的一行,目录的属主组都是named。
从服务器不需要创建数据文件,它会去主服务器复制数据文件,然后再自动创建对应的数据文件。
我们要做的就是为它指定要在哪里创建这个文件。 它的工作用户是named,必须对目录有写入的权限才能创建文件。
启动从服务器
[root@localhost named]# systemctl start named
172.16.40.10:主服务器
[root@localhost named]# tail -30 /var/log/messages
.....
Jan 10 16:10:15 localhost named[3224]: client 172.16.40.11#42701 (star.com): transfer of 'star.com/IN': AXFR started
Jan 10 16:10:15 localhost named[3224]: client 172.16.40.11#42701 (star.com): transfer of 'star.com/IN': AXFR ended
可以看到172.16.40.11以随机端口42701来请求star.com区域的数据。
172.16.40.11: 从服务器
[root@localhost named]# tail -20 /var/log/messages
Jan 10 16:10:15 localhost named[3257]: zone star.com/IN: transferred serial 2016011001
Jan 10 16:10:15 localhost named[3257]: transfer of 'star.com/IN' from 172.16.40.10#53: Transfer completed: 1 messages, 9 records, 233 bytes, 0.021 secs (11095 bytes/sec)
..... #从172.16.40.10:53传送过来9条记录,还有数据大小。
[root@localhost named]# ll slaves
total 4
-rw-r--r--. 1 named named 423 Jan 10 16:10 star.com.zone
[root@localhost named]#
数据文件确实有了,在centos7上面的这个bind版本 这个文件是以二进制格式存放的。我们只能用dig命令来看看有没有数据了。
[root@localhost ~]# dig -t axfr star.com @172.16.40.11
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr star.com @172.16.40.11
;; global options: +cmd
star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
star.com. 3600 IN NS ns.star.com.
star.com. 3600 IN MX 10 mail.star.com.
mail.star.com. 3600 IN A 172.16.40.102
ns.star.com. 3600 IN A 172.16.40.10
pop3.star.com. 3600 IN CNAME mail.star.com.
pps.star.com. 3600 IN CNAME www.star.com.
www.star.com. 3600 IN A 172.16.40.101
star.com. 3600 IN SOA ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
;; Query time: 4 msec
;; SERVER: 172.16.40.11#53(172.16.40.11)
;; WHEN: Sat Jan 9 18:38:47 2016
;; XFR size: 9 records (messages 1, bytes 233)
别的测试就不贴了,太占篇幅了。
这个dig -t axfr就是用来测试区域传送的,也就是复制数据。因为现在还没有安全控制,所以在哪也可以使用,到后面加上安全控制以后,可以用这个命令来测试某主机有没有复制的权限。
我这再把反向的也加上:
这里我把上面添加的也贴出来了。刚添加的是下面那个。
zone "star.com" IN {
type slave;
file "slaves/star.com.zone";
masters { 172.16.40.10; };
};
zone "16.172.in-addr.arpa" IN {
type slave;
file "slaves/172.16.zone";
masters { 172.16.40.10; };
};
看下日志:
[root@localhost named]# tail -20 /var/log/messages
.....
Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: Transfer started.
Jan 10 16:44:46 localhost named[3257]: transfer of '16.172.in-addr.arpa/IN' from 172.16.40.10#53: connected using 172.16.40.11#51642
Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: transferred serial 2016011001
Jan 10 16:44:46 localhost named[3257]: transfer of '16.172.in-addr.arpa/IN' from 172.16.40.10#53: Transfer completed: 1 messages, 7 records, 225 bytes, 0.006 secs (37500 bytes/sec)
Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: sending notifies (serial 2016011001)
[root@localhost ~]# dig -t axfr 16.172.in-addr.arpa @172.16.40.11
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr 16.172.in-addr.arpa @172.16.40.11
;; global options: +cmd
16.172.in-addr.arpa. 3600 IN SOA 16.172.in-addr.arpa. nsadmin.star.com. 2016011001 1800 600 86400 3600
16.172.in-addr.arpa. 3600 IN NS ns.star.com.
10.40.16.172.in-addr.arpa. 3600 IN PTR ns.star.com.
101.40.16.172.in-addr.arpa. 3600 IN PTR www.star.com.
102.40.16.172.in-addr.arpa. 3600 IN PTR mai.star.com.
102.40.16.172.in-addr.arpa. 3600 IN PTR pop3.star.com.
16.172.in-addr.arpa. 3600 IN SOA 16.172.in-addr.arpa. nsadmin.star.com. 2016011001 1800 600 86400 3600
;; Query time: 4 msec
;; SERVER: 172.16.40.11#53(172.16.40.11)
;; WHEN: Sat Jan 9 19:08:02 2016
;; XFR size: 7 records (messages 1, bytes 225)
好了,还有一个问题。现在这种情况下,从服务器只有到时间以后才会去主服务器获取数据。
如果想要让主服务器通知从服务器,就要在主服务器的区域数据文件中加上从服务器的NS记录。
突然想到一点,在这里加上,如果我们这是公网的域名,并且想要在公网上使用。就要把主从两台服务器都在com服务器上授权才能使用。不然com服务器不知道有这个人,请求也就到不了这里。
172.16.40.10: 加从服务器NS记录。注意修改序列号。
star.com区域。两条记录: 1、从服务器ns记录,2、对应的A记录。
ftp记录是我刚才测试的时候加上的。这里不用关注它。
16.172.in-addr.arpa加一条记录,从服务器的NS记录。
rndc reload 一下。主服务器会把这次修改通知给从服务器。 这就可以了。
子域配置:
注意:子区域服务器要在运行状态,才可以检测通过区域数据文件。 namd-checkzone
提示没有A记录。因为测试结果是由子域来返回的。
父域的区域数据文件中添加:有多个子域就要分别在文件中写上这些设置。
1, 授权的子区域名称
2, 子区域的名称服务器
3, 子区域的名称服务器IP地址。
在相对应的区域数据文件中加上子区域的记录 如我这里要在star.com域中加上sst的子域:
1, 子区域名称 sst
2, 子区域的名称服务器 ns.sst.star.com.
3, 子区域的名称服务器 IP 地址, 加上A记录。
看一下我这里的star.com.zone的内容。为了容易理解,NS记录部分用的是绝对名称。
$TTL 3600
@ IN SOA ns nsadmin.star.com. (
2016011006
30M
10M
1D
1H )
star.com. IN NS ns.star.com.
star.com. IN NS ns1.star.com.
sst.star.com. IN NS ns.sst.star.com.
ns.sst.star.com. IN A 172.16.40.12
.....#下面的没有变化
主服务器这边可以了,子服务器是完全独立的一台服务器,可以说它不知道有父服务器的存在。
看我们最上面的图就可以知道,是从上到下的,下边的不会向上走,只会找到根向下走。
而父服务器做的上面的两项只是标出子域,再来这种请求会去找子服务器。 而在父服务器不支持递归的情况下,会返回给客户端子域的地址。
序更号忘了改了,改一下,把配置通知给从服务器。
172.16.40.12:子服务器
主配置:
options {
listen-on port 53 { 172.16.40.12; };
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; };
添加区域:
zone "sst.star.com" IN {
type master;
file "sst.star.com";
};
区域数据文件:
[root@localhost named]# vim sst.star.com
$TTL 3600
@ IN SOA ns.sst.star.com. nsadmin.sst.star.com. (
2016011001
30M
10M
1D
1H )
IN NS ns.sst.star.com.
ns IN A 172.16.40.12
www IN A 172.16.40.121
@ IN MX 10 mail
mail IN A 172.16.40.120
pop IN CNAME mail
ftp IN A 172.16.40.12
注意这里的区域名称是: sst.star.com. 相对名称会在名称之后自动加上这个。
[root@localhost named]# named-checkconf
[root@localhost named]# named-checkzone sst.star.com sst.star.com
zone sst.star.com/IN: loaded serial 2016011001
OK
[root@localhost named]#
172.16.249.218:
成功了,发往父服务器来查找子域的查询,父服务器递归去找子服务器。然后返回给我们结果。
而如果,把父服务器的递归功能给关闭。再看一下会返回什么结果。
172.16.40.10主配置文件:
recursion no;
把这一项给改成no。rndc reload 。我这里在172.16.249.218上再看看。
现在这种状态就跟外网的根和顶级域在返回给本地DNS服务器的答案一样,只返回下级域的地址。
再来看下从服务器会不会找到子域:
没问题,从服务器的主配置文件中,递归是打开的。
转发器:
现在我们可以从父服务器找到子服务器了,但是从子服务器是找不到父服务器的。
默认情况下,在DNS上面没有的区域是会直接找根的。
服务器都是由我们所控制,也没必要再让子服务器去找根,再找com,再找到star.com了。
找到外网去了,这种域名肯定有人注册啊。所以我们要让子服务器找父服务器去。
还有一种情况,我们只有二台DNS服务器可以上网,可以解析外网的域名。但是现在又加了几台DNS,因为各种原因这几台DNS不能上网,那么如何才能解析外网的域名呢。可以让那二台可以解析外网域名的服务器为我们解析。
定义转发:
注意:被转发的服务器必须允许为当前服务做递归;
(1) 区域转发:仅转发对某特定区域的解析请求;
zone "ZONE_NAME" IN {
type forward;
forward {first|only};
forwarders { SERVER_IP; };
};
(2) 全局转发:没有在本地定义的区域,通通转发;
options {
... ...
forward only|first;
forwarders { SERVER_IP; };
.. ...
only 是只转发给目标主机,目标主机不能解析也不会再转发给根。
first 转发给目标主机,如果目标主机不能解析就再转发给根。
所转发的服务器, 要充许递归才行。 这样服务器才能为你递归找到结果并返回。
172.16.40.12: 子服务器。在/etc/named.rfc1912.zones文件中添加一个转发区域。
zone "star.com" IN {
type forward;
forward only;
forwarders { 172.16.40.10;172.16.40.11; };
};
rndc reload 就可以了。现在直接再查询可能会出现两种地址,一个是转到父服务器得到的地址,还有是刚才查询结果的缓存。可以在40.12服务器上执行 rndc flush。 来清空缓存。
172.16.:249.218:
这种区域转发,只能转发单独的区域。 全局的域可以转发本地不存在的所有区域,来解决我们上面的第2种情况。
加这两项就可以了。
全局性的总配置优先级低于各个区域,所以总转发只会转发不存在的区域。
安全控制:
acl:访问控制列表;把一个或多个地址归并一个命名的集合,随后通过此名称即可对此集合内的所有主机实现统一调用;
ACL必须要定义后才能使用, 通常放在named.conf文件中最上方(不要在options内)。值如果有空格要用括号引起来。
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所属的网络;
访问控制指令,有些可以在zone中单独使用。
allow-query {}; 允许查询的主机;白名单;不指定则默认允许所有。
allow-transfer {}; 允许向哪些主机做区域传送;默认为向所有主机;应该配置仅允许从服务器;
allow-recursion {}; 允许哪此主机向当前DNS服务器发起递归查询请求;
定义递归白名单。测试只能在options中使用。要把recursion yes; 注释掉。
allow-update {}; DDNS,允许动态更新区域数据库文件中内容;允许动态更新区域数据库文件中内容。为了安全,最好是none。这个跟区域传送没有关系。
recursion yes; 给任何人递归。即然这里明确指定为yes。那么默认应该是会不给递归才对,而且上课也说是默认不给递归。但刚才测试的却是给递归,不知道喽。
定义几个控制项:
上面定义的只有172.16.40.11也就是从服务器可以区域传送。
在172.16.249.218上面:
[root@localhost mnt]# dig -t axfr star.com @172.16.40.10
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.5 <<>> -t axfr star.com @172.16.40.10
;; global options: +cmd
; Transfer failed.
[root@localhost mnt]#
直接失败了。递归经测经也是生效的。用法也就这种方式。现在这里只是修改的主服务器,从服务器也要修改。
最后再补充一点:
泛域名解析
* IN A 172.16.0.1
*星号代表如果没有所要查询的记录,就以这个结果为准。不用放到最后。不过感觉还是放到最后为好。
域是一个逻辑的概念。而区域是域的两种解析方式(正向解析区域,反向解析区域),就是我们上面所说的两种不同的树。我们日常所说的域名只是正向解析区域的,根当然也是了。
最高级的域(最外面的方框)包含这两种区域(里面的两个长方形),而子域(里面的实体长方形)又也这两个区域的里面,然后子域又有两个区域(黑色长方形),依此类推。
区域可以说是物理存在的,在我们这里它是文件,提供了各种解析记录。
这里挺乱的,而且我个人理解可能也是错的,所以暂时也不要管它了。只要知道我们是由物理存在的区域数据文件来提供解析的。
rndc 子命令
status | 统计数据 |
reload | 重读配置文件和区域文件 |
reload ZONE | 指定重读的区域 |
retransfer ZONE | 手动区域完全传送,不用管区域数据文件序列号是多少 |
notify ZONE | 手动向外发送区域的同步通知 |
reconfig | |
stats | 把服务器的统计数据写入statisics 文件中。 |
querylog | 关闭或开启查询日志,每条查询都会记录日志,会产生大量I/O,正常情况下不要开启,调试的时候再开启。 |
stop | 关闭named进程。 |
flush | 清空服务器端的缓存。有时候很有用。 |
flushname NAME | 只清除指定的缓存。 |
trace [LEVEL] | 开启调试模式,可以指定级别。多次开启就是增加级别。详细记录日志信息。同样的会产生大量I/O操作。 |
debug | 是有级别的, 调试级别。 |
notrace | 等同于 trace 0 |