Bind view视图的使用

题记:本文先介绍bind view的使用相关

概念

首先我们看下什么是View?视图是在Bind中一个可以实现解析分离的特性,解析分离指的是:对于相同的记录,对于不同的客户端,可以回复其不同的结果,下面结合一个栗子聊聊解析分离?

一个小栗子

如果没有解析分离,内网用户去访问同属于一个安全区域的服务器时,根据解析到的公网IP去发起连接请求,首先和具备Tcp-proxy特性的FW(防火墙)建立TCP连接,之后FW会将客户端的请求转发到后端的server上,如果FW仅仅做了DNAT进行转发,在server回包的时候,不会经过FW,这样对于客户端便不会接受server的回包,因为server的回包的SIP是server的私网地址。而client是对FW outside ip也就是公网ip进行访问的。


这样子的话可以在FW上做双向的NAT转换,但是这样数据来回必须经过FW,在某些情况下就不适用了

这时还可以在DNS解析的时候下点文章

解决思路

使用BIND的VIEW视图去对内网和公网用户做DNS解析分离,即内网用户在DNS上拿到的是server的私网地址,公网用户拿到的是server的公网地址。这样内网用户就不用过FW就不会出现问题了

详见红茶三杯的sina blog

具体配置

模拟需求:物理机去bind server做www.zhxfei.com的A记录解析到的是100.0.0.1,bind server本身解析(可另开一台虚拟机模拟)到做www.zhxfei.com的A记录为192.168.232.144(即本身的地址)

主配置文件:

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
41
42
43
44
45
46
47
48
49
[root@localhost ~]# cat /etc/named.conf
acl localnet{
192.168.232.144/32;
127.0.0.0/8;
}; #localnet匹配的是bind server本身
options {
directory "/var/named"; # 指定bind主目录
};
view internal { #内网视图配置
match-clients { localnet; }; #匹配localnet的用户进入internal域解析
recursion yes; #允许递归
zone "." IN { #根域解析
type hint; #区域类型为提示域
file "named.ca"; #指定根域的解析文件,可用dig -t a .>/var/named/named.ca生成
};
zone "localhost" IN {
type master;
file "named.localhost";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
};
zone "zhxfei.com" IN {
type master;
file "zhxfei.com.localnet.zone"; #指定内网区域解析文件
allow-transfer { none; };
};
};
view external {
match-clients { any; }; #根据view视图从上到下匹配的原则表示没有匹配到localnet的所有用户匹配此视图
recursion no; #不允许递归
zone "zhxfei.com" IN {
type master; #指定bind对这个区域的解析角色
file "zhxfei.com.externnet.zone"; #指定外部区域解析文件
allow-transfer { none; }; #不允许区域传送
};
};

内网的区域解析文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# cat /var/named/zhxfei.com.localnet.zone
$TTL 600
$ORIGIN zhxfei.com.
@ IN SOA ns.zhxfei.com. admin.zhxfei.com. (
2016062001 #serail号
1H
10M
1W
1D )
IN NS ns
ns IN A 192.168.232.144
www IN A 192.168.232.144

外网的区域解析文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# cat /var/named/zhxfei.com.externnet.zone
$TTL 600
$ORIGIN zhxfei.com.
@ IN SOA ns.zhxfei.com. admin.zhxfei.com. (
2016062001
1H
10M
1W
1D )
IN NS ns
ns IN A 100.0.0.1
www IN A 100.0.0.1
结果验证

内网解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost ~]# dig -t a www.zhxfei.com @192.168.232.144
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6 <<>> -t a www.zhxfei.com @192.168.232.144
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64906
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;www.zhxfei.com. IN A
;; ANSWER SECTION:
www.zhxfei.com. 600 IN A 192.168.232.144
;; AUTHORITY SECTION:
zhxfei.com. 600 IN NS ns.zhxfei.com.
;; ADDITIONAL SECTION:
ns.zhxfei.com. 600 IN A 192.168.232.144
;; Query time: 4 msec
;; SERVER: 192.168.232.144#53(192.168.232.144)
;; WHEN: Mon Jun 20 04:12:34 2016
;; MSG SIZE rcvd: 81

外网解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C:\Users\admin>nslookup
DNS request timed out.
timeout was 2 seconds.
默认服务器: UnKnown
Address: 202.119.160.12
> server 192.168.232.144
DNS request timed out.
timeout was 2 seconds.
默认服务器: [192.168.232.144]
Address: 192.168.232.144
> www.zhxfei.com
服务器: [192.168.232.144]
Address: 192.168.232.144
名称: www.zhxfei.com
Address: 100.0.0.1

如上,PC解析到的是100.0.0.1,而虚拟机解析到的是192.168.232.144,即可

其他

bind的view视图在全局的DNS解析上也可以适用,即根据一份各个地理位置,各个线路,各个地址的地址列表来分配不同的A记录,但是当记录过多,区域文件过大,在bind 进程修改配置文件reload或者重启bind服务的时候会消耗大量的时间来载入内存中(reload的话可以通过RNDC控制reconfig减少时间的消耗)。我们可以通过bind-dlz和bind-sdb来将记录文件抽离到数据库中,可以让更改的记录实时生效,但是损失的是解析的时间,因为要产生大量的磁盘IO读写。有时间尝试下:利用Bind DLZ MySQL 构建智能DNS

坚持原创技术分享,您的支持将鼓励我继续创作!