BIND简易教程:BIND视图配置

Posted 小苹果的苹果树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BIND简易教程: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.43
aaa     IN      A       192.168.4.100
bbb     IN      A       192.168.4.101
ccc     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.43
aaa     IN      A       1.1.1.1
bbb     IN      A       2.2.2.2
ccc     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简易教程:BIND视图配置的主要内容,如果未能解决你的问题,请参考以下文章

BIND简易教程:安装及基本配置

BIND简易教程:在Ubuntu下源码安装BIND(其实跟前面的教程没太大关系)

httpd Server not started: (13)Permission denied: make_sock: could not bind to address [::]:8888(代码片段

DNS&BIND——DNS的ACL和视图

redis学习

关于在 ROS2 教程中使用 std::bind 的问题