我已经设置了 BIND 9 服务器并配置了加密密钥,以便允许从客户端进行更新。现在,在我的 中named.conf
,我已设置以下内容:
allow-update { key dns1.example.org.; };
这有效,我可以从我的客户端(nsupdate
命令)执行更新(添加,删除区域记录)。
我想知道是否可以将其与 ACL 结合使用。基本上,我希望客户端需要正确的密钥,但也必须来自某个子网或 IP 地址。我能以某种方式做到这一点吗?我在文档中找不到有关该场景的任何信息。
答案1
Alcs 是第一个匹配项。如果您排除了想要的地址,则可以使用 any 拒绝所有不匹配的地址;然后检查密钥是否匹配。
allow-update { !{ !allowed; any; }; key keyname; };
答案2
丑陋的答案#1
你只有愿意发挥创造力、愿意忍受丑陋和粗暴才能做到这一点。
仅允许来自具有密钥 dns1.example.com 的 1.2.3.0/24 的更新。
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.;
};
如何进行按位运算:
- 对于/X 子网,需要 X 行。
- 将子网IP转换为二进制形式。
- 您从第 1 位开始 - 如果允许的子网设置了此位,则您拒绝的规则将使其清除,并且如果允许的子网中的位为 0,那么您的规则将拒绝该位设置。
- 对于规则 #N,前 N-1 位与所需子网掩码相同,位 N 如步骤 3 中所述。
我实际上没有尝试过,但应该可行。
如果您有多个允许的子网,我祝您好运。
就这个答案而言,我很高兴 IPv6 尚未被广泛部署。:)
丑陋的答案#2
单独设置隐身(即未列为 NS)主名称服务器,其防火墙规则仅允许来自“允许”子网的数据包和从其从属名称服务器。在此隐身状态下,仅允许使用密钥进行更新。配置从属服务器以通过 AXFR/IXFR 和 NOTIFY 获取区域数据。并且不要忘记在从属服务器上禁用更新转发。
一旦你以丑陋的方式做了这件事,请记住任何人从任何地方可以伪造该 UDP DNS 更新数据包中的源地址,这使得所有这些努力都毫无意义。(尽管您可以禁用 UDP,以使这些努力稍微不那么毫无意义)。
答案3
我知道您可以定义一个 match_list,但我不确定您是否可以组合键和匹配列表。
allow-update { address_match_list };
例如:
options {
allow-update { !192.168.2.7;192.168.2/24;};
};
答案4
我没有尝试过,但根据我的理解,定义是:
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 };
};
因此区域转移现在仅限于拥有密钥的区域(超出匹配列表)。