Как зафиксировать все мои DNS-запросы?

Вопрос или проблема

Как я могу создать логи всех 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):

  1. Установите BIND на вашем компьютере.
  2. Настройте его как кэшируемый DNS-сервер, добавив блок конфигурации logging в файл named.conf.
  3. Настройте вашу систему использовать 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-агрегатор и кэш-сервер:

  1. Установите dnsmasq.
  2. Настройте логирование, изменив файл конфигурации, чтобы весь вывод шёл в syslog.

Это отличный вариант для пользователей, которые хотят просто и эффективно отслеживать DNS-запросы.

4. PassiveDNS

Для более продвинутого мониторинга вы можете попробовать PassiveDNS — инструмент, который собирает записи DNS:

  1. Установите 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
  2. Запустите контейнер и следите за логами:

    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-запросы:

  1. Установите dnspeep:
    git clone https://github.com/jvns/dnspeep.git
    cd dnspeep
    cargo build --release
    sudo cp ./target/release/dnspeep /usr/local/bin
  2. Запустите:
    sudo dnspeep

Этот инструмент позволит вам увидеть все DNS-запросы вместе с ответами.

Итоги

Существует множество способов и инструментов для логирования DNS-запросов. Выбор метода зависит от ваших конкретных нужд: простоты, глубины анализа или скорости реализации. Будь то использование tcpdump, установка BIND, dnsmasq, PassiveDNS, tshark или dnspeep, все они предоставляют функциональные возможности для мониторинга DNS-запросов.

Если вам нужны дополнительные консультации, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...