DNS服务(2)

DNS服务的搭建(Bind)

Posted by Jason Lee on 2021-01-11

DNS 服务简介

  • 接上篇 DNS服务(1) 简述了DNS的诞生和结构,本节来实际操作一遍,搭建一个DNS服务器。

DNS 服务单台服务器

DNS 服务器准备

  • CentOS7 ip 为 192.168.100.10
  • user 用户为root 用户。

安装Bind

  • 查看本机内bind 软件情况
1
2
3
4
5
6
7
8
[root@CentOS7 ~]# rpm -qa | grep ^bind
bind-libs-9.11.4-26.P2.el7_9.3.x86_64
bind-export-libs-9.11.4-16.P2.el7_8.6.x86_64
bind-license-9.11.4-26.P2.el7_9.3.noarch
bind-libs-lite-9.11.4-26.P2.el7_9.3.x86_64
bind-utils-9.11.4-26.P2.el7_9.3.x86_64
bind-9.11.4-26.P2.el7_9.3.x86_64
[root@CentOS7 ~]#
报名 作用
bind BIND主程序
bind-utils 客户端搜索主机名的相关命令
bind-libs BIND相关的库文件
bind-chroot 将BIND设定文件和程序限制在虚拟根目录下
  • 安装bind
1
yum -y install bind-utils bind bind-devel bind-libs

配置文件

文件目录 说明 详解
/etc/hosts 主机的一个文件列表 添加记录如:111.13.100.92
/etc/resolv.conf 转换程序配置文件 一般存放的是域名服务器的ip地址 记录如 nameserver xxx.xxx.xxx.xxx 一般不要指定超过3个服务器
/etc/named.conf BIND主文件 设置一般的name参数,指向该服务器使用的域数据库的信息源
/var/named/named.ca 根域名配置服务器指向文件 指向根域名配置服务器,用于告诉缓存服务器初始化
/var/named/localhost.zone localhost区正向域名解析文件 用于将本地IP地址(127.0.0.1)转换为本地回送IP地址(127.0.0.1)
/var/named/name.local localhost区反向域名解析文件 用于将localhost名字转换为本地回送IP地址(127.0.0.1)

配置主配置文件/etc/name.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

options {
listen-on port 53 { any; }; # 绑定在所有ipv4的网卡上
listen-on-v6 port 53 { ::1; }; # 绑定在所有ipv6的网卡上
directory "/var/named"; # bind 主目录
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt"; # statistics-file 统计文件
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; }; # 允许所有机器查询

# 是否允许迭代查询
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
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";

这面我们来挑选几个详细解释一下配置文件。

  • recursion 是否允许迭代查询 如果你配置的是一个权威服务器,则不能进行迭代查询,如果你配置的是个缓存DNS服务,那么你需要将迭代查询开启。

  • dnssec 相关配置
    DNSSEC通过为通过为DNS中的数据添加数字签名信息,使得客户端在得到应答消息后可以通过检查此签名信,使得客户端在得到应答消息后可以通过检查此签名信息来判断应答数据是否权威和真实,从而为 从而为DNS数据提供数据来源验证和数据完整性检验,可以防止针对 可以防止针对DNS的相关攻击,这里不做相关的介绍

  • include 这里是我们的配置区域文件 named.root.key 根DNS解析服务器

增加 配置区域文件

1
2
3
4
5
6
7
vim /etc/named.rfc1912.zones

zone "icefornze.com" IN { # 测试域名为 icefornze.com
type master; # DNS 服务器类型 master
file "icefornze.com.zone"; # 区域文件解析 该文件目录为 /var/named/
allow-update {none;};
};

在 /var/named/ 新建 icefornze.com.zone 文件增加记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$TTL 1D                                                             ;TTL 修改配置生效时间,默认为一天
@ IN SOA ns.icefornze.com. root.icefornze.com. (
20201221 ; serial,配置编号,每次改完配置 +1,这样从服务器就知道更新配置
1D ; refresh,从服务器刷新时间,默认一天刷新一次
1h ; retry,如果刷新失败,默认1小时重试一次
1W ; expire,缓存过期时间,一周
3H ; minimum
)

# 增加记录文件 NS 记录 以及A 记录 和www 记录
IN NS ns.icefornze.com.
ns IN A 192.168.100.10
IN A 192.168.100.10
www IN A 192.168.100.10

设置nameserver服务器

1
echo "nameserver 192.168.100.10" >> /etc/resolv.conf

检查配置文件

1
2
3
4
5
# 检查主配置
named-checkconf /etc/named.conf

# 检查 zone 配置
named-checkzone icefornze.com /var/named/icefornze.com.zone

启动服务

1
2
3
4
5
6
7
8
9
10
11
12
systemctl start named
systemctl enable named

查看是否启动

[root@CentOS7 ~]# netstat -tlunp | grep 53
tcp 0 0 192.168.100.10:53 0.0.0.0:* LISTEN 1927/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1927/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1927/named
tcp6 0 0 ::1:953 :::* LISTEN 1927/named
udp 0 0 192.168.100.10:53 0.0.0.0:* 1927/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 1927/named

实验成功与否

我们使用nslookup 验证一下,发现验证不过。

1
2
3
4
5
6
7
8
[root@CentOS7 named]# nslookup
> icefornze.com
;; Got SERVFAIL reply from 192.168.100.10, trying next server
;; Got SERVFAIL reply from 192.168.100.10, trying next server
Server: 119.29.29.29
Address: 119.29.29.29#53

** server can't find icefornze.com: NXDOMAIN

这是时候,我们要检查一下named解析文件的权限,我们发现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@CentOS7 named]# ls -alt
总用量 20
drwxrwx--T. 5 root named 153 1月 31 20:25 .
## 这里是问题, 我们的权限组设置是root。这个时候,我们需要将权限组整理成 named
-rw-r-----. 1 root root 224 1月 31 20:25 icefornze.com.zone
-rw-r-----. 1 root named 152 12月 15 2009 named.empty
-rw-r-----. 1 root named 168 12月 15 2009 named.loopback
-rw-r-----. 1 root named 152 6月 21 2007 named.localhost

[root@CentOS7 named]# chown -R root:named icefornze.com.zone
[root@CentOS7 named]# ls -alt
drwxrwx--T. 5 root named 153 1月 31 20:25 .
-rw-r-----. 1 root named 224 1月 31 20:25 icefornze.com.zone
drwxrwx---. 2 named named 60 1月 31 20:24 dynamic
drwxrwx---. 2 named named 127 1月 24 16:00 data
drwxr-xr-x. 20 root root 280 12月 20 20:58 ..
drwxrwx---. 2 named named 6 12月 16 00:32 slaves
-rw-r-----. 1 root named 2253 4月 5 2018 named.ca
-rw-r-----. 1 root named 152 12月 15 2009 named.empty
-rw-r-----. 1 root named 168 12月 15 2009 named.loopback
-rw-r-----. 1 root named 152 6月 21 2007 named.localhost

验证一下

Ping 一下

1
2
3
[root@CentOS7 named]# ping www.icefornze.com
PING www.icefornze.com (192.168.100.10) 56(84) bytes of data.
64 bytes from CentOS7 (192.168.100.10): icmp_seq=1 ttl=64 time=0.010 ms

DNS 主从服务器的搭建

  1. 主从 DNS 的搭建开始的时候其实是和单机搭建一样的,我们修改主服务器的配置文件:/etc/named.rfc1912.zones
    将我们之前的配置进行修改:
1
2
3
4
5
6
7
8
zone "icefornze.com" IN {           # 测试用的域是 icefornze.com
type master;
file "icefornze.com.zone"; # 配置文件为 icefornze.com.zone,该文件目录为 /var/named/ 下
allow-update { 192.168.100.113; };
allow-transfer { 192.168.100.113; }; # 允许同步DNS的辅助服务器IP
also-notify { 192.168.100.113; };
notify yes; # 启用变更通告,当主文件变更,通知从进行比较同步
};
  1. 从服务器也安装 bind 并将 /etc/named.conf 配置拷贝过来。接着也是配置:/etc/named.rfc1912.zones,此时就能体现主从的不同:
1
2
3
4
5
6
zone "icefornze.com" IN {
type slave;
file "slaves/icefornze.com.zone";
masters { 192.168.100.10; }; # 指定主服务器的 IP
masterfile-format text; # 指定区域文件的格式为text,不指定有可能会为乱码
};

我们不需要再去配置 icefornze.com.zone 文件,因为我们需要去主同步。所有直接启动从的 dns 服务。重启成功后我们会发现,在从服务器的 /var/named/slaves 目录下,icefornze.com.zone 已经同步成功。我们修改主服务器的 icefornze.com.zone,新加解析的同时,修改配置编号,让从能够探测到变化。
此时我们重启主服务器,会发现从服务器就能够同步成功。顺便值得一提的是,我这里使用 reload named 服务并没有使配置生效。

子域授权

什么是子域授权

举例(1),假设我们是域名为com下所管理的域,如果需要让我们xxx.icefornze.com解析交给我们的ns.icefornze.com来解析,就需要授权,并且将这个子域的解析授予ns.icefornze.com 这个服务器。

那么所有的有关xxx.icefornze.com 的询问请求都会被我们告知去询问ns.icefornze.com 服务器,并将 ns2.icefornze.com 的ip地址告诉请求客户端。

定义转发服务器

其他域名访问我们的域名流程

当用户查询DNS服务器,当DNS数据库有相应的记录时则会回应用户,如果没有,则DNS会直接区询问根域,然后根域会一级一级的询问相应的子域,直到帮用户查询到相应记录.

试想一下,如果我们的 ohter域名服务器 当请求 www.icefornzen.com 的时候知道直接去 icefornze.com 服务器下去询问呢,是不是就省去了1, 2,3,4 的步骤呢?

这就是DNS转发功能的实现,也就是说DNS没有对应记录时我们也可以让他把询问请求转发到我们指定的服务器上去查询。DNS转发功能的实现主要是方便优先共享DNS数据库资源,节省查询时间,而不必每次一级一级的递归去询问根,这样节省带宽流量的时间。如下图:

当转发功能开启之后,则必须满足:

  • 1)保证该非递归服务器不出现在客户机的 /etc/resolv.conf 的
  • 2)证该非递归服务器不被其他 name server 当成转发器 (forwarder)

定义转发服务器

如上图所示,我们开启一个 staging.iceforzen.com 的授权子域名,将www.staging.iceforzen.com的解析放到 192.168.100.12 这台机器上去。

  • 添加授权子域

在192.168.100.10 编辑入下记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vim /var/named/icefornze.com.zone
$TTL 1D
@ IN SOA icefornze.com. root.icefornze.com. (
20201221;
1D ;
1h ;
1W ;
3H ;
)


IN NS ns
ns IN A 192.168.100.10
www IN A 192.168.100.10
* IN A 192.168.100.10
# 子域记录
staging IN NS ns.staging
ns.staging IN A 192.168.100.11

重新reload 服务

1
rndc reload
  • 启动192.168.100.11 服务

启动过程入上述,编辑

1
2
3
4
5
6
7
8

vim /etc/named.rfc1912.zones

zone "staging.icefornze.com" IN { # 测试域名为 icefornze.com
type master; # DNS 服务器类型 master
file "staging.icefornze.com.zone"; # 区域文件解析 该文件目录为 /var/named/
allow-update {none;};
};

在 /var/named/ 新建 staging.icefornze.com.zone 文件增加记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$TTL 1D
@ IN SOA staging.icefornze.com. root.staging.icefornze.com. (
20201221;
1D ;
1h ;
1W ;
3H ;
)


IN NS ns
ns IN A 192.168.100.11
www IN A 192.168.100.11
* IN A 192.168.100.11

重启服务器

1
systemctl restart named
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@CentOS7 named]# dig -t -A www.staging.icefornze.com @192.168.100.10
;; Warning, ignoring invalid type -A

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> -t -A www.staging.icefornze.com @192.168.100.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35377
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.staging.icefornze.com. IN A

;; ANSWER SECTION:
www.staging.icefornze.com. 86400 IN A 192.168.100.11

;; AUTHORITY SECTION:
staging.icefornze.com. 86400 IN NS ns.staging.icefornze.com.

;; Query time: 293 msec
;; SERVER: 192.168.100.10#53(192.168.100.10)
;; WHEN: 日 1月 31 23:09:02 CST 2021
;; MSG SIZE rcvd: 87

[root@CentOS7 named]#

在 192.168.100.11 上查询自己的解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@CentOS7 named]# dig -t A www.staging.icefornze.com @192.168.100.11
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> -t A www.staging.icefornze.com @192.168.100.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24828
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.staging.icefornze.com. IN A

;; ANSWER SECTION:
www.staging.icefornze.com. 86400 IN A 192.168.100.11

;; AUTHORITY SECTION:
staging.icefornze.com. 86400 IN NS ns.staging.icefornze.com.

;; ADDITIONAL SECTION:
ns.staging.icefornze.com. 86400 IN A 192.168.100.11

;; Query time: 0 msec
;; SERVER: 192.168.100.11#53(192.168.100.11)
;; WHEN: 日 1月 31 23:09:59 CST 2021
;; MSG SIZE rcvd: 103
  • 子域上查询父域的域名
    如果我们在192.168.100.11 上去查询 www.icefornze.com 域名,则192.168.100.11 则会走递归查询到根服务器,由于我们的服务器没有得到com的授权,因此没有办法查询到。我们来实验一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@CentOS7 named]# dig -t A www.icefornze.com @192.168.100.11

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> -t A www.icefornze.com @192.168.100.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 37028
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.icefornze.com. IN A

;; AUTHORITY SECTION:
com. 247 IN SOA a.gtld-servers.net. nstld.verisign-grs.com. 1612105249 1800 900 604800 86400

;; Query time: 0 msec
;; SERVER: 192.168.100.11#53(192.168.100.11)
;; WHEN: 日 1月 31 23:12:13 CST 2021
;; MSG SIZE rcvd: 119

[root@CentOS7 named]#

通过上述,我们看到要去查询com. 这个。 现在我们要通过配置让此命令可以查询到父域负责的解析的域名。

  • 全局配置

编辑192.1638.100.11上的 /etc/named.conf 加上

1
2
3
4
options {
forward first;
forwarders {192.168.100.10;};
}
  • ①foward only 子DNS服务器指父DNS服务器请求DNS解析。
  • ②foward first 子DNS服务器优先指向父DNS服务器,

我们在来测试是否可以在11上dig 通www.icefornze.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@CentOS7 named]# rndc reload
server reload successful
[root@CentOS7 named]# dig -t A www.icefornze.com @192.168.100.11
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.3 <<>> -t A www.icefornze.com @192.168.100.11
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25350
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.icefornze.com. IN A

;; ANSWER SECTION:
www.icefornze.com. 86400 IN A 192.168.100.10

;; AUTHORITY SECTION:
icefornze.com. 86400 IN NS ns.icefornze.com.

;; ADDITIONAL SECTION:
ns.icefornze.com. 86400 IN A 192.168.100.10

;; Query time: 1 msec
;; SERVER: 192.168.100.11#53(192.168.100.11)
;; WHEN: 日 1月 31 23:18:51 CST 2021
;; MSG SIZE rcvd: 95
  • 定向配置

当然我们还可以不用全局配置,可以特定的zone当中去配置,编辑 192.168.100.11 上的 /etc/named.rfc1912.zones

1
2
3
4
5
6
7

zone "icefornze.com." {
type forward;
forwarders { 192.168.100.10;};
};

systemcl restart named

将我们的nameserver 指向自己

1
2
3
vim /etc/resolve.conf

nameserver 192.168.100.11

ping 一下www.icefornze.com

1
2
3
4
[root@CentOS7 named]# ping www.icefornze.com
PING www.icefornze.com (192.168.100.10) 56(84) bytes of data.
64 bytes from 192.168.100.10 (192.168.100.10): icmp_seq=1 ttl=64 time=0.353 ms
64 bytes from 192.168.100.10 (192.168.100.10): icmp_seq=2 ttl=64 time=0.681 ms

可以成功

智能DNS

Bind 关键配置

在names.conf 中有许多配置,这里列出个表格供大家参考

配置名称 功 能
acl 定义一个访问控制列表,用于以后对列表中的IP进行访问控制
controls 定义有关本地域名服务器操作的控制通道,这些通道被rndc用来发送控制命令
include 把另一个文件中的内容包含进来做为主配置文件的内容
key 定义一个密匙信息,用于通过TSIG进行授权和认证的配置中
logging 设置日志服务器,以及日志信息的发送位置
options 设置DNS服务器的全局配置选项
server 定义了与远程服务器交互的规则
trusted-keys 定义信任的 DNSSED密匙
view 定义一个视图
zone 定义一个区域

options

options语句设定可以被整个BIND使用的全局选项。这个语句在每个配置文件中只有一处,如果出现多个options语句,则第一个options的配置有效,并且会产生一个警告信息。如果没有options语句,每个子语句使用默认值

ACL

acl主配置语句用于定义一个命名的访问列表,里面包含了一些用IP表示的主机,这个访问列表可以在其他语句使用,表示其所定义的主机。其格式如下:

1
2
3
acl acl-name {   
address_match_list
};

address_match_list表示IP地址或IP地址集。其中,none、any、localhost和localnets这4个内定的关键字有特别含义,分别表示没有主机、任何主机、本地网络接口IP和本地子网IP。一个具体的例子如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
acl "someips" {                 //定义一个名为someips的ACL  
10.0.0.1; 192.168.23.1; 192.168.23.15; //包含3个单个IP
};

acl "complex" { //定义一个名为complex的ACL
"someips"; //可以包含其他ACL
10.0.15.0/24; //包含10.0.15.0子网中的所有IP
!10.0.16.1/24; //非10.0.16.1子网的IP
{10.0.17.1;10.0.18.2;}; //包含了一个IP组
localhost; //本地网络接口IP(含实际接口IP和127.0.0.1)
};

zone "example.com" {
type slave;
file "slave.example.com";
allow-notify {"complex";}; //在此处使用了前面定义的complex访问列表
};

Zone

下面是Zone 配合选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
zone zone_name [class] [
{
type ( master | slave | hint | stub | forward ) ;
[ allow-notify { address_match_list } ; ]
[ allow-query { address_match_list } ; ]
[ allow-transfer { address_match_list } ; ]
[ allow-update { address_match_list } ; ]
[ update-policy { update_policy_rule [...] } ; ]
[ allow-update-forwarding { address_match_list } ; ]
[ alsonotify
{ ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ check-names (warn|fail|ignore) ; ]
[ dialup dialup_option ; ]
[ file string ; ]
[ forward (only|first) ; ]
[ forwarders
{ ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ ixfr-base string ; ]
[ ixfr-tmp-file string ; ]
[ maintain-ixfr-base yes_or_no ; ]
[ masters [port ip_port] { ip_addr [port ip_port] [key key]; [...] } ; ]
[ max-ixfr-log-size number ; ]
[ max-transfer-idle-in number ; ]
[ max-transfer-idle-out number ; ]
[ max-transfer-time-in number ; ]
[ max-transfer-time-out number ; ]
[ notify yes_or_no | explicit ; ]
[ pubkey number number number string ; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ zone-statistics yes_or_no ; ]
[ sig-validity-interval number ; ]
[ database string ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
}];

zone语句定义了DNS服务器所管理的区,也就是哪一些域的域名是授权给该DNS服务器回答的。一共有5种类型的区,由其type子语句指定,具体名称和功能如下所示。

  • Master(主域):主域用来保存某个区域(如www.wzvtc.cn)的数据信息。
  • Slave(辅域):也叫次级域,数据来自主域,起备份作用。
  • Stub:Stub区与辅域相似,但它只复制主域的NS记录,而不是整个区数据。它不是标准DNS的功能,只是BIND提供的功能。
  • Forward(转发):转发域中一般配置了 forward和forwarders子句,用于把对该域的查询请求转由其他DNS服务器处理。
  • Hint:Hint域定义了一套最新的根DNS服务器地址,如果没有定义,DNS服务器会使用内建的根DNS服务器地址。
    配置实例:
1
2
3
4
5
6
7
8
9
10
zone "." IN {           //定义一个名为"."的区,查询类为IN  
type hint; //类型为hint
file "named.root"; //区文件是named.root
};

zone "1.10.10.in-addr.arpa" IN { //定义一个名为1.10.10.in-addr.arpa的区,查询类为IN
type master; //类型为master
file "named.1.10.10"; //区文件是named.1.10.10
allow-update { none; }; //不允许任何客户端对数据进行更新
};

Bind View

我们需要知道什么是DNS VIEW??

DNS view简单的理解就是实现不同网段发出不同的请求却得出不同的DNS解析结果,有效的分流网络流量,减少服务器的压力,提高访问控制能力。在我国大家都知道,电信和网通之间访问速度是很慢的,但是像百度、sina这种大网站,不管我们怎么访问速度都是很快的,那么他们是采用什么样的技术呢??

采用CDN(内容分发网络)技术实现的。在这次我们只讨论CND底层采用的DNS view技术。

view语句定义了视图功能。视图是BIND 9提供的强大的新功能,允许DNS服务器根据客户端的不同有区别地回答DNS查询,每个视图定义了一个被特定客户端子集见到的DNS名称空间。这个功能在一台主机上运行多个形式上独立的DNS服务器时特别有用。

视图(view)语句的定义:

1
2
3
4
5
6
7
8
view view_name [class] {
match-clients { address_match_list } ;
match-destinations { address_match_list } ;
match-recursive-only { yes_or_no } ;
[ view_option; ...]
zone-statistics yes_or_no ; ]
[ zone_statement; ...]
};

视图是BIND9强大的新功能,允许名称服务器根据询问者的不同有区别的回答DNS查询。特别是当运行拆分DNS设置而不需要运行多个服务器时特别有用。每个视图定义了一个将会在用户的子集中见到的DNS名称空间。

配置实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
view "internal" {
match-clients { 10.0.0.0/8; };
// 应该与内部网络匹配.
// 只对内部用户提供递归服务.
// 提供example.com zone 的完全视图
//包括内部主机地址.
recursion yes;
zone "example.com" {
type master;
file "example-internal.db";
};
};
view "external" {
match-clients { any; };
// 拒绝对外部用户提供递归服务
// 提供一个example.com zone 的受限视图
// 只包括公共可接入主机
recursion no;
zone "example.com" {
type master;
file "example-external.db";
};
};

智能DNS

对于ACL、VIEW、ZONE的应用,DNS服务器有一个高级的功能,能够实现不同的用户访问同一个域名,把域名解析成不同的IP地址,使用户能够访问离他最近的服务器上的数据,这就是DNS服务器的视图功能。

使用DNS服务器的视图功能可以增加网站的响应速度。例如,当我们网站的数据同步在两台web服务器上时,一台是电信服务器,一台是网通服务器,那么我们肯定希望全国访问我们网站的用户在打开网站的时候,能够自动实现,电信用户访问电信服务器,网通用户访问网通服务器。

配置这种情况的前提是,web服务器必须要有一个电信的IP地址和一个网通的IP地址。DNS服务器的这种解析功能通常也被称之为智能解析。

DNS服务器的视图通常在配置文件中是使用view实现的。把要使用某些IP地址作单独访问的zone区域,统一放在一个命名的view段落中,并且在view中定义请求的IP地址或IP地址段,把IP地址写入match-clients选项中。如果像上面说的,区分电信和网通路线的话,那么可以使用两个acl访问控制列表写上电信或网通IP地址,定义电信网通路线,把acl名字写入view段落match-clients选项中。如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
acl telecomip{ tele_IP; ... };
acl netcomip{ net_IP; ... };
view telecom {
match-clients { telecomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.telecom";
};
};
view netcom {
match-clients { netcomip; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.netcom";
};
};
view default {
match-clients { any; };
zone "ZONE_NAME" IN {
type master;
file "ZONE_NAME.netcom";
};
};

需要注意的是:

  • (1)、如果使用了视图的功能,那么配置文件中的所有zone区域都要必须写在视图里面,如,配置文件里默认要配置的三个区域,根、127.0.0.1、1.0.0.127.in-addr.arpa都要写入视图。
  • (2)、在acl中定义IP地址,IP地址的写法可以是单个IP地址也可以是一个IP地址段加掩码,如:192.168.0.0/24。
  • (3)、视图是根据配置文件从上往下匹配的,所以希望优先访问的资源记录文件,区域应该尽量写前面。
  • (4)、如果定义的若干个视图的IP地址不全的话,那么可以在最后定义一个默认视图,match-clients选项中的IP地址写上any,代表如果此次访问的IP地址上面没有一个能匹配到,则在此处归类。

参考



支付宝打赏 微信打赏

赞赏一下