如何收集DNS A记录请求?


15

我需要A在RedHat PC上记录所有传出记录。我尝试使用tcpdump

tcpdumpdns=OUTPUT-FILENAME-HERE
nohup tcpdump -K dst port 53 -w $tcpdumpdns > /dev/null 2>&1 &

它使输出文件如下:

19:26:12.185392 IP 172.16.0.6.57977 > google-public-dns-a.google.com.domain: 51198+ A? yahoo.com. (27)

所以我需要进行处理以获取yahoo.com

echo $tcpdumpdns | awk '/ A\? / {u = NF - 1; print $u}' | sed 's/^www.//g; s/.$//g' | sort -u

有没有更好的解决方案来收集所有传出A记录请求?

ps:只需要收集DNS A记录即可获得可通过HTTPS访问的网站的最新列表。因此,我可以为Firefox附加组件的HTTPSEverywhere生成xml文件。因此,这只是脚本的一部分。


您提供的解决方案出了什么问题?
Michael Mrozek

您是否有GUI环境,如果可以的话,使用wireshark-gtk是更简单的解决方案,因为您可以在其中轻松进行过滤。
Hanan N.

@Hanan N .:不能选择GUI。这需要是自动的。
LanceBaynes

@Michael Mrozek:我什么都希望。但是我问,因为我愿意接受其他解决方案。
LanceBaynes

Answers:


12

使用Wireshark:

tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"

2
我知道了tshark: "A" cannot be found among the possible values for dns.qry.type.
Jack O'Connor

3
要解决@ JackO'Connor问题,类型A DNS记录的十进制值为1。因此,这应该起作用:tshark -f "udp port 53" -Y "dns.qry.type == 1 and dns.flags.response == 0"
Rolinh

13

如果您没有安装wireshark,那么

tcpdumpdns=/tmp/tcpdumps
tcpdump -lvi any "udp port 53" | tee $tcpdumpdns

应该为您工作。当您想将输出限制为倒数第二个值时,我将使用以下方法解析您的日志文件:

grep -E 'A\?' $tcpdumpdns |sed -e 's/^.*A? //' -e 's/ .*//'|sort -u

如果您想直播它,那么:

tcpdump -lvi any "udp port 53" 2>/dev/null|grep -E 'A\?'|awk '{print $(NF-1)}'

应该做到这一点(这里sed和awk是可互换的;我会选择awk。)


grep -E 'A\?' $tcpdumpdns |sed 's/^.*A? //;s/ .*//'|sort -u输入的内容较少
Alexx Roche
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.