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

enr*_*rel 8 bind dynamic-dns split-dns

这是快速而肮脏的:在具有在视图之间共享的动态区域的 BIND9 上,如果我从落入与 nsupdate 相同视图的客户端查询该记录,则执行 nsupdate、更新/创建/删除记录将正常工作从。

从一种观点认为,查询是不一样的使用的nsupdate将抛出NXDOMAIN(如果将一个新的记录),或将显示在改变/更新直到某个时间任意长度的情况下,旧的记录信息的一个我(说15分钟)过去了,或者我强行做$ rndc freeze && rndc thaw$ rndc sync似乎根本没有做任何事情来解决这个问题——我希望这只是一个日志文件的事情,因为日志刷新被记录为刷新大约 15 分钟。

如果这还不清楚,这里有一些伪代码让我们开始:

绑定视图

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";
};
Run Code Online (Sandbox Code Playgroud)

示例命令行

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 ]
Run Code Online (Sandbox Code Playgroud)

在其他地方,一个主机落入与 nsupdate 相同的视图

user@10.11.12.50:~$ foohost.example.com (resolv.conf points to above nameserver)
  [ responds with correct answer 10.5.6.7 ]
Run Code Online (Sandbox Code Playgroud)

在其他地方,主机陷入与 nsupdate不同的视图

user@10.1.1.50:~$ dig foohost.example.com (resolv.conf points to above nameserver)
  [ responds with NXDOMAIN even though I'm asking the same server ]
Run Code Online (Sandbox Code Playgroud)

此时,如果我有耐心,问题最终会自行解决(可能需要 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 的早期版本上。

谢谢大家!

根据Andrew 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"
Run Code Online (Sandbox Code Playgroud)

Håk*_*ist 7

不同的视图分别运行,它本质上比运行命名的单独实例更方便。如果在不同的视图中有同名的区域,这只是巧合,它们仍然是完全独立的区域,与任何其他区域没有任何关系。

在 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 { ... };
    };
};
Run Code Online (Sandbox Code Playgroud)