以下是快速而粗略的:在 BIND9 上,使用在以下主机之间共享的动态区域:视图,如果我从属于与我执行 nsupdate 相同的视图的客户端查询该记录,则执行 nsupdate、更新/创建/删除记录将会正常工作。
从视图中查询不是与我用于 nsupdate 的相同,它将抛出 NXDOMAIN(如果添加新记录)或在发生更改/更新时显示旧记录信息,直到经过一段任意长度的时间(比如 15 分钟),或者我强制执行$ rndc freeze && rndc thaw
。 $ rndc sync
似乎根本没有做任何事情来解决这个问题——我希望这只是一个日志文件的事情,因为日志刷新记录为大约 15 分钟刷新一次。
如果不清楚的话,这里有一些伪代码可以帮助我们入门:
BIND 视图
view "cdn-redir" {
match-clients { 10.1.1.0/24; 10.1.2.0/24; };
include "cdn-zone.db";
include "dynamic-zone.db";
};
view "default" {
match-clients { any; };
include "dynamic-zone.db";
};
示例命令行
user@ns:~$ nsupdate -k rndc.key
> server localhost
> zone example.com.
> update add foohost.example.com. 600 A 10.5.6.7
> send
> quit
user@ns:~$ dig foohost.example.com (resolv.conf points to 127.0.0.1)
[ responds with correct answer 10.5.6.7 ]
在其他地方,与 nsupdate 处于相同视图的主机
[email protected]:~$ foohost.example.com (resolv.conf points to above nameserver)
[ responds with correct answer 10.5.6.7 ]
在其他地方,主持人陷入不同的以 nsupdate 形式查看
[email protected]:~$ dig foohost.example.com (resolv.conf points to above nameserver)
[ responds with NXDOMAIN even though I'm asking the same server ]
此时,如果我有耐心,问题最终会自行解决(可能需要 15 分钟),但我经常没有耐心,所以我被迫在$ rndc freeze && rndc thaw
名称服务器上强制解决问题。
另一方面
事情完全相反,如果我从属于“cdn-redir”视图的地址对服务器执行 nsupdate,问题就会逆转。来自与“cdn-redir”匹配的客户端的后续查询在 nsupdate 之后立即获得正确的记录,而无需摆弄“rndc freeze/thaw”,但从“cdn-redir”视图之外的地址进行查询现在会出现延迟/rndc 的愚蠢行为。
我的终极问题
如果它像 42 一样简单,我会张开双臂接受它......
我希望避免“rndc freeze && rndc thaw”,因为担心会错过来自 DHCP 服务器的动态更新。有谁知道如何更有效/高效地在视图之间同步更新的记录,或者可以告诉我哪里可能出错了?
编辑:BIND 9.9.5/Ubuntu 14.04,但它发生在 Ubuntu 和 BIND 的先前版本上。
谢谢大家!
根据要求安德鲁·B,以下是删除的(部分)区域:
$ORIGIN .
$TTL 3600
example.com IN SOA ns1.example.com. HOSTMASTER.example.com. (
2009025039 ; serial
900 ; refresh 15
600 ; retry 10
86400 ; expire 1 day
900 ; minimum 15 min
)
NS ns1.example.com.
$ORIGIN example.com.
$TTL 30
AEGIS A 10.2.1.60
TXT "31bdb9b3dec929e051f778dda5abd0dfc7"
$TTL 86400
ts-router A 10.1.1.1
A 10.1.2.1
A 10.1.3.1
A 10.1.4.1
A 10.1.5.1
A 10.1.6.1
A 10.1.7.1
A 10.1.8.1
A 10.2.1.1
A 10.2.2.1
A 10.2.3.1
ts-server A 10.2.1.20
ts-squid0 A 10.2.2.20
ts-squid1 A 10.2.2.21
$TTL 600
tssw4 A 10.2.3.4
tssw5 A 10.2.3.5
tssw6 A 10.2.3.6
tssw7 A 10.2.3.7
; wash rinse repeat for more hosts
$TTL 30
wintermute A 10.2.1.61
TXT "003f141e5bcd3fc86954ac559e8a55700"
答案1
不同的视图独立运行,这本质上比运行单独的命名实例更方便。如果不同视图中有同名的区域,这只是巧合,它们仍然是完全独立的区域,与其他区域没有更多关联。
在 bind 自行更新区域内容的情况下(从属区域、具有动态更新的区域等),让多个独立区域使用相同的区域文件是行不通的。我不确定是否存在损坏区域文件本身的风险。
您可能能够设置一些类似于您想要做的事情,即让一个视图中的区域成为另一个视图中同名区域的从属。这显然是一个有点复杂的配置,但使用匹配客户端的 TSIG 密钥以及通知/传输,我相信这应该是可行的。
编辑:ISC 已针对此场景发布了一篇知识库文章,如何在多个视图之间共享动态区域?,建议采用上面提到的相同类型的配置。
这是他们的配置示例,格式有所改进:
key "external" {
algorithm hmac-md5;
secret "xxxxxxxx";
};
key "mykey" {
algorithm hmac-md5;
secret "yyyyyyyy";
};
view "internal" {
match-clients { !key external; 10.0.1/24; };
server 10.0.1.1 {
/* Deliver notify messages to external view. */
keys { external; };
};
zone "example.com" {
type master;
file "internal/example.db";
allow-update { key mykey; };
also-notify { 10.0.1.1; };
};
};
view "external" {
match-clients { key external; any; };
zone "example.com" {
type slave;
file "external/example.db";
masters { 10.0.1.1; };
transfer-source { 10.0.1.1; };
// allow-update-forwarding { any; };
// allow-notify { ... };
};
};
答案2
由于视图存在类似的问题,我决定摆脱它们并将授权转移到区域中。
您可以通过简单包含两个区域文件来替换问题中的视图,让当前共享的区域不受影响,并将 allow-query{} 添加到“dynamic-zone.db”定义中,如下所示:
zone "dynamic.zone" {
allow-query { 10.1.1.0/24; 10.1.2.0/24; };
type master;
file "/etc/bind/zones/master/dynamic.zone";
update-policy { .... };
};
通过这种方式,您可以实现您的预期目标,即使得 dynamic.zone 只能从指定网络访问,并将其他区域公开。
答案3
目前这是一个相当老的问题。但我最近尝试解决同样的问题,并找到了一个优雅而简单的解决方案。从 isc bind 版本 9.10.0 开始,有一个简单的方法可以做到这一点。
具有“视图内”区域配置选项。所有视图共享相同的内存结构,并且应保持同步。您可以从任何视图进行更新。
https://kb.isc.org/docs/aa-00295
手册链接:ftp://ftp.isc.org/isc/bind9/9.11.4-P2/doc/arm/Bv9ARM.pdf
具体应该怎么做:
- 配置中的第一个视图应为“主”视图,且具有唯一的区域文件(将被共享)
- 具有相同区域的所有其他视图应该只有一行:in-view“first-view-name”
key "mykey" {
algorithm hmac-md5;
secret "yyyyyyyy";
};
view "internal" {
match-clients { 10.0.1/24; };
zone "example.com" {
type master;
file "example.db";
allow-update { key mykey; };
};
};
view "external" {
match-clients { any; };
zone "example.com" {
in-view "internal";
};
};
但这仅当所有视图中都有相同的区域文件时才有效。