Как собирать DNS-запросы на запись?

15

Мне нужно записать все исходящие Aзаписи на ПК RedHat. Я пытался с помощью tcpdump:

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

Это делает выходной файл как:

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

Поэтому мне нужно обработать это, чтобы получить yahoo.com:

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

Есть ли лучшее решение для сбора всех исходящих Aзапросов на запись?

ps: сбор DNS. Записи A необходимы только для того, чтобы иметь актуальный список веб-сайтов, доступных через HTTPS. Поэтому я могу создавать XML-файлы для HTTPSEverywhere Firefox Add-on. Так что это всего лишь часть сценария.

LanceBaynes
источник
Что не так с решением, которое вы предоставили?
Михаил Мрозек
У вас есть графический интерфейс, если это так, использование wireshark-gtk является более простым решением, поскольку вы можете легко фильтровать его.
Ханан Н.
@ Ханан N .: GUI не вариант. это нужно, чтобы быть автоматическим.
LanceBaynes
@Michael Mrozek: Я ничего не надеюсь. Но я спросил, потому что я открыт для альтернативных решений.
LanceBaynes

Ответы:

12

Используйте Wireshark:

tshark -f "udp port 53" -Y "dns.qry.type == A and dns.flags.response == 0"
user1686
источник
2
Я получаюtshark: "A" cannot be found among the possible values for dns.qry.type.
Джек О'Коннор
3
Для решения проблемы @ JackO'Connor десятичное значение для DNS-записи типа A равно 1. Поэтому это должно работать:tshark -f "udp port 53" -Y "dns.qry.type == 1 and dns.flags.response == 0"
Rolinh
13

Если у вас не установлен Wireshark, то

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

должен работать на вас. Поскольку вы хотите ограничить вывод значением от второго до последнего, я бы проанализировал ваш файл журнала с помощью:

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

Если ты хочешь это жить тогда:

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

должен сделать это (здесь sed и awk взаимозаменяемы; я бы выбрал awk.)

Алекс Рош
источник
grep -E 'A\?' $tcpdumpdns |sed 's/^.*A? //;s/ .*//'|sort -uменьше набирать
Алекс Роше