如何收集 DNS A 记录请求?

Lan*_*nes 16 tcpdump

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

tcpdumpdns=OUTPUT-FILENAME-HERE
nohup tcpdump -K dst port 53 -w $tcpdumpdns > /dev/null 2>&1 &
Run Code Online (Sandbox Code Playgroud)

它生成一个输出文件,如:

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

所以我需要处理它以获得yahoo.com

echo $tcpdumpdns | awk '/ A\? / {u = NF - 1; print $u}' | sed 's/^www.//g; s/.$//g' | sort -u
Run Code Online (Sandbox Code Playgroud)

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

ps:收集 DNS A 记录只需要拥有可通过 HTTPS 访问的网站的最新列表。所以我可以为 HTTPSEverywhere Firefox Add-on 生成 xml 文件。所以这只是脚本的一部分。

小智 15

如果你没有安装wireshark,那么

tcpdumpdns=/tmp/tcpdumps
tcpdump -lvi any "udp port 53" | tee $tcpdumpdns
Run Code Online (Sandbox Code Playgroud)

应该为你工作。由于您想将输出限制为倒数第二个值,因此我将使用以下命令解析您的日志文件:

grep -E 'A\?' $tcpdumpdns |sed -e 's/^.*A? //' -e 's/ .*//'|sort -u
Run Code Online (Sandbox Code Playgroud)

如果你想让它活着,那么:

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

应该这样做,(这里 sed 和 awk 可以互换;我会选择 awk。)


use*_*686 13

使用 Wireshark:

tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"
Run Code Online (Sandbox Code Playgroud)

  • 为了解决@JackO'Connor 问题,A 型 DNS 记录的十进制值为 1。因此,这应该有效:`tshark -f "udp port 53" -Y "dns.qry.type == 1 and dns.flags .response == 0"` (3认同)
  • 我得到`tshark:在dns.qry.type的可能值中找不到“A”。` (2认同)