视图之间共享的 BIND 动态区域的更新延迟

视图之间共享的 BIND 动态区域的更新延迟

以下是快速而粗略的:在 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

具体应该怎么做:

  1. 配置中的第一个视图应为“主”视图,且具有唯一的区域文件(将被共享)
  2. 具有相同区域的所有其他视图应该只有一行: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";
        };
    };

但这仅当所有视图中都有相同的区域文件时才有效。

相关内容