Como reunir solicitações de registro DNS A?

15

Preciso gravar todos os Aregistros de saída em um PC RedHat. Eu tentei usar tcpdump:

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

Faz um arquivo de saída como:

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

Então, eu preciso processar isso para obter o yahoo.com:

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

Existe alguma solução melhor para reunir todas as Asolicitações de registro de saída ?

ps: coletando registros DNS A é necessário apenas para ter uma lista atualizada de sites acessíveis através de HTTPS. Para que eu possa gerar arquivos xml para o complemento HTTPSEverywhere Firefox. Portanto, isso é apenas parte de um script.

LanceBaynes
fonte
O que há de errado com a solução que você forneceu?
Michael Mrozek
você tem um ambiente de GUI, se assim for, usar o wireshark-gtk é uma solução mais fácil, pois é possível filtrá-lo com muita facilidade.
Hanan N.
@ Hanan N .: GUI não é uma opção. isso é necessário para ser automático.
LanceBaynes
@ Michael Mrozek: Não espero nada. Mas perguntei porque estou aberto a soluções alternativas.
LanceBaynes

Respostas:

12

Use o Wireshark:

tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"
user1686
fonte
2
Eu recebotshark: "A" cannot be found among the possible values for dns.qry.type.
Jack O'Connor
3
Para solucionar o problema @ JackO'Connor, o valor decimal para um registro DNS do tipo A é 1. Portanto, isso deve funcionar:tshark -f "udp port 53" -Y "dns.qry.type == 1 and dns.flags.response == 0"
Rolinh 14/17/17/17
13

Se você não possui o wireshark instalado,

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

deve funcionar para você. Como você queria limitar a saída do penúltimo para o último valor, analisaria seu arquivo de log com:

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

Se você deseja que ele viva, então:

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

deve fazê-lo (aqui sed e awk são intercambiáveis; e eu escolheria awk.)

Alexx Roche
fonte
grep -E 'A\?' $tcpdumpdns |sed 's/^.*A? //;s/ .*//'|sort -ué menos para digitar #
Alexx Roche