我需要为 500K 个区域设置权威 DNS。大约 90% 的区域是相同的(当然域名除外)。
我发现 PowerDNS 只适合这项任务 - 使用管道后端和 Perl 脚本来回答任何域的静态响应作为辅助后端。
还有其他选择吗?
答案1
另一个选择可能是创建一个如下所示的默认区域文件:
$TTL 3600 @ 在 SOA ns1.company.com hostmaster.company.com 中( 2011010101; 3600; 1800; 604800; 3600; ) @ IN NS ns1.company.com @ IN NS ns2.company.com @ IN MX 10 mail.company.com @ 在 192.0.2.1 www 192.0.2.2
假设上面调用了/etc/bind/default.zone
,那么您可以添加区域条目,例如:
区域“domain1.com”{ 類型主屬; 文件“/etc/bind/default.zone”; }; 区域“domain2.com”{ 類型主屬; 文件“/etc/bind/default.zone”; };
在这种情况下,如果您查询 domain1.com 或 domain2.com,您将从默认区域获取信息。
但是,请注意,我只是在小规模上进行了此操作,并且尚未对 500K 个区域进行测试,因此我不确定 Bind 是否会在内存中构建它。例如,我不确定它是否只加载一个区域文件并将所有区域指向它,或者它是否会加载相同的区域文件 500K 次!
答案2
我最终使用了 PowerDNS,但使用了 SQL 后端。我更改了 SQL 语句,并添加了如果未找到请求的域则回退到“默认”域的功能。
运行完美。延迟几乎从未超过 5(需要进行一些额外的配置调整)。
答案3
对于 powerdns 设置默认为空名称的记录
纳米/etc/pdns/pdns.conf
gmysql-any-query=select COALESCE(b.content,c.content,d.content,e.content,f.content) content, \
COALESCE(b.ttl,c.ttl,d.ttl,e.ttl,f.ttl) ttl, \
COALESCE(b.prio,c.prio,d.prio,e.prio,f.prio) prio, \
COALESCE(b.type,c.type,d.type,e.type,f.type) type, \
COALESCE(b.domain_id,c.domain_id,d.domain_id,e.domain_id,f.domain_id) domain_id, \
a.mydomain name \
from \
(select '%s' mydomain) a \
left outer join records b on b.name = SUBSTRING_INDEX(a.mydomain, '.', -4) and b.type = 'A' \
left outer join records c on c.name = SUBSTRING_INDEX(a.mydomain, '.', -3) and c.type = 'A' \
left outer join records d on d.name = SUBSTRING_INDEX(a.mydomain, '.', -2) and d.type = 'A' \
left outer join records e on e.name = SUBSTRING_INDEX(a.mydomain, '.', -1) and e.type = 'A' \
left outer join records f on f.name = SUBSTRING_INDEX(a.mydomain, '.', 0) and f.type = 'A' \
limit 1;