¿Cómo reunir las solicitudes de registro DNS A?

15

Necesito registrar todos los Aregistros salientes en una PC RedHat. Intenté usar tcpdump:

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

Crea un archivo de salida como:

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

Entonces necesito procesar eso para obtener yahoo.com:

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

¿Existe alguna solución mejor para reunir todas las Asolicitudes de registros salientes ?

ps: la recopilación de registros DNS A solo es necesaria para tener una lista actualizada de sitios web a los que se pueda acceder a través de HTTPS. Entonces puedo generar archivos xml para HTTPSEverywhere Firefox Add-on. Entonces esto es solo una parte de un guión.

LanceBaynes
fuente
¿Qué tiene de malo la solución que proporcionó?
Michael Mrozek
¿tiene una interfaz gráfica de usuario GUI, si es así, utilizando wireshark-gtk es una solución más fácil, ya que puede filtrar allí con mucha facilidad.
Hanan N.
@Hanan N .: GUI no es una opción. Esto es necesario para ser automático.
LanceBaynes
@Michael Mrozek: espero que nada. Pero pregunté porque estoy abierto a soluciones alternativas.
LanceBaynes

Respuestas:

12

Usa Wireshark:

tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"
usuario1686
fuente
2
Me saletshark: "A" cannot be found among the possible values for dns.qry.type.
Jack O'Connor
3
Para abordar el problema de @ JackO'Connor, el valor decimal para un registro DNS tipo A es 1. Por lo tanto, esto debería funcionar:tshark -f "udp port 53" -Y "dns.qry.type == 1 and dns.flags.response == 0"
Rolinh
13

Si no tienes cables instalados, entonces

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

debería funcionar para ti. Como deseaba limitar la salida al penúltimo valor, analizaría su archivo de registro con:

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

Si lo quieres en vivo, entonces:

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

debería hacerlo, (aquí sed y awk son intercambiables; y elegiría awk).

Alexx Roche
fuente
grep -E 'A\?' $tcpdumpdns |sed 's/^.*A? //;s/ .*//'|sort -ues menos para escribir
Alexx Roche