首页 > 学技术 > 技术网文 > DNS服务器 > 正文

[精华] [設定心得] Bind9 View 底下的 master/slave 設定方案


来源 chinaunix.net 酷勤网整理

新版本可從如下獲得:
http://www.study-area.org/tips/bind9_view.htm


[設定心得] Bind9 View 底下的 master/slave 設定方案
---------------------------------------
作者:netman(netman@study-area.org)
版本:v0.01
日期:2004-04-20

* 版本歷程:
1) 2004-04-20 v0.01
 - 初版

---------------------------------------


一、前言

bind-9 自問世以來,深受廣大 dns 管理員歡迎(年紀越大越如此... ^_^),
是由於 bind9 提供了許多功能,解決了長期以來深受困擾的 dns 管理難題。

可是在新功能出現後,也帶來了一些前所不曾預料的新問題,
其中之一,就是 view 設定下的 master/slave 的同步問題。


二、問題分析

由於 master 端利用 view 的分界,按照不同的查詢來源位址回應不同的答案。
這對一般的 query 工作是非常有效的。

倘若 master 與 slave 的對外與對內界面均能相互指定路由(這是前提),
那只要在 slave 端不同的 view 內指定 master 的不同 IP ,也能夠順利完成 zone
transfer 。

但問題在於,當 slave 端在進行 SOA 查詢及作 XFER 時,
若 master 端只看到 client 端的某一特定來源位址,因而只能回應單一的 view ,
那就不能順利完成其他 view 的 zone transfer 。


三、解決方案

我們可利用 bind9 的 transfer-source 功能,在 slave 端指定其用來作 zone transfer
的 source address ,
得以讓 master 回應正確的 answer 。

其關鍵點是 slave 需設定多個 IP (可分內外或用 IP Alias),且都能讓 master 路由得到
就行。


四、假設情景

- 假設授權 domain 為 my.domain 。

- 假設 master 的界面分配如下:
 - External: eth0 1.2.3.4
 - Internal: eth1 10.1.2.3

- 假設 slave 的界面分配如下:
 - Primary: eth0 10.1.2.4
 - Alias: eth0:0 10.1.2.5


五、設定細節:

- master
修改 /etc/named.conf ,內容類似如下:
acl "lan" { 10.1.2.0/24;  };


options { directory { "/var/named"; }; };

view "internal" {
 match-clients { !10.1.2.5; lan; };  // 這裡排除 slave 的另一位址
 zone "." IN {
  type hint;
  file "named.root";
 };
 zone "my.domain" IN {
  type master;
  file "my.domain.int";
  allow-transfer { 10.1.2.4; }; //允許 slave 的 primay 位址
 };
};

view "external" {
 match-clients { any; };
 recursion no;
 zone "." IN {
  type hint;
  file "named.root";
 };
 zone "my.domain" IN {
  type master;
  file "my.domain.ext";
  allow-transfer { 10.1.2.5; }; //允許 slave 的 alias 位址
 };
};



- slave
修改 /etc/named.conf ,內容類似如下:
acl "lan" { 10.1.2.0/24;  };


options { directory { "/var/named"; }; };

view "internal" {
 match-clients { lan; };
 zone "." IN {
  type hint;
  file "named.root";
 };
 zone "my.domain" IN {
  type slaver;
  file "slave.my.domain.int";
  masters { 10.1.2.3; };
  transfer-source 10.1.2.4; // 指定 primay 位址
 };
};
view "external" {
 match-clients { any; };
 recursion no;
 zone "." IN {
  type hint;
  file "named.root";
 };
 zone "my.domain" IN {
  type master;
  file "slave.my.domain.ext";
  masters { 10.1.2.3; };
  transfer-source 10.1.2.5; // 指定 alias 位址
 };
};




六、測試:

當設定完成後,只需重新啟動 master/slave 雙方的 bind 服務程式即可。


七、結語:

Bind9 的功能很多是新概念,本文希望對有志探索 bind 這一神奇系統的同好有所幫助,且
起拋磚引玉之用。


八、參考資料:

- O'Reilly, Linux Server Hacks: 100 Industrial-Strength Tips & Tools

---------------本文結束 -----------------------


-- 

======= http://www.study-area.org =======
飛雪迎春到﹐風雨送春歸
已是寒崖百丈冰﹐尤有花枝俏
俏也不爭春﹐只把春來報
待得山花爛漫時﹐他在叢中笑﹗

[ 本帖最后由 網中人 于 2006-5-16 18:40 编辑 ]



 阿骁 回复于:2004-04-20 17:54:52

好文!简洁,易懂!

学到新东西啦! 多谢网中人斑竹呀!^_^

强烈要求给精华!!!!


 阿骁 回复于:2004-04-22 22:53:04

强烈要求放入精华区!!! 我顶


 chieh 回复于:2004-04-23 14:29:01

好!!!!!!!!!!!!!!!!!!!!!!!!!!
强烈要求放入精华区!!! 我顶


 红雨 回复于:2006-05-09 22:10:16

allow-transfer 和 transfer-source 能否放在 view 这一层级?如果zone很多,每一个都要写,似乎很冗余!


 網中人 回复于:2006-05-09 23:11:21

引用:原帖由 红雨 于 2006-5-9 22:10 发表
allow-transfer 和 transfer-source 能否放在 view 这一层级?如果zone很多,每一个都要写,似乎很冗余! 


又不是每天改. 設一次就好了...
還是, 你有更好的方法呢?


 ailms 回复于:2006-05-09 23:23:16

我觉得主从服务器都应该配置两个 ip 比较合适

主从服务器的一对ip各组成一个 view ,同时再用  :

query-source address(从) + transfer-source (从)+ allow-notify (从)

notify-source (主)+allow-transfer (主)

来严格限定从服务器要获取那个 view 的那个 zone data file

这样虽然配置的语句较多,但对应关系会清楚一点

[ 本帖最后由 ailms 于 2006-5-9 23:27 编辑 ]


 r2007 回复于:2006-05-10 08:34:17

引用:原帖由 ailms 于 2006-5-9 23:23 发表
我觉得主从服务器都应该配置两个 ip 比较合适

主从服务器的一对ip各组成一个 view ,同时再用  :

query-source address(从) + transfer-source (从)+ allow-notify (从)

notify-source (主)+al ... 


如果有多个view岂不是太浪费ip地址了。:mrgreen:


 ailms 回复于:2006-05-10 13:14:25

引用:原帖由 r2007 于 2006-5-10 08:34 发表

如果有多个view岂不是太浪费ip地址了。:mrgreen: 



完全可以把 transfer-source 和 NS 记录中的 name server 在不同的ip段

只要用 also-notify + notify explict 就可以了.

无需占用实际应用的 ip


 r2007 回复于:2006-05-10 13:35:49

引用:原帖由 ailms 于 2006-5-10 13:14 发表


完全可以把 transfer-source 和 NS 记录中的 name server 在不同的ip段

只要用 also-notify + notify explict 就可以了.

无需占用实际应用的 ip 


master和slave哥俩在一个物理网段里还好办,中间有路由就麻烦了。


 ailms 回复于:2006-05-10 16:18:35

为什么呢?

直接加个静态路由不可以吗?


 cbbn_net 回复于:2006-05-16 14:33:22

最近也关注view,楼主的方法适用于初建slave文件,但是slave文件建立后,master更新,做notify时候,楼主的方法就不行了,对于master只有一个IP,这个IP在slave中只能匹配一个view,这样就无法更新slave中其他的view对应的文件了,从网上查相关资料,基本都是最多两个view,对于这种,网上的解决方法是对master和slave的每个view都单独设置一个IP,但是要是存在多个view呢?如果采用这种方式,不仅需要n多IP,而且配置起来也很麻烦。我也没有找到在多view下做IXFR的好方法。目前,我只有把多个dns都做成master,之间用同步软件来实现配置的同步。如果大家有更好的方法,推荐一下。


 網中人 回复于:2006-05-16 14:38:46

引用:原帖由 cbbn_net 于 2006-5-16 14:33 发表
最近也关注view,楼主的方法适用于初建slave文件,但是slave文件建立后,master更新,做notify时候,楼主的方法就不行了,对于master只有一个IP,这个IP在slave中只能匹配一个view,这样就无法更新slave中其他的v ... 



恩? 我的假設條件, 已經說明了是多個 IP 的. 請問為何你會導向 master 只有一個 IP 的結論呢?
引用:
- 假設 master 的界面分配如下:
- External: eth0 1.2.3.4
- Internal: eth1 10.1.2.3

- 假設 slave 的界面分配如下:
- Primary: eth0 10.1.2.4
- Alias: eth0:0 10.1.2.5



而且, 我更不解: 為何初始化可以, 而後面的 update 不行?
你能提出具體的參考資料嗎?

[ 本帖最后由 網中人 于 2006-5-16 14:40 编辑 ]


 ailms 回复于:2006-05-16 14:48:47

hoho,其实还有一种更方便的方法,可以不受 ip 的限制,就是使用 TSIG 

因为一个主机可以定义多个 key ,这个 key 可以成为区分不同 view 的关键

具体方法可以看 ISC BIND FAQ


 cbbn_net 回复于:2006-05-16 14:54:13

楼主假设的master和slave是在相同的物理位置,并且有一个网口使用同一个段的地址。如果master和slave不在相同的物理位置,它们之间的通信需要路由的情况又会如何呢?


 網中人 回复于:2006-05-16 15:04:56

位置不同沒關係, 只要 IP 不同就行.
你可用 IP alias 設不同的 IP , 然後彼此的 routing 解決就行(我想你的問題是 routing).
要不, 用 ailms 兄建議的方案也行.
而從問題的解決層面來看, 你用 rsync 也不失為一個方法.
同步 zone db, 其實 zone transfer 只是眾多方法的一種...


 cbbn_net 回复于:2006-05-16 15:14:39

不同物理位置的master和slave做IXFR时,都要明确指定IP,如果是多个view的情况,真是就头大了。使用第三方工具的方法固然很多,但是期望bind有这方面的解决方案。


 網中人 回复于:2006-05-16 15:39:59

恩? bind 的 FAQ 不是有提到了嗎? 
也就是 ailms 兄提到的 TSIG .
何不先看看, 了解一下, 嘗試一下, 然後才下定論不遲...


 xxjoyjn 回复于:2006-05-16 16:38:24

好东西,没有用过,
 路过,收下,:D


 cbbn_net 回复于:2006-05-28 10:11:59

引用:原帖由 ailms 于 2006-5-16 14:48 发表
hoho,其实还有一种更方便的方法,可以不受 ip 的限制,就是使用 TSIG 

因为一个主机可以定义多个 key ,这个 key 可以成为区分不同 view 的关键

具体方法可以看 ISC BIND FAQ 



我使用了TSIG,但是在多view中,还是只识别了一个,不知道是不是我设置的问题,不知道ailms或者其他朋友能否贴一个基于TSIG的view的例子上来学习一下。


 ailms 回复于:2006-05-28 10:18:24

要使用 TSIG 的方法来建立 view ,要注意符合 ver >= 9.3 的前提条件,否则 match-clients 语句不起作用

下面是 isc 的 faq 中的例子 :



BIND 9.3 and later: Use TSIG to select the appropriate view. (这样主从服务器只需要1个地址就可以了)

Master 10.0.1.1:
key "external" {
algorithm hmac-md5;
secret "xxxxxxxx";
};
view "internal" {
match-clients { !key external; 10.0.1/24; };
...
};
view "external" {
match-clients { key external; any; };
server 10.0.1.2 { keys external; };
recursion no;
...
};

Slave 10.0.1.2:
key "external" {
algorithm hmac-md5;
secret "xxxxxxxx";
};
view "internal" {
match-clients { !key external; 10.0.1/24; };
...
};
view "external" {
match-clients { key external; any; };
server 10.0.1.1 { keys external; };
recursion no;
...
};




 cbbn_net 回复于:2006-05-28 12:14:55

用的bind-9.3.2  ,根据faq做了如下修改:


Master 10.0.1.1:

        view "internal" {
         key "internal" {
                algorithm hmac-md5;
                secret "xxxxxxxx";
         };
                match-clients { key internal; 10.0.1/24; };
                server 10.0.1.2 { keys internal; };
                ...
         zone "qwq.qwq" {
                type master;
                file "master/q/internal.qwq.qwq.zone";
                allow-update { none; };
                allow-transfer { key internal; };
         };                
        };
        view "external" {
         key "external" {
                algorithm hmac-md5;
                secret "xxxxxxxx";
         };        
                match-clients { key external; any; };
                server 10.0.1.2 { keys external; };
                recursion no;
                ...
        zone "qwq.qwq" {
                type master;
                file "master/q/external.qwq.qwq.zone";
                allow-update { none; };
                allow-transfer { key external; };
        };                
        };

Slave 10.0.1.2:

        view "internal" {
         key "internal" {
                algorithm hmac-md5;
                secret "xxxxxxxx";
         };        
                match-clients { key internal; 10.0.1/24; };
                server 10.0.1.1 { keys internal; };
                ...
        zone "qwq.qwq" {
                type slave;
                masters { 10.0.1.1; };
                file "slave/q/internal.qwq.qwq.zone";
        };                
        };
        view "external" {
         key "external" {
                algorithm hmac-md5;
                secret "xxxxxxxx";
         };        
                match-clients { key external; any; };
                server 10.0.1.1 { keys external; };
                recursion no;
                ...
        zone "qwq.qwq" {
                type slave;
                masters { 10.0.1.1; };
                file "slave/q/external.qwq.qwq.zone";
        };                
        };
        
        
删除slave的zone文件,做named restart,让slave从master获取数据创建zone文件,master提示:
client 10.0.1.2#55027: view internal: request has invalid signature: TSIG external: tsig verify failure (BADKEY)
client 10.0.1.2#50078: view internal: transfer of 'qwq.qwq/IN': AXFR started: TSIG internal
client 10.0.1.2#50078: view internal: transfer of 'qwq.qwq/IN': AXFR ended         

slave日志提示
zone qwq.qwq/IN/internal: Transfer started.
transfer of 'qwq.qwq/IN' from 10.0.1.1#53: connected using 10.0.1.2#50078
zone qwq.qwq/IN/external: refresh: failure trying master 10.0.1.1#53 (source 0.0.0.0#0): tsig indicates error
zone qwq.qwq/IN/internal: transferred serial 2006052608: TSIG 'internal'
transfer of 'qwq.qwq/IN' from 10.0.1.1#53: end of transfer
        
修改qwq.qwq的serial后,从master作rndc reload后,master日志提示
client 10.0.1.2#48850: view internal: request has invalid signature: TSIG external: tsig verify failure (BADKEY)
client 10.0.1.2#48334: view internal: transfer of 'qwq.qwq/IN': AXFR-style IXFR started: TSIG internal
client 10.0.1.2#48334: view internal: transfer of 'qwq.qwq/IN': AXFR-style IXFR ended   

slave日志提示
client 10.0.1.1#32770: view internal: received notify for zone 'qwq.qwq': TSIG 'internal'
zone qwq.qwq/IN/internal: Transfer started.
client 10.0.1.1#32770: view external: received notify for zone 'qwq.qwq': TSIG 'external'
transfer of 'qwq.qwq/IN' from 10.0.1.1#53: connected using 10.0.1.2#48334
zone qwq.qwq/IN/internal: transferred serial 2006052607: TSIG 'internal'
transfer of 'qwq.qwq/IN' from 10.0.1.1#53: end of transfer
zone qwq.qwq/IN/external: refresh: retry limit for master 10.0.1.1#53 exceeded (source 0.0.0.0#0)
zone qwq.qwq/IN/external: Transfer started.
transfer of 'qwq.qwq/IN' from 10.0.1.1#53: connected using 10.0.1.2#43642
transfer of 'qwq.qwq/IN' from 10.0.1.1#53: failed while receiving responses: NOTAUTH
transfer of 'qwq.qwq/IN' from 10.0.1.1#53: end of transfer    

查看文件,只有internal对应的zone文件更新了,请帮忙分析一下原因。

[ 本帖最后由 cbbn_net 于 2006-5-28 18:10 编辑 ]


 ailms 回复于:2006-05-28 20:09:20

1、检查 slave 的 external view 的配置,尤其是 server 语句分配的 key 是否正确?

2、在主服务器上执行 rndc reload qwq.awq in external 看是否成功?

3、如果不成功,用 ethereal 抓一个过程下来并贴图。

4、
zone qwq.qwq/IN/external: refresh: retry limit for master 10.0.1.1#53 exceeded (source 0.0.0.0#0)”


     是什么回事?

[ 本帖最后由 ailms 于 2006-5-28 20:15 编辑 ]


 cbbn_net 回复于:2006-06-08 11:50:08

1、key分配的没有问题,master和slave都是粘贴过去的。
2、运行reload后,提示  rndc: 'reload' failed: dynamic zone
3、根据日志  client 10.0.1.2#55027: view internal: request has invalid signature: TSIG external: tsig verify failure (BADKEY)
好像优先用的IP做的匹配,没有用tsig


 ailms 回复于:2006-06-08 13:16:50

引用:原帖由 cbbn_net 于 2006-6-8 11:50 发表
1、key分配的没有问题,master和slave都是粘贴过去的。
2、运行reload后,提示  rndc: 'reload' failed: dynamic zone
3、根据日志  client 10.0.1.2#55027: view internal: request has invalid signature: TS ... 



这是 isc 的 BIND FAQ 中的一个问题,lz 看了就知道怎么回事了


Q:  Why don't my zones reload when I do an "rndc reload" or SIGHUP? 
 
A: A zone can be updated either by editing zone files and reloading the server or by dynamic update, but not both. If you have enabled dynamic update for a zone using the "allow-update" option, you are not supposed to edit the zone file by hand, and the server will not attempt to reload it. 
 


检查一下你的外部 zone 的 allow-update {} 是否为 none ,

如果不是,则 rndc reload 是不起作用的。


 cbbn_net 回复于:2006-06-08 15:19:30

allow-update {} 都是设置的none,rndc reload qwq.qwq IN external 也正常了,但是master日志报告
client 10.0.1.2#55027: view internal: request has invalid signature: TSIG external: tsig verify failure (BADKEY)
为什么view internal验证到external的key呢?根据日志,好像优先匹配了IP,所以将external的key提交给internal了。


 ailms 回复于:2006-06-08 16:33:40

自己对照 isc 的 FAQ 看吧,也有相同例子的


 coolzsb 回复于:2006-06-09 19:57:56

tsig的问题出自你的设置,请看ailms贴的bind的官方faq中的这段
引用:
        view "internal" {
                match-clients { !key external; 10.0.1/24; };
                ...
        };


而你的internal也用了一个internal的key,而你的external的相关设置为
引用:
                match-clients { key external; any; };



改成
引用:
                match-clients { !key internal; key external; any; };


看看tsig的报错还在不?


 ailms 回复于:2006-06-09 22:09:32

引用:原帖由 coolzsb 于 2006-6-9 19:57 发表
tsig的问题出自你的设置,请看ailms贴的bind的官方faq中的这段

而你的internal也用了一个internal的key,而你的external的相关设置为


改成

看看tsig的报错还在不? 



还是不够准确,可以再改进


 shaying110 回复于:2006-06-11 10:06:00

顶,正需要这个,回去测试好了,来报个到,不行的话再跟帖


 cbbn_net 回复于:2006-06-16 15:19:37

根据coolzsb 圣骑士的提示,做了!key internal; key external;和!key external; key internal的相关设置,master日志还是报告
client 10.0.1.2#55027: view internal: request has invalid signature: TSIG external: tsig verify failure (BADKEY)
有没有人确实做过这方面配置?而且不是两个view,是多个view的配置?


 ailms 回复于:2006-06-16 17:30:31

lz是否在 match-clients {} 使用了 10.0.1/24 ?

要注意,view 的匹配是按照顺序来的,有一个匹配就会选中该 view 

btw:最好把完整的配置和日志贴出来,或者进入 debug level 5,观察 view 的匹配情况


 coolzsb 回复于:2006-06-22 12:57:00

引用:原帖由 cbbn_net 于 2006-6-16 15:19 发表
有没有人确实做过这方面配置?而且不是两个view,是多个view的配置?



肯定是可以做的,我这就是做了3个view的tsig同步,严重建议你按ailms的建议排错处理

引用:原帖由 ailms 于 2006-6-16 17:30    发表
lz是否在 match-clients {} 使用了 10.0.1/24 ?

要注意,view 的匹配是按照顺序来的,有一个匹配就会选中该 view 

btw:最好把完整的配置和日志贴出来,或者进入 debug level 5,观察 view 的匹配情况




 cbbn_net 回复于:2006-07-01 22:55:44

coolzsb ,能否将你做的3个view的tsig同步的配置发上来参考一下呢?


 jyhuang 回复于:2006-09-14 23:27:51

支持一下,我现在用了4个VIEW ,让IP地址给搞昏了,看看KEY的方法如何?

还有,KEY如何产生??


 fangjy2008 回复于:2006-12-11 17:04:28

引用:原帖由 cbbn_net 于 2006-6-16 15:19 发表
根据coolzsb 圣骑士的提示,做了!key internal; key external;和!key external; key internal的相关设置,master日志还是报告
client 10.0.1.2#55027: view internal: request has invalid signature: TSIG exte ... 


刚参考大家贴子,成功的实现二view 同步了。cbbn_net的贴子关于key 的设置时要加双引号。如
!key "internal";key "external";和!key "external";


 ujjidt 回复于:2007-01-08 16:36:43

网中人大哥真强04年就能写出这样的帖子~~佩服!
Bind&dns中关于View的说明~http://www.oreillynet.com/pub/a/oreilly/networking/news/views_0501.html


 gaochong 回复于:2007-01-10 15:44:33

我用的不是这个方法,用TSIG实现带view的zone transfer.
目前有5个view,其实理解了TSIG,更多个view 是一样的。


 HawaiiLeo 回复于:2007-04-02 19:53:17

学习,看来该好好看书理解一下TSIG 了


 yoky 回复于:2007-05-24 15:34:16

前面的老兄说:“对master和slave的每个view都单独设置一个IP”

弱弱的请教一下:在view里面怎么单独设置ip??




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=308556
转载请注明作者名及原文出处



收藏本页到: