Wie sammle ich Anfragen für DNS A-Einträge?

15

Ich muss alle ausgehenden AAufzeichnungen auf einem RedHat-PC aufzeichnen. Ich habe versucht mit tcpdump:

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

Es erstellt eine Ausgabedatei wie folgt:

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

Also muss ich das verarbeiten, um Folgendes zu erhalten yahoo.com:

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

Gibt es eine bessere Lösung, um alle ausgehenden ADatensatzanforderungen zu erfassen?

PS: Sammeln von DNS-A-Einträgen ist nur erforderlich, um eine aktuelle Liste der Websites zu haben, die über HTTPS erreichbar sind. So kann ich XML-Dateien für das HTTPSEverywhere Firefox-Add-on generieren. Das ist also nur ein Teil eines Skripts.

LanceBaynes
quelle
Was stimmt nicht mit der von Ihnen bereitgestellten Lösung?
Michael Mrozek
Haben Sie eine GUI-Umgebung, wenn dies der Fall ist, ist die Verwendung von wireshark-gtk eine einfachere Lösung, da Sie dort sehr leicht filtern können.
Hanan N.
@ Hanan N .: GUI ist keine Option. Dies muss automatisch erfolgen.
LanceBaynes
@Michael Mrozek: Ich hoffe nichts. Aber ich habe gefragt, weil ich offen für alternative Lösungen bin.
LanceBaynes

Antworten:

12

Verwenden Sie Wireshark:

tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"
user1686
quelle
2
Ich bekommetshark: "A" cannot be found among the possible values for dns.qry.type.
Jack O'Connor
3
Um das Problem mit @ JackO'Connor zu beheben, lautet der Dezimalwert für einen DNS-Eintrag des Typs A 1. Daher sollte dies funktionieren:tshark -f "udp port 53" -Y "dns.qry.type == 1 and dns.flags.response == 0"
Rolinh
13

Wenn Sie kein Wireshark installiert haben

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

sollte für Sie arbeiten. Da Sie die Ausgabe auf den vorletzten Wert beschränken wollten, analysierte ich Ihre Protokolldatei mit:

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

Wenn du es live haben willst:

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

sollte es tun, (hier sind sed und awk austauschbar; und ich würde awk auswählen.)

Alexx Roche
quelle
grep -E 'A\?' $tcpdumpdns |sed 's/^.*A? //;s/ .*//'|sort -uist weniger zu tippen
Alexx Roche