Вопрос или проблема
Как я могу создать логи всех DNS-запросов, которые делает мой компьютер, вместе с ответами, которые он получает?
Вы можете использовать tcpdump
для логирования всей активности UDP и TCP на порту 53.
Чтобы показать и сохранить в файл все A
DNS-запросы, выполните это:
script -q -c "sudo tcpdump -l port 53 2>/dev/null | grep --line-buffered ' A? ' | cut -d' ' -f8" | tee dns.log
Пример вывода:
google.com.
wikipedia.org.
ОБНОВЛЕНИЕ (2023):
формат вывода tcpdump
изменился; имя домена теперь в поле #9, а не #8.
Исправленная однострочная команда:
script -q -c "sudo tcpdump -l port 53 2>/dev/null | grep --line-buffered ' A? ' | cut -d' ' -f9" | tee dns.log
Самый простой способ – установить Bind локально. Большинство дистрибутивов по умолчанию устанавливают Bind как неавторитетный кэш-сервер.
Просто добавьте блок конфигурации logging {}
(как описано в Справочнике по конфигурации Bind 9), затем настройте вашу систему на использование 127.0.0.1
или ::1
в качестве DNS-резольвера.
dnsmasq гораздо проще настраивать как DNS-агрегатор/кэш-демон, чем BIND, и для этой цели производительность может быть даже лучше. Если вы увеличите уровень логирования до “debug”, все запросы и ответы появятся в том, что syslog
настроен для отладочных сообщений.
Dnsmasq также облегчает избавление от злоупотребляющих рекламодателей и нарушителей конфиденциальности, “аналитиков”, путем создания алиасов для целых доменов на 127.0.0.1.
Одним из простых способов фильтрации DNS для запросов, которые вас интересуют, является использование grep -A 2
, где -A указывает количество строк, которые следуют после совпадения. Если сервер генерирует много DNS-запросов, увеличьте значение с 2 до 4-5.
tcpdump -l port 53 | grep -A 2 redis
вторая строка будет содержать ответ от DNS -> IP, CNAME, none, другое.
Если я правильно помню, Snort может избирательно отслеживать трафик на основе пользовательских правил. Однако Snort не будет создавать логи для DNS-запросов, когда ваш компьютер, т.е. его резольвер, может ответить на запрос из своего кэша.
Пожалуйста, попробуйте PassiveDNS – инструмент для пассивного сбора записей DNS для помощи в обработке инцидентов, мониторинге сетевой безопасности (NSM) и общей цифровой криминалистике.
Чтобы упростить использование, я создал образ Docker под названием vimagick/passivedns
version: "3.8"
services:
passivedns:
image: vimagick/passivedns
command: >
-d "||"
-i eth0
-l /var/log/passivedns/passivedns.log
-L /var/log/passivedns/passivedns-nx.log
-p /var/run/passivedns.pid
-P 86400
-S 256
-X 46CDNOPRSTMnx
volumes:
- ./data:/var/log/passivedns
network_mode: host
privileged: true
restart: unless-stopped
Запустите:
# предположим, что ваше имя интерфейса - eth0
$ ifconfig eth0
$ mkdir passivedns
$ cd passivedns
# вставьте содержимое yaml здесь
$ vim docker-compose.yml
$ docker compose up -d
$ tail -f data/passivedns.log
Пример вывода:
#timestamp||dns-client ||dns-server||RR класс||Запрос||Тип запроса||Ответ||TTL||Количество
1322849924.408856||10.1.1.1||8.8.8.8||IN||upload.youtube.com.||A||74.125.43.117||46587||5
1322849924.408857||10.1.1.1||8.8.8.8||IN||upload.youtube.com.||A||74.125.43.116||420509||5
1322849924.408858||10.1.1.1||8.8.8.8||IN||www.adobe.com.||CNAME||www.wip4.adobe.com.||43200||8
1322849924.408859||10.1.1.1||8.8.8.8||IN||www.adobe.com.||A||193.104.215.61||43200||8
1322849924.408860||10.1.1.1||8.8.8.8||IN||i1.ytimg.com.||CNAME||ytimg.l.google.com.||43200||3
1322849924.408861||10.1.1.1||8.8.8.8||IN||clients1.google.com.||A||173.194.32.3||43200||2
tshark
отлично работает для меня. Я просто хочу взглянуть на то, какие домены были посещены.
sudo apt install tshark
Попробуйте:
sudo tshark -i any -Y 'dns.qry.name' -T fields -e dns.qry.name
Вывод выглядит так:
twitter.com
twitter.com
twitter.com
twitter.com
twitter.com
twitter.com
twitter.com
twitter.com
x.com
x.com
x.com
x.com
x.com
x.com
x.com
x.com
abs.twimg.com
abs.twimg.com
abs.twimg.com
abs.twimg.com
abs.twimg.com
abs.twimg.com
twimg.twitter.map.fastly.net
abs.twimg.com
twimg.twitter.map.fastly.net
abs.twimg.com
abs.vstack.com
abs.stack.com
abs.vstack.com
twimg.twitter.map.fastly.net
twimg.twitter.map.fastly.net
abs.twimg.com
abs.twimg.com
abs.twimg.com
abs.twimg.com
twimg.twitter.map.fastly.net
twimg.twitter.map.fastly.net
abs.twimg.com
abs-0.twimg.com
abs-0.twimg.com
abs-0.twimg.com
abs-0.twimg.com
abs-0.twimg.com
abs-0.twimg.com
abs-zero.twimg.com
abs-0tweet.com
abs-zero.PNG
Инструмент, написанный Юлией Эванс на Rust, под названием dnspeep, довольно хорош.
Шпионите за DNS-запросами, которые делает ваш компьютер
https://jvns.ca/blog/2021/03/31/dnspeep-tool/
https://github.com/jvns/dnspeep
git clone [email protected]:jvns/dnspeep.git
cd dnspeep
cargo build --release
sudo cp ./target/release/dnspeep /usr/local/bin
выше показано, как скомпилировать исходный код Юлии на Rust… бинарный файл также доступен.
пример вывода
sudo dnspeep
имя запроса IP сервера ответ
A mozilla.cloudflare-dns.com. 127.0.0.53 A: 172.64.41.4, A: 162.159.61.4
AAAA mozilla.cloudflare-dns.com. 127.0.0.53 AAAA: 2803:f800:53::4, AAAA: 2a06:98c1:52::4
A mozilla.cloudflare-dns.com. 1.1.1.1 A: 162.159.61.4, A: 172.64.41.4
AAAA mozilla.cloudflare-dns.com. 1.1.1.1 AAAA: 2a06:98c1:52::4, AAAA: 2803:f800:53::4
AAAA mozilla.cloudflare-dns.com. 1.1.1.1 AAAA: 2803:f800:53::4, AAAA: 2a06:98c1:52::4
A mozilla.cloudflare-dns.com. 1.1.1.1 A: 172.64.41.4, A: 162.159.61.4
AAAA connectivity-check.ubuntu.com. 192.168.1.1 AAAA: 2620:2d:4002:1::196, AAAA: 2620:2d:4002:1::197, AAAA: 2620:2d:4000:1::97, AAAA: 2620:2d:4000:1::2b, AAAA: 2620:2d:4002:1::198, AAAA: 2620:2d:4000:1::96, AAAA: 2620:2d:4000:1::22, AAAA: 2620:2d:4000:1::2a, AAAA: 2620:2d:4000:1::23, AAAA: 2001:67c:1562::23, AAAA: 2620:2d:4000:1::98, AAAA: 2001:67c:1562::24
AAAA connectivity-check.ubuntu.com. 1.1.1.1 AAAA: 2620:2d:4000:1::2a, AAAA: 2620:2d:4002:1::197, AAAA: 2001:67c:1562::24, AAAA: 2620:2d:4000:1::98, AAAA: 2620:2d:4002:1::198, AAAA: 2620:2d:4002:1::196, AAAA: 2620:2d:4000:1::96, AAAA: 2620:2d:4000:1::2b, AAAA: 2620:2d:4000:1::97, AAAA: 2620:2d:4000:1::23, AAAA: 2620:2d:4000:1::22, AAAA: 2001:67c:1562::23
AAAA connectivity-check.ubuntu.com. 1.1.1.1 <нет ответа>
AAAA rumble.com. 192.168.1.1 NOERROR
A rumble.com. 192.168.1.1 A: 205.220.231.24
Ответ или решение
Чтобы создать журнал всех DNS-запросов, которые выполняет ваш компьютер, вместе с ответами, вам доступны различные подходы и инструменты. В этом ответе мы рассмотрим наиболее эффективные методы и инструменты для логирования DNS-запросов.
1. Использование tcpdump
tcpdump
— это утилита для захвата сетевых пакетов, которая может быть использована для записи всех DNS-запросов и ответов, отправляемых и получаемых вашим компьютером:
script -q -c "sudo tcpdump -l port 53 2>/dev/null | grep --line-buffered ' A? ' | cut -d' ' -f9" | tee dns.log
Пояснения:
tcpdump -l port 53
— захватывает пакеты, связанные с DNS (порт 53).grep --line-buffered ' A? '
— фильтрует DNS-запросы типа A (адреса).cut -d' ' -f9
— извлекает имя домена из выходного потока.tee dns.log
— одновременно выводит результаты в терминал и сохраняет их в файлdns.log
.
2. Установка и настройка BIND
Если вам нужен более комплексный подход, вы можете установить BIND
(Berkeley Internet Name Domain):
- Установите BIND на вашем компьютере.
- Настройте его как кэшируемый DNS-сервер, добавив блок конфигурации
logging
в файлnamed.conf
. - Настройте вашу систему использовать
127.0.0.1
как DNS-резолвер.
Пример блока конфигурации для журналирования:
logging {
channel default_log {
file "data/named.log";
severity info;
print-time yes;
};
category default { default_log; };
};
3. Использование dnsmasq
dnsmasq
— это простой в настройке DNS-агрегатор и кэш-сервер:
- Установите
dnsmasq
. - Настройте логирование, изменив файл конфигурации, чтобы весь вывод шёл в
syslog
.
Это отличный вариант для пользователей, которые хотят просто и эффективно отслеживать DNS-запросы.
4. PassiveDNS
Для более продвинутого мониторинга вы можете попробовать PassiveDNS
— инструмент, который собирает записи DNS:
-
Установите
PassiveDNS
через Docker:version: "3.8" services: passivedns: image: vimagick/passivedns command: > -d "||" -i eth0 -l /var/log/passivedns/passivedns.log -L /var/log/passivedns/passivedns-nx.log -p /var/run/passivedns.pid -P 86400 -S 256 -X 46CDNOPRSTMnx volumes: - ./data:/var/log/passivedns network_mode: host privileged: true restart: unless-stopped
-
Запустите контейнер и следите за логами:
docker compose up -d tail -f data/passivedns.log
5. tshark
tshark
— это утилита командной строки для анализа трафика, аналогичная Wireshark:
sudo tshark -i any -Y 'dns.qry.name' -T fields -e dns.qry.name
Эта команда будет выводить все запросы к DNS в реальном времени.
6. Использование dnspeep
Еще одним удобным инструментом является dnspeep
, который позволяет отслеживать DNS-запросы:
- Установите
dnspeep
:git clone https://github.com/jvns/dnspeep.git cd dnspeep cargo build --release sudo cp ./target/release/dnspeep /usr/local/bin
- Запустите:
sudo dnspeep
Этот инструмент позволит вам увидеть все DNS-запросы вместе с ответами.
Итоги
Существует множество способов и инструментов для логирования DNS-запросов. Выбор метода зависит от ваших конкретных нужд: простоты, глубины анализа или скорости реализации. Будь то использование tcpdump
, установка BIND
, dnsmasq
, PassiveDNS
, tshark
или dnspeep
, все они предоставляют функциональные возможности для мониторинга DNS-запросов.
Если вам нужны дополнительные консультации, не стесняйтесь обращаться за помощью!