Jak gromadzić żądania rekordów DNS A?

15

Muszę nagrać wszystkie wychodzące Azapisy na komputerze RedHat. Próbowałem użyć tcpdump:

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

Tworzy plik wyjściowy, taki jak:

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

Więc muszę to przetworzyć, aby uzyskać yahoo.com:

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

Czy jest jakieś lepsze rozwiązanie, aby zebrać wszystkie wychodzące Ażądania rekordów?

ps: zbieranie DNS Rekordy są potrzebne tylko do posiadania aktualnej listy stron internetowych, które są dostępne za pośrednictwem HTTPS. Mogę więc generować pliki xml dla HTTPS w każdym miejscu dodatku do Firefoksa. To tylko część skryptu.

LanceBaynes
źródło
Co jest nie tak z dostarczonym rozwiązaniem?
Michael Mrozek
czy masz GUI env, jeśli tak, użycie wireshark-gtk jest łatwiejszym rozwiązaniem, ponieważ możesz tam filtrować znacznie łatwiej.
Hanan N.,
@ Hanan N .: GUI nie jest opcją. musi to być automatyczne.
LanceBaynes,
@Michael Mrozek: Mam nadzieję, że nic. Ale zapytałem, bo jestem otwarty na alternatywne rozwiązania.
LanceBaynes,

Odpowiedzi:

12

Użyj Wireshark:

tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"
użytkownik1686
źródło
2
Rozumiemtshark: "A" cannot be found among the possible values for dns.qry.type.
Jack O'Connor,
3
Aby rozwiązać problem @ JackO'Connor, wartość dziesiętna dla rekordu DNS typu A wynosi 1. Dlatego powinno to działać:tshark -f "udp port 53" -Y "dns.qry.type == 1 and dns.flags.response == 0"
Rolinh
13

Jeśli nie masz zainstalowanego Wireshark, to

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

powinien pracować dla ciebie. Gdybyś chciał ograniczyć wynik do drugiej do ostatniej wartości, przeanalizowałbym twój plik dziennika z:

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

Jeśli chcesz na żywo:

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

powinienem to zrobić (tutaj sed i awk są wymienne; i wybrałbym awk.)

Alexx Roche
źródło
grep -E 'A\?' $tcpdumpdns |sed 's/^.*A? //;s/ .*//'|sort -ujest mniej do pisania
Alexx Roche,