首页 > 代码库 > BIND简易教程(2):BIND视图配置

BIND简易教程(2):BIND视图配置

目录:
BIND简易教程(1):安装及基本配置
BIND简易教程(2):BIND视图配置(本篇)
BIND简易教程(3):DNSSec配置

 

上文书说到,我们把aaa.apple.tree解析到192.168.4.100。那么世界上任何一个人在请求aaa.apple.tree的时候,解析到的都是这个IP地址,之后,再访问这个域名(当然这个IP地址只是实验的,而且我域名也没注册,除了我内网之外,世界上任何一个人都访问不到)。那么问题来了,两个人一个在电信,一个在联通,都想访问这个域名的话,我的服务器要放在哪个运营商更好呢?毕竟,“世界上最遥远的距离,不是你在我面前我却不认识你,而是你在电信,我在联通”。那么可不可以这样,我现在提供两台服务器,一台放在电信,一台放在联通,然后,让电信的用户查询 aaa.apple.tree的时候,解析到电信的服务器上去,联通的用户查询aaa.apple.tree的时候,解析到联通的服务器上去?答案是,可以的。这就是我今天要讲的BIND的高级功能:视图查询。

配置视图,主要需要三个步骤:

  1. 收集IP地址的集合。例如我现在有3个IP地址的集合,让每个集合能访问到不同的地址,即,某个集合中的一个ip在查询的时候,提供一个解析结果,另一个集合中的另一个ip查询的时候,提供另一个结果;
  2. 给每个IP集合提供一个视图。这个视图中要写清楚是哪个集合,能请求到哪个域。
  3. 给每个视图的每个域提供一个解析文件。

下面,我们假设192.168.4.x这个网段是电信的,192.168.1.x这个网段是联通的,对比配置一下视图。
先写IP集合:
电信地址集合:dianxin.acl

acl “dianxin” {    192.168.4.0/24;};

联通地址集合:liantong.acl

acl “liantong” {    192.168.1.0/24;};

 

再写视图:
电信视图:dianxin.view

include "/etc/bind/views/acls/dianxin.acl";view "dianxin" {    match-clients { "dianxin"; };    zone "apple.tree" IN {        type master;        file "/etc/bind/views/zones/dianxin.apple.tree.zone";    };};

联通视图:liantong.view

include "/etc/bind/views/acls/liantong.acl";view "liantong" {    match-clients { "liantong"; };    zone "apple.tree" IN {        type master;        file "/etc/bind/views/zones/liantong.apple.tree.zone";    };};

 

最后是对域的解析:

电信apple.tree域: dianxin.apple.tree.zone

$TTL 86400@   IN  SOA apple.tree. apple.apple.tree. (          2016090100     ; Serial               28800     ; Refresh                7200     ; Retry              604800     ; Expire               86400     ; Negative Cache TTL)@   IN  NS  apple.tree.@   IN  A   192.168.4.43aaa     IN      A       192.168.4.100bbb     IN      A       192.168.4.101ccc     IN      CNAME   bbb

联通apple.tree域: liantong.apple.tree.zone

$TTL 86400@   IN  SOA apple.tree. apple.apple.tree. (          2016090100     ; Serial               28800     ; Refresh                7200     ; Retry              604800     ; Expire               86400     ; Negative Cache TTL)@   IN  NS  apple.tree.@   IN  A   192.168.4.43aaa     IN      A       1.1.1.1bbb     IN      A       2.2.2.2ccc     IN      CNAME   bbb

 

OK。这样我们就配置了一套电信视图和一套联通视图(所谓一套就是“acl+view+zone”这三者解析)。
技术分享
如果你乐意,还可以配一套移动视图和一套移不动视图,大概就都是酱婶的。先测试一下吧(别忘了sudo rndc reload加载):
当我从电信的机器(192.168.4.43)查询时:

$ dig aaa.apple.tree @192.168.4.43; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> aaa.apple.tree @192.168.4.43;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57758;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;aaa.apple.tree. IN A;; ANSWER SECTION:aaa.apple.tree. 86400 IN A 192.168.4.100;; Query time: 4 msec;; SERVER: 192.168.4.43#53(192.168.4.43);; WHEN: Mon Jan 11 08:58:28 CST 2016;; MSG SIZE rcvd: 59

而当我从联通的机器(192.168.1.100)查询时:

$ dig aaa.apple.tree @192.168.4.43; <<>> DiG 9.9.5-3ubuntu0.5-Ubuntu <<>> aaa.apple.tree @192.168.4.43;; global options: +cmd;; Got answer:;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40018;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1;; WARNING: recursion requested but not available;; OPT PSEUDOSECTION:; EDNS: version: 0, flags:; udp: 4096;; QUESTION SECTION:;aaa.apple.tree. IN A;; ANSWER SECTION:aaa.apple.tree. 86400 IN A 1.1.1.1;; Query time: 3 msec;; SERVER: 192.168.4.43#53(192.168.4.43);; WHEN: Sun Sep 04 12:32:56 CST 2016;; MSG SIZE rcvd: 59

 

视图配置就是这样的。有个问题我一直没有介绍,那就是:我怎么知道哪些IP是电信的IP,哪些是联通的?如果你以前看过我的博客,那应该看过这篇《解析纯真IP地址库》。没错,写程序来获得每个运营商的IP集合。再开动一下脑筋,我们还能获得些什么呢?——除了运营商,我们还可以根据地域来划分IP,写出来各个省的视图。

技术分享
密集恐惧症患者的福音。我个人建议如果你真要配置全国各省甚至各市的视图,就不要手动写配置文件了,写个脚本生成吧。而且,一台机器的内存有可能撑不住,可能要考虑主从。
甚至,我们还可以用地域和运营商相结合。当然,这种不同维度结合的时候,需要有化解冲突的方式,比如,电信解析到P地址,而北京解析到Q地址。那么你让北京电信的用户怎么想?实际上,对于这种情况,BIND是这么处理的:首先,我们收集IP集合的时候,一个北京电信的IP就既在北京的IP集合中,又在电信的IP集合中,当客户端访问DNS服务器时,BIND首先对客户端IP进行匹配,找到这个IP属于某一个集合,就会去查询这个集合对应的视图。谁先谁后?那就要看两个acl在named.conf加载时候的先后顺序了。谁写在前面,谁先加载。BIND不认为这种冲突是错误。话说这本来也不是错误,北京电信的用户既属于北京,也属于电信,这没错啊!
视图配置大概就讲这些。

BIND简易教程(2):BIND视图配置