我正在运行一个带有自己的 BIND DNS 缓存的网络爬虫。我们的代码使用我们的 DNS 缓存进行解析,并使用 Python 的请求库发出 GET 请求。
问题在于许多 FQDN 配置错误,它们指向 RFC1918 IP 地址或环回 IP,例如127.0.0.1
或10.0.0.0/8
。结果我们的爬虫尝试连接这些 IP,最后得到了来自我们数据中心的扫描报告。
我们对爬虫进行了更改,现在它首先解析 FQDN 的 IP,如果 IP 位于私有/环回/保留范围内,则跳过它。
使用 tcpdump 嗅探后,我发现仍有流量流向私有 IP 地址。我猜想这是由于 HTTP 重定向而发生的,因为我们检查原始 FQDN,但我们不检查重定向的主机,因为这部分发生在 Python 的请求库中。
BIND 是否有任何选项可以阻止解析私有、环回或保留 IP 地址?我可以将其设置为返回某种“未解析”错误吗?
编辑:我尝试将 BIND 缓存转储到文件并检查它,现在我确定这是由于 HTTP 重定向而发生的,但更改代码并不容易,而且我正在寻找像配置 BIND 这样的快捷方式,否则我会在防火墙上阻止它们。
答案1
使用 BIND 您可以使用响应政策区 (RPZ)阻止解析指向特定地址的地址记录( A
/ )的功能。AAAA
具体来说反渗透条目类型相关:
反渗透
IP 触发器是响应的 ANSWER 部分中的 A 或 AAAA 记录中的 IP 地址。它们的编码方式与客户端 IP 触发器类似,只是作为rpz-ip。
作为示例用例,手册使用了以下内容:
; IP policy records that rewrite all responses containing A records in 127/8
; except 127.0.0.1
8.0.0.0.127.rpz-ip CNAME .
32.1.0.0.127.rpz-ip CNAME rpz-passthru.
关于配置的总体思路在手册中总结如下:
例如,您可以使用此选项语句
response-policy { zone "badlist"; };
和这个区域声明
zone "badlist" {type master; file "master/badlist"; allow-query {none;}; };
使用这个区域文件
$TTL 1H @ SOA LOCALHOST. named-mgr.example.com (1 1h 15m 30d 2h) NS LOCALHOST. ; [snip] ; IP policy records that rewrite all responses containing A records in 127/8 ; except 127.0.0.1 8.0.0.0.127.rpz-ip CNAME . 32.1.0.0.127.rpz-ip CNAME rpz-passthru. ; [snip]
请仔细阅读详细信息以了解整体设置以及 RPZ 区域内相当具体的语义!(它具有正常的区域语法,但正如您所见,一些特殊名称具有非常具体的含义。)
答案2
我认为它们的发生是因为 HTTP 重定向,因为我们检查了原始 FQDN,但我们没有检查重定向的主机,因为这部分发生在 Python 的请求库中。
我希望您在更改代码后清除了 BIND 的 DNS 缓存。继续...
杀手在于说“我以为”。你需要确认一下。首先,使用 检查 BIND 缓存中是否有任何私有 IP 地址rndc dumpdb
。查看该文件以查找违规者。
如果有:刷新缓存。看看它们是否会恢复。我不确定私有 IP 地址是否会因为 HTTP 重定向而出现在缓存中。对于一个可公开访问的网站来说,出现许多 HTTP 重定向实例是非常不寻常的,这些重定向会将访问者带到解析为 RFC 1918 IP 地址的主机名。公共区域中的私有 IP 地址...不寒而栗。
如果没有:然后,发往私有 IP 地址的流量会从其他地方进入应用程序。可能是某种应用程序缓存。可能是内存中您不知道的某些东西。可能是完全不同的进程,也许根本不是您的应用程序。
BIND 是否有任何选项可以阻止解析私有、环回或保留 IP 地址?我可以将其设置为返回某种“未解析”错误吗?
不会。BIND 会解析,因此在您的场景中,您有一个理论上的竞争条件:您不需要该 IP 地址,但要找出它是否是您不想要的 IP 地址,您必须获取它。您想要的是某种反向 DNS RPZ,但它并不存在。
我错了。是的,正如杰出的 Håkan Lindqvist 指出的那样,您可能能够使用 RPZ-IP。看看这个:http://ftp.isc.org/isc/bind9/cur/9.10/doc/arm/Bv9ARM.ch06.html#id2589969还赞同他的回答。
在这种情况下,您需要将逻辑拉入应用程序,并根据本地缓存更仔细地检查每个主机名,并禁止爬虫程序访问 RFC 1918 地址。
让我们更深入地分析一下你所说的内容:
...我们不检查重定向的主机...
因此,检查重定向的主机,问题就得到了解决,无需过度工程。=)