BIND9:结合密钥和ACL以允许更新

我已经build立了一个BIND 9服务器并configuration了encryption密钥,以允许来自客户端的更新。 现在在我的named.conf ,我设置了以下内容:

 allow-update { key dns1.example.org.; }; 

这工作,我可以从我的客户端( nsupdate命令)执行更新(添加,删除区域logging)。

我想知道是否可以将它与ACL结合使用。 基本上我希望客户端需要正确的密钥,但也必须来自某个子网或IP地址。 我能不能做到这一点? 我在文档中找不到有关该场景的任何信息。

第一场比赛 如果您排除了所需的地址,则可以使用任何地址拒绝所有不匹配的地址; 然后检查密钥是否匹配。

  allow-update { !{ !allowed; any; }; key keyname; }; 

丑陋的答案#1

只有当你愿意有创造性,丑陋和野蛮的时候,你才能做到这一点。

只允许从1.2.3.0/24更新关键字dns1.example.com。

 acl “mix-match” { ! 128.0.0.0/1; ! 64.0.0.0/2 ! 32.0.0.0/3 ! 16.0.0.0/4 ! 8.0.0.0/5 ! 4.0.0.0/6 ! 2.0.0.0/7 ! 0.0.0.0/8 //0 instead of 1 since bit is set in the desired network ! 1.128.0.0/9 ! 1.64.0.0/10 ! 1.32.0.0/11 ! 1.16.0.0/12 ! 1.8.0.0/13 ! 1.4.0.0/14 ! 1.0.0.0/15 //0 instead of 2 since bit is set in the desired network ! 1.3.0.0/16 //1-st bit = 1: we DENY hosts with 1.3.0.0/16 but allow 1.2.0.0/16 ! 1.2.128.0/17 ! 1.2.64.0/18 ! 1.2.32.0/19 ! 1.2.16.0/20 ! 1.2.8.0/21 ! 1.2.4.0/22 ! 1.2.0.0/23 //0 instead of 2 since bit is set in the desired network ! 1.2.2.0/24 //1-st bit = 9: we DENY hosts with 1.2.2.0/24 but allow 1.2.3.0/24 key dns1.example.com.; }; 

如何做这个按位math:

  1. 对于/ X子网,你需要X行。
  2. 将子网IP转换成二进制forms。
  3. 你从第一位开始 – 如果允许子网设置了这个位,你拒绝规则将它清除,如果允许子网中的位为0,那么你的规则将拒绝该位设置。
  4. 对于规则#N,N-1的第一个比特与所需的子网掩码中的相同,比特N如步骤3中所述。

我没有尝试,但应该工作。

如果你有多个允许的子网,祝你好运。

为了这个答案的目的,我很高兴IPv6还没有被广泛部署。 🙂

丑陋的答案#2

设置单独隐形 (即未列为NS)的主要名称服务器,在其防火墙规则中允许数据包仅来自“允许”子网来自其从属名称服务器。 在这个秘密,只允许更新与密钥。 configuration从站以通过AXFR / IXFR和NOTIFY获取区域数据。 不要忘记禁用从站上的更新转发。

一旦你做到了丑陋的一面 ,记住任何来自任何地方的 可以欺骗UDP DNS更新包中的源地址,这使得所有这些努力完全没有意义。 (虽然你可以禁用UDP来使这个努力略显毫无意义)。

我知道你可以定义一个match_list,但是我不确定你是否可以结合键和匹配列表。

 allow-update { address_match_list }; 

例如:

 options { allow-update { !192.168.2.7;192.168.2/24;}; }; 

我没有尝试过,但根据我的理解,定义是:

 address_match_list = element ; [ element; ... ] element = [!] (ip [/prefix] | key key-name | "acl_name" | { address_match_list } ) 

所以你可以做类似的事情

 acl “mix-match” { “two-subnets”; ! 10.10.30.101; 10.10.30.0/24; key dns1-dns2.example.com; }; zone "abc.def.example.com" in { type master; file "named.abc.data"; allow-update{ mix-match }; }; 

因此区域传输现在被限制在那些具有密钥的区域(超出匹配列表)。