我想知道哪些主机在什么时间发出了特定的 DNS 查询。有没有办法在 Bind 9 上获取如此具体的日志?
例如,我可能想要记录所有A
查询xyzzy.net
。
答案1
将正确类型的通道节放入 named.conf 中的 logs{} 块中。
channel "client" {
file "/var/log/client_named.log";
severity info;
print-time yes;
};
可能会奏效。这将为您提供以下类型的数据:
22-Apr-2011 12:06:53.294 client xxx.xxx.xxx.xxx#56202: view external-in: query: st.in.multi.surbl.org IN A +
编辑:警告 - 启用此类日志记录将会非常快速地生成非常大的日志文件,并且很容易在没有某种日志轮换/压缩的情况下填满您的磁盘,并且可能最适合简短的数据收集会话,而不是永久配置。
如果这(以及对生成的日志文件进行后处理)太多了,您可以使用 tcpdump 之类的工具来执行此操作。
tcpdump -i eth0 dst port 53 | egrep 'A' | egrep 'xyyzyy.com'
或者更好的是,编写一个过滤器来匹配你想要过滤的 DNS 数据包的正确位(在本例中为 A? 类型)
不过,更简单的办法可能是使用像 dnstop 这样的工具。 dnstop 网页将为您完成所有协议解码,并且IIRC您可以使用-n过滤其输出以将其捕获的内容限制在单个域中。
答案2
不,日志记录语句不支持过滤器。您可以将绑定日志发送到 syslog,然后仅过滤 syslog 规则中的客户端 IP 和 A 记录。这可能是最简单的方法。