我正在构建一个 DNS 服务器,它将通过返回域名的错误 IP 地址来阻止对特定网站的访问。
目前我使用 DNSMasq 来执行此操作,但是我的列表非常大,我希望使用 bind 来执行此功能。尽管 DNSMasq 可以很好地处理大型列表,但它确实有一些限制迫使我做出选择。为了在 DNSMasq 中为整个域执行此操作,我只需在配置文件中添加一行,如下所示:
address=/url.com/1.2.3.4
这将永远1.2.3.4
返回*.url.com
我正在寻求以下方面的帮助:
- 我如何才能实现 BIND 的一个非常基本的区域设置来完成类似的事情?
- 请记住,我的域名列表有 1000000+ 条记录
- 我能否只拥有一个主区域和一个简单的包含在此区域中的大型域列表?
干杯
彭建锋
答案1
理所当然地认为,DNS黑名单并不是阻止某人访问他们真正想要访问的网站的方法,但对于处理恶意软件和随意的尝试访问一个不良网站...
响应政策区域 (RPZ)
RPZ 允许您创建定义响应重写规则的区域文件。这些是在 9.8.1 版本中实现的。
假设您要阻止badrecord.example.com.
,其 IP 地址为198.51.100.1
。此处的真实 IP 并不重要,但提供一个 IP 有助于强化所发生的情况。
options {
# Snip.
response-policy { zone "mypolicy"; };
};
zone "mypolicy" {
type master;
file "mypolicy.zone";
allow-query { none; };
};
区域文件如下所示:
$TTL 1H
@ SOA LOCALHOST. doesnt.really.matter.example.org. (1 1h 15m 30d 2h)
; NS required for zone syntax reasons, but ignored
NS LOCALHOST.
; CNAME bad reply to a DNS record that isn't in this file
badrecord.example.com. CNAME mywalledgarden.example.edu.
; replace bad reply with fixed IP address
badrecord2.example.com. A 203.0.113.1
; rewrite the top of a bad domain, as well as all records immediately
; beneath the apex. (i.e. not further than one level deep)
example.net. A 203.0.113.1
*.example.net. A 203.0.113.1
观察结果:
- “mypolicy” 是一个实际的 DNS 区域。您可以使用区域传输将其分发到您的环境中,并从单个服务器控制数据。
- 由于规则原因,用户不能直接查询该区域
allow-query
。 - 这些规则不会阻止查询,但对通常包含坏数据的查询的任何回复都将被重写。这样做的副作用是,对不存在的记录的请求将
NXDOMAIN
正确返回。您只需修改响应如果可能的话客户端将获得包含错误数据的响应。 - 适用 DNS 通配符匹配的通常规则。
这些并不是您可以执行的唯一重写。有关完整语法和潜在应用,我建议您查阅 BIND ARM。
您可能会在互联网上找到一些指南,其中建议创建根 ( .
) 区域或为每个需要阻止的域创建一个区域。不要这样做。这是一种较旧、笨拙的做事方式,DNS 管理员由于缺乏更好的选择而采用这种方式。如果 RPZ 是一种选择并且它满足您的需求,请使用它。如果您不具有该域的权威性,请不要将自己配置为具有该域的权威性。