我在 Debian Jessie 上运行着权威的 BIND 9.9.5-9+deb8u8-Debian。我有一个可以robin.info
正常工作的工作区(各种测试都报告成功,例如 pingdom.com 的 DNS 检查工具上的测试)
我正在尝试使用 dnssec 来保护它。我按照BIND DNSSEC 指南,第 4 章,轻松入门。我成功生成了 ZSK 和 KSK,并更新了我的区域,添加了粗体行:
区域“robin.info”{ 類型主屬; 文件“/etc/bind/zones/robin.info”; 包括“/etc/bind/include-zones/acls”; 密钥目录“/etc/bind/dnssec/robin.info/2016”; 内联签名是; 自动 DNSSEC 维护; };
我确保区域文件中不存在.jnl
、.jbk
和文件,然后重新启动绑定.signed
并确认区域已加载并具有 DNSKEY 条目,尽管日志中出现了一些错误:.signed.jnl
rndc reload
11-Dec-2016 13:54:20.742 zone robin.info/IN/internal (signed): loaded serial 2016121111
11-Dec-2016 13:54:20.742 zone robin.info/IN/external (signed): loaded serial 2016121111
11-Dec-2016 13:54:20.750 zone robin.info/IN/external (signed): receive_secure_serial: unchanged
11-Dec-2016 13:54:20.750 zone robin.info/IN/external (signed): reconfiguring zone keys
11-Dec-2016 13:54:20.766 zone robin.info/IN/external (signed): next key event: 11-Dec-2016 14:54:20.750
11-Dec-2016 13:54:20.796 zone robin.info/IN/internal (signed): receive_secure_serial: unchanged
11-Dec-2016 13:54:20.796 zone robin.info/IN/internal (signed): reconfiguring zone keys
11-Dec-2016 13:54:20.805 malformed transaction: /etc/bind/zones/robin.info.signed.jnl last serial 2016121113 != transaction first serial 2016121111
11-Dec-2016 13:54:20.805 zone robin.info/IN/internal (signed): zone_rekey:dns_journal_write_transaction -> unexpected error
当我想更新我的区域时,这些串行错误似乎会导致问题。我在未签名的区域中进行了更改/etc/bind/zones/robin.info
,并将串行增加到2016121121
11-Dec-2016 13:57:58.658 zone robin.info/IN/internal (signed): serial 2016121121 (unsigned 2016121121)
11-Dec-2016 13:57:58.658 zone robin.info/IN/internal (signed): could not get zone keys for secure dynamic update
11-Dec-2016 13:57:58.658 zone robin.info/IN/internal (signed): receive_secure_serial: not found
11-Dec-2016 13:57:58.659 malformed transaction: /etc/bind/zones/robin.info.jnl last serial 2016121121 != transaction first serial 2016121111
11-Dec-2016 13:57:58.659 zone robin.info/IN/external (unsigned): not loaded due to errors.
11-Dec-2016 13:57:58.659 all zones loaded
11-Dec-2016 13:57:58.659 running
11-Dec-2016 13:57:58.661 zone robin.info/IN/internal (signed): reconfiguring zone keys
11-Dec-2016 13:57:58.670 malformed transaction: /etc/bind/zones/robin.info.signed.jnl last serial 2016121115 != transaction first serial 2016121111
11-Dec-2016 13:57:58.670 zone robin.info/IN/internal (signed): zone_rekey:dns_journal_write_transaction -> unexpected error
11-Dec-2016 13:57:58.670 zone robin.info/IN/external (signed): reconfiguring zone keys
11-Dec-2016 13:57:58.671 zone robin.info/IN/external (signed): next key event: 11-Dec-2016 14:57:58.670
我可以确认dig
我的旧区域仍然被加载(来自 SOA 和不可见的更改)。
这里有几个错误信息:
1) 提示我遇到了密钥问题(“无法获取安全动态更新的区域密钥”)。但是 bind 在第一次加载时没有遇到任何问题,并且 bind 可以读取我的密钥文件(named 以bind
组成员身份运行bind
):
xavier@dent:/etc/bind/zones$ ls -l /etc/bind/dnssec/robin.info/2016
total 17k
-rw-r--r-- 1 root bind 603 Dec 10 17:23 Krobin.info.+008+43324.key
-rw-r----- 1 root bind 1.8k Dec 10 17:23 Krobin.info.+008+43324.private
-rw-r--r-- 1 root bind 604 Dec 10 17:22 Krobin.info.+008+44679.key
-rw-r----- 1 root bind 1.8k Dec 10 17:22 Krobin.info.+008+44679.private
2) 提示序列号有错误(初始错误为last serial 2016121113 != transaction first serial 2016121111
)。不过我认为我不必太担心序列号,因为在 ISC 的 KB 中我可以看到:
请注意,此响应中的序列号与文件 example.com.db 中的序列号不同。Named 会独立于未签名版本跟踪区域的签名版本的序列号。如果未签名区域更新为新的序列号,且该序列号高于签名副本中的序列号,则签名副本的序列号将增加以匹配该序列号,否则将分开保存这两个序列号。[1]
到目前为止,我发现更新区域的唯一方法是停止绑定,删除.jnl
、.jbk
和文件.signed
,.signed.jnl
然后重新开始绑定。这似乎是错误的,我需要确保增加足够的序列号以激活新区域。我做错了什么,我该如何修复我的 dnssec?
答案1
我想我终于找到了问题的根源。我有两个视图,它们配置为包含相同的主区域文件两次。
不能对两个区域使用同一个文件。因此这是无效的并导致了我的问题:
view "internal" {
match-clients ...;
zone "example.com" {
type master;
file "/etc/bind/zones/example.net";
};
};
view "external" {
match-clients ...;
zone "example.com" {
type master;
file "/etc/bind/zones/example.net";
};
};
“通过示例了解 BIND 9 中的视图”指南的第 4 章中描述了共享区域的正确方法。基本上,只有一个区域必须是主区域,另一个必须是从区域。在正确的位置添加一些 acl、密钥以及 localhost 的 also-notify 后,我摆脱了这些错误。
最后这是我的最终配置:
key "internal" {
// TSIG Key generated with dnssec-keygen -a HMAC-MD5 -b 512 -n USER internal
algorithm hmac-md5;
secret "XXXX";
};
view "internal" {
match-clients { key internal; ...IPs...; }; // our network
zone "robin.info" {
type slave;
file "/etc/bind/slave-zones/robin.info"; // Not the same file as external view!
masters { 127.0.0.1; };
};
};
view "external" {
match-clients { !key internal; "any"; }; // everyone else
server 127.0.0.1 {
/* Deliver notify messages to internal view with internal key. */
keys { internal; };
};
zone "robin.info" {
type master;
file "/etc/bind/zones/robin.info";
// ACL file with allow-transfer and also-notify
// including secondary DNS servers and 127.0.0.1
include "/etc/bind/acls";
key-directory "/etc/bind/dnssec/robin.info/2017";
inline-signing yes;
auto-dnssec maintain;
};
};
答案2
核心似乎是could not get zone keys for secure dynamic update
错误消息,因此退回到未签名状态;并且由于它没有经过自动碰撞 SOA 进行签名的签名路径,因此它会抱怨 SOA 已过时。
我在向三个区域添加签名时收到相同的错误消息,我挠了挠头,然后叹了口气,完全重新启动了命名。这为我解决了问题。绑定 9.11.0P3。
我不记得以前添加签名时见过这个问题,但所有其他区域都是很久以前在早期版本的 Bind 下通过转换签名的。此外,这三个区域是反向 DNS 文件,因此文件名略有不同。这就是我要解释的全部内容。
因此:绑定错误,完全重新启动命名,让它找到真正的密钥文件,然后进行签名。
答案3
我也遇到过类似的问题,也是使用 debian jessie 的 bind。我没有多个视图,也没有共享文件,但 bind 抱怨了与以下相同的错误:
11-Dec-2016 13:54:20.796 zone robin.info/IN/internal (signed): reconfiguring zone keys
11-Dec-2016 13:54:20.805 malformed transaction: /etc/bind/zones/robin.info.signed.jnl last serial 2016121113 != transaction first serial 2016121111
11-Dec-2016 13:54:20.805 zone robin.info/IN/internal (signed): zone_rekey:dns_journal_write_transaction -> unexpected error
我的解决方案是使用
rndc sync -clean
以及重新加载绑定(即使未启用动态更新!)。来自 man:
Sync changes in the journal file for a dynamic zone to the master file. If the
"-clean" option is specified, the journal file is also removed. If no zone is
specified, then all zones are synced.