新版本可從如下獲得:
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??
|