Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/GitHubGitHub/fenkohq/dnsmonster
Сниффинг и анализ пакетовСбор информацииСетевая безопасностьРазведка угрозАнализ DNSАнализ Журналов
GitHubfenkohq/dnsmonster

dnsmonster

Инструментарий для пассивного захвата и мониторинга DNS

Репозиторий
3606067 дней назадПроверено Kitploit
Сайт

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Build Status Go Version Latest Version License Open Issues

Мы изучаем возможность создания управляемого SaaS-решения для dnsmonster! Помогите сформировать будущее пассивного мониторинга DNS, поделившись своими отзывами и требованиями: Пройдите наш короткий опрос

Содержание

  • Dnsmonster
  • Основные возможности
  • Установка
    • Linux
      • Контейнер
      • Сборка вручную
      • Статическая сборка
    • Windows
    • FreeBSD и MacOS
  • Архитектура
    • Установка "всё в одном" с помощью Docker
Демо "всё в одном"
  • Развёртывание в корпоративной среде
  • Конфигурация
    • Параметры командной строки
    • Переменные окружения
    • Файл конфигурации
    • Какова политика хранения данных
  • Дискретизация и пропуск
    • Дискретизация на этапе предварительной обработки
    • Пропускаемые домены
    • Разрешённые домены
    • SAMPLE в запросах SELECT ClickHouse
  • Поддерживаемые источники данных
  • Поддерживаемые выходные каналы
  • План развития
  • Связанные проекты
  • Dnsmonster

    Фреймворк пассивного мониторинга DNS, написанный на Golang. dnsmonster реализует сниффер пакетов для DNS-трафика. Он может принимать трафик из файла pcap, с живого интерфейса или через сокет dnstap и способен индексировать и хранить сотни тысяч DNS-запросов в секунду: доказано, что на обычном компьютере он индексирует более 200 000 запросов в секунду. Инструмент ориентирован на масштабируемость, простоту и удобство использования, помогая командам безопасности понимать детали DNS-трафика предприятия. dnsmonster не стремится отслеживать DNS-диалоги; скорее, он индексирует DNS-пакеты по мере их поступления. Также он не нарушает конфиденциальность конечных пользователей, позволяя маскировать IP-адреса L3 (IPv4 и IPv6), что даёт возможность проводить анализ трендов на агрегированных данных без возможности связать запросы с конкретным пользователем. Пост в блоге

    Код до версии 1.x считается бета-версией и может содержать критические изменения. Пожалуйста, ознакомьтесь с примечаниями к каждому тегу, чтобы увидеть список возможных поломок между релизами и способы предотвращения потери данных.```mermaid graph TD subgraph Input B1["network input"] B2["pcap file"] B3["dnstap socket"] end

    root@kitploit:~
    subgraph "Process"
        C1["Sampling based of ratio"]
        C2["Packet Process"]
        C3["Dispatcher"]
        O11["Output1"]
        O12["Domain Skip (optional)"]
        O13["Domain Allow (optional)"]
        O21["Output2"]
        O22["Domain Skip (optional)"]
        O23["Domain Allow (optional)"]
        O31["Output3"]
        O32["Domain Skip (optional)"]
        O33["Domain Allow (optional)"]
    end
    
    B1 --> Process
    B2 --> Process
    B3 --> Process
    
    C1 --> C2
    C2 --> C3
    C3 --> O11
    C3 --> O21
    C3 --> O31
    
    O11 --> O12 --> O13
    O21 --> O22 --> O23
    O31 --> O32 --> O33
    
    subgraph Output
        Splunk
        Syslog
        H["ClickHouse"]
        Postgres
        Kafka
        I["JSON File"]
        Influx
        Elastic
        J["stdout"]
        Parquet
        Sentinel
    end
    
    O13 --> H
    O23 --> I
    O33 --> J
    
    root@kitploit:~
    # Основные возможности
    
    - Возможность использования `afpacket` и захвата пакетов с нулевым копированием в Linux.
    - Поддержка BPF
    - Возможность маскировки IP-адреса для повышения конфиденциальности
    - Возможность задания коэффициента предварительной выборки (sampling)
    - Возможность задания списка `fqdn` для пропуска, чтобы избежать записи определённых доменов/суффиксов/префиксов в хранилище
    - Возможность задания списка "разрешённых" доменов для логирования доступа к определённым доменам
    - «Горячая» перезагрузка файлов/ссылок со списками пропуска и разрешённых доменов
    - Модульный вывод с настраиваемой логикой для каждого потока вывода.
    - Автоматическая политика хранения данных с использованием атрибута TTL в ClickHouse
    - Встроенная панель Grafana для вывода в ClickHouse.
    - Возможность распространения в виде одного статически скомпонованного бинарного файла
    - Возможность настройки через переменные окружения, параметры командной строки или конфигурационный файл
    - Возможность семплирования (SAMPLE) результатов с помощью ClickHouse
    - Возможность отправки метрик через `prometheus` и `statstd`
    - Высокая степень сжатия благодаря встроенному хранилищу LZ4 в ClickHouse
    - Поддержка DNS поверх TCP, фрагментированного DNS (udp/tcp) и IPv6
    - Поддержка [dnstap](https://github.com/dnstap/golang-dnstap) через Unix-сокет или TCP
    - Встроенная интеграция с SIEM через Splunk и Microsoft Sentinel
    
    # Установка
    
    ## Linux
    
    Лучший способ начать работу с `dnsmonster` — загрузить бинарный файл из раздела релизов. Бинарный файл статически собран с использованием `musl`, поэтому он должен работать «из коробки» во многих дистрибутивах. Для поддержки `afpacket` необходимо использовать ядро версии 3.x+. Любой современный дистрибутив Linux (CentOS/RHEL 7+, Ubuntu 14.0.4.2+, Debian 7+) поставляется с версией ядра 3.x+, поэтому всё должно работать «из коробки». Если предварительно скомпилированная версия не работает в вашем дистрибутиве, пожалуйста, создайте issue с подробностями и соберите `dnsmonster` вручную, используя раздел [Сборка вручную](#build-manually).
    
    ### Контейнер
    
    Поскольку `dnsmonster` использует возможность захвата сырых пакетов, Docker/Podman демон должен предоставить контейнеру соответствующее разрешение (capability).```
    sudo docker run --rm -it --net=host --cap-add NET_RAW --cap-add NET_ADMIN --name dnsmonster ghcr.io/mosajjal/dnsmonster:latest --devName lo --stdoutOutputType=1
    

    Сборка вручную

    • с libpcap: Убедитесь, что у вас установлены пакеты go, libpcap-devel и linux-headers. Названия пакетов могут отличаться в зависимости от вашего дистрибутива. После этого просто клонируйте репозиторий и выполните `go build ./cmd/dnsmonster````sh git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster cd /tmp/dnsmonster go get go build -o dnsmonster ./cmd/dnsmonster
    root@kitploit:~
    - без `libpcap`:
    `dnsmonster` использует только одну функцию из `libpcap`, и это преобразование фильтров стиля `tcpdump` в байт-код BPF. Если вы можете обойтись без поддержки BPF, вы можете собрать `dnsmonster` без `libpcap`. Обратите внимание, что на любой другой платформе захват пакетов возвращается к `libpcap`, поэтому он становится жесткой зависимостью (*BSD, Windows, Darwin)```sh
    git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster 
    cd /tmp/dnsmonster
    go get
    go build -o dnsmonster -tags nolibpcap ./cmd/dnsmonster
    

    Приведённая выше сборка также работает на ARMv7 (RPi4) и AArch64.

    Статическая сборка

    Если у вас есть копия libpcap.a, вы можете собрать и статически прилинковать её к dnsmonster, получив полностью статическую сборку. В приведённом ниже коде, пожалуйста, измените /root/libpcap-1.9.1/libpcap.a на путь к вашей копии.``` git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster cd /tmp/dnsmonster/ go get go build --ldflags "-L /root/libpcap-1.9.1/libpcap.a -linkmode external -extldflags "-I/usr/include/libnl3 -lnl-genl-3 -lnl-3 -static"" -a -o dnsmonster ./cmd/dnsmonster

    root@kitploit:~
    Для получения дополнительной информации о том, как создается статически скомпонованный бинарный файл, обратитесь к этому [Dockerfile](https://github.com/fenkohq/dnsmonster/blob/main/Dockerfile).
    
    ## Windows
    
    Сборка в Windows во многом аналогична Linux. Просто убедитесь, что у вас установлен `npcap`. Клонируйте репозиторий (`--history 1` работает) и выполните `go get` и `go build ./cmd/dnsmonster`.
    
    Как упоминалось, релизная версия бинарного файла для Windows зависит от установленного [npcap](https://nmap.org/npcap/#download). После установки бинарный файл должен работать из коробки. Он был протестирован в среде Windows 10 и выполнялся без проблем. Чтобы найти имена интерфейсов для указания параметра `--devName` и начать перехват трафика, необходимо выполнить следующие действия:
    
      - откройте cmd.exe от имени администратора и выполните: `getmac.exe`, вы увидите таблицу с MAC-адресами ваших интерфейсов и столбец "Transport Name" с примерно таким содержимым: `\Device\Tcpip_{16000000-0000-0000-0000-145C4638064C}`
      - запустите `dnsmonster.exe` в `cmd.exe` следующим образом:```sh
    dnsmonster.exe --devName \Device\NPF_{16000000-0000-0000-0000-145C4638064C}
    

    Обратите внимание, что необходимо изменить \Tcpip из getmac.exe на \NPF, а затем передать его в dnsmonster.exe.

    FreeBSD и MacOS

    Во многом так же, как и в Linux и Windows, убедитесь, что у вас установлены git, libpcap и go, а затем следуйте тем же инструкциям:```sh git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster cd /tmp/dnsmonster go get go build -o dnsmonster ./cmd/dnsmonster

    root@kitploit:~
    # Архитектура
    
    ## Установка «всё в одном» с помощью Docker
    
    ![Базовая схема AIO](https://raw.githubusercontent.com/fenkohq/dnsmonster/HEAD/static/dnsmonster-basic.svg)
    
    В примере на схеме захватывается входящий/исходящий трафик DNS-сервера, после чего перед сервером DNSMonster добавляется опциональный уровень агрегации пакетов. Исходящие данные с DNS-серверов очень полезны для анализа кэша и производительности парка DNS. Если у вас нет агрегатора, вы можете подключить оба TAP напрямую к DNSMonster и запустить два агента DNSMonster, анализирующих трафик.
    
    Запуск `./autobuild.sh` создает несколько контейнеров:
    
    * несколько экземпляров `dnsmonster` для просмотра трафика на любом интерфейсе. Список интерфейсов будет запрошен в процессе выполнения `autobuild.sh`
    * экземпляр `clickhouse` для сбора вывода `dnsmonster` и сохранения всех журналов/данных в каталоги данных и журналов. Оба будут запрошены в процессе `autobuild.sh`
    * экземпляр `grafana`, смотрящий на данные `clickhouse` с предварительно созданной панелью мониторинга.
    
    ### Демонстрация All-in-one
    
    [![Демонстрация AIO](https://raw.githubusercontent.com/fenkohq/dnsmonster/HEAD/static/aio_demo.svg)](static/aio_demo.svg)
    
    ## Развертывание на предприятии
    
    ![Базовая схема Enterprise](https://raw.githubusercontent.com/fenkohq/dnsmonster/HEAD/static/dnsmonster-enterprise.svg)
    
    # Конфигурация
    
    DNSMonster можно настраивать тремя способами: параметрами командной строки, переменными окружения и файлом конфигурации. Порядок приоритета:
    
    - Параметры командной строки (регистронезависимые)
    - Переменные окружения (всегда в верхнем регистре)
    - Файл конфигурации (регистрозависимый, нижний регистр)
    - Значения по умолчанию (без конфигурации)
    
    ## Параметры командной строки
    
    Обратите внимание, что аргументы командной строки регистронезависимы начиная с v0.9.5
    
    [//]: <> (start of command line options)```sh
    # [capture]
    # Device used to capture
    --devname=
    
    # Pcap filename to run
    --pcapfile=
    
    # dnstap socket path. Example: unix:///tmp/dnstap.sock, tcp://127.0.0.1:8080
    --dnstapsocket=
    
    # Port selected to filter packets
    --port=53
    
    # Capture Sampling by a:b. eg sampleRatio of 1:100 will process 1 percent of the incoming packets
    --sampleratio=1:1
    
    # Cleans up packet hash table used for deduplication
    --dedupcleanupinterval=1m0s
    
    # Set the dnstap socket permission, only applicable when unix:// is used
    --dnstappermission=755
    
    # Number of routines used to handle received packets
    --packethandlercount=2
    
    # Size of the tcp assembler
    --tcpassemblychannelsize=10000
    
    # Size of the tcp result channel
    --tcpresultchannelsize=10000
    
    # Number of routines used to handle tcp packets
    --tcphandlercount=1
    
    # Size of the channel to send packets to be defragged
    --defraggerchannelsize=10000
    
    # Size of the channel where the defragged packets are returned
    --defraggerchannelreturnsize=10000
    
    # Size of the packet handler channel
    --packetchannelsize=1000
    
    # Afpacket Buffersize in MB
    --afpacketbuffersizemb=64
    
    # BPF filter applied to the packet stream. If port is selected, the packets will not be defragged.
    --filter=((ip and (ip[9] == 6 or ip[9] == 17)) or (ip6 and (ip6[6] == 17 or ip6[6] == 6 or ip6[6] == 44)))
    
    # Use AFPacket for live captures. Supported on Linux 3.0+ only
    --useafpacket
    
    # The PCAP capture does not contain ethernet frames
    --noetherframe
    
    # Deduplicate incoming packets, Only supported with --devName and --pcapFile. Experimental 
    --dedup
    
    # Do not put the interface in promiscuous mode
    --nopromiscuous
    
    # [clickhouse_output]
    # Address of the clickhouse database to save the results. multiple values can be provided.
    --clickhouseaddress=localhost:9000
    
    # Username to connect to the clickhouse database
    --clickhouseusername=
    
    # Password to connect to the clickhouse database
    --clickhousepassword=
    
    # Database to connect to the clickhouse database
    --clickhousedatabase=default
    
    # Table which data will be stored on clickhouse database
    --clickhousetable=DNS_LOG
    
    # Interval between sending results to ClickHouse. If non-0, Batch size is ignored and batch delay is used
    --clickhousedelay=0s
    
    # Clickhouse connection LZ4 compression level, 0 means no compression
    --clickhousecompress=0
    
    # Debug Clickhouse connection
    --clickhousedebug
    
    # Use TLS for Clickhouse connection
    --clickhousesecure
    
    # Save full packet query and response in JSON format.
    --clickhousesavefullquery
    
    # Use DNSTap identity field instead of ServerName for the identity field in ClickHouse
    --clickhouseusednstapidentity
    
    # What should be written to clickhouse. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --clickhouseoutputtype=0
    
    # Minimum capacity of the cache array used to send data to clickhouse. Set close to the queries per second received to prevent allocations
    --clickhousebatchsize=100000
    
    # Number of Clickhouse output Workers
    --clickhouseworkers=1
    
    # Channel Size for each Clickhouse Worker
    --clickhouseworkerchannelsize=100000
    
    # [elastic_output]
    # What should be written to elastic. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --elasticoutputtype=0
    
    # elastic endpoint address, example: http://127.0.0.1:9200. Used if elasticOutputType is not none
    --elasticoutputendpoint=
    
    # elastic index
    --elasticoutputindex=default
    
    # Send data to Elastic in batch sizes
    --elasticbatchsize=1000
    
    # Interval between sending results to Elastic if Batch size is not filled
    --elasticbatchdelay=1s
    
    # [file_output]
    # What should be written to file. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --fileoutputtype=0
    
    # Path to output folder. Used if fileoutputType is not none
    --fileoutputpath=
    
    # Interval to rotate the file in cron format
    --fileoutputrotatecron=0 0 * * *
    
    # Number of files to keep. 0 to disable rotation
    --fileoutputrotatecount=4
    
    # Output format for file. options:json, csv, csv_no_header, gotemplate. note that the csv splits the datetime format into multiple fields
    --fileoutputformat=json
    
    # Go Template to format the output as needed
    --fileoutputgotemplate={{.}}
    
    # [influx_output]
    # What should be written to influx. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --influxoutputtype=0
    
    # influx Server address, example: http://localhost:8086. Used if influxOutputType is not none
    --influxoutputserver=
    
    # Influx Server Auth Token
    --influxoutputtoken=dnsmonster
    
    # Influx Server Bucket
    --influxoutputbucket=dnsmonster
    
    # Influx Server Org
    --influxoutputorg=dnsmonster
    
    # Minimum capacity of the cache array used to send data to Influx
    --influxoutputworkers=8
    
    # Minimum capacity of the cache array used to send data to Influx
    --influxbatchsize=1000
    
    # [kafka_output]
    # What should be written to kafka. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --kafkaoutputtype=0
    
    # kafka broker address(es), example: 127.0.0.1:9092. Used if kafkaOutputType is not none
    --kafkaoutputbroker=
    
    # Kafka topic for logging
    --kafkaoutputtopic=dnsmonster
    
    # Minimum capacity of the cache array used to send data to Kafka
    --kafkabatchsize=1000
    
    # Output format. options:json, gob. 
    --kafkaoutputformat=json
    
    # Kafka connection timeout in seconds
    --kafkatimeout=3
    
    # Interval between sending results to Kafka if Batch size is not filled
    --kafkabatchdelay=1s
    
    # Compress Kafka connection
    --kafkacompress
    
    # Compression Type Kafka connection [snappy gzip lz4 zstd]; default(snappy).
    --kafkacompressiontype=snappy
    
    # Use TLS for kafka connection
    --kafkasecure
    
    # Path of CA certificate that signs Kafka broker certificate
    --kafkacacertificatepath=
    
    # Path of TLS certificate to present to broker
    --kafkatlscertificatepath=
    
    # Path of TLS certificate key
    --kafkatlskeypath=
    
    # [parquet_output]
    # What should be written to parquet file. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --parquetoutputtype=0
    
    # Path to output folder. Used if parquetoutputtype is not none
    --parquetoutputpath=
    
    # Number of records to write to parquet file before flushing
    --parquetflushbatchsize=10000
    
    # Number of workers to write to parquet file
    --parquetworkercount=4
    
    # Size of the write buffer in bytes
    --parquetwritebuffersize=256000
    
    # [psql_output]
    # What should be written to Microsoft Psql. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --psqloutputtype=0
    
    # Psql endpoint used. must be in uri format. example: postgres://username:password@hostname:port/database?sslmode=disable
    --psqlendpoint=
    
    # Psql table which data will be stored on database
    --psqltable=DNS_LOG
    
    # Number of PSQL workers
    --psqlworkers=1
    
    # Psql Batch Size
    --psqlbatchsize=1
    
    # Interval between sending results to Psql if Batch size is not filled. Any value larger than zero takes precedence over Batch Size
    --psqlbatchdelay=0s
    
    # Timeout for any INSERT operation before we consider them failed
    --psqlbatchtimeout=5s
    
    # Save full packet query and response in JSON format.
    --psqlsavefullquery
    
    # [sentinel_output]
    # What should be written to Microsoft Sentinel. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --sentineloutputtype=0
    
    # Sentinel Shared Key, either the primary or secondary, can be found in Agents Management page under Log Analytics workspace
    --sentineloutputsharedkey=
    
    # Sentinel Customer Id. can be found in Agents Management page under Log Analytics workspace
    --sentineloutputcustomerid=
    
    # Sentinel Output LogType
    --sentineloutputlogtype=dnsmonster
    
    # Sentinel Output Proxy in URI format
    --sentineloutputproxy=
    
    # Sentinel Batch Size
    --sentinelbatchsize=100
    
    # Interval between sending results to Sentinel if Batch size is not filled. Any value larger than zero takes precedence over Batch Size
    --sentinelbatchdelay=0s
    
    # [splunk_output]
    # What should be written to HEC. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --splunkoutputtype=0
    
    # splunk endpoint address, example: http://127.0.0.1:8088. Used if splunkOutputType is not none, can be specified multiple times for load balanace and HA
    --splunkoutputendpoint=
    
    # Splunk HEC Token
    --splunkoutputtoken=00000000-0000-0000-0000-000000000000
    
    # Splunk Output Index
    --splunkoutputindex=temp
    
    # Splunk Output Proxy in URI format
    --splunkoutputproxy=
    
    # Splunk Output Source
    --splunkoutputsource=dnsmonster
    
    # Splunk Output Sourcetype
    --splunkoutputsourcetype=json
    
    # Send data to HEC in batch sizes
    --splunkbatchsize=1000
    
    # Interval between sending results to HEC if Batch size is not filled
    --splunkbatchdelay=1s
    
    # [stdout_output]
    # What should be written to stdout. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --stdoutoutputtype=0
    
    # Output format for stdout. options:json,csv, csv_no_header, gotemplate. note that the csv splits the datetime format into multiple fields
    --stdoutoutputformat=json
    
    # Go Template to format the output as needed
    --stdoutoutputgotemplate={{.}}
    
    # Number of workers
    --stdoutoutputworkercount=8
    
    # [syslog_output]
    # What should be written to Syslog server. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --syslogoutputtype=0
    
    # Syslog endpoint address, example: udp://127.0.0.1:514, tcp://127.0.0.1:514. Used if syslogOutputType is not none
    --syslogoutputendpoint=udp://127.0.0.1:514
    
    # [victoria_output]
    # Victoria Output Endpoint. example: http://localhost:9428/insert/jsonline?_msg_field=rcode_id&_time_field=time
    --victoriaoutputendpoint=
    
    # What should be written to Microsoft Victoria. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --victoriaoutputtype=0
    
    # Victoria Output Proxy in URI format
    --victoriaoutputproxy=
    
    # Number of workers
    --victoriaoutputworkers=8
    
    # Victoria Batch Size
    --victoriabatchsize=100
    
    # Interval between sending results to Victoria if Batch size is not filled. Any value larger than zero takes precedence over Batch Size
    --victoriabatchdelay=0s
    
    # [zinc_output]
    # What should be written to zinc. options:
    #	0: Disable Output
    #	1: Enable Output without any filters
    #	2: Enable Output and apply skipdomains logic
    #	3: Enable Output and apply allowdomains logic
    #	4: Enable Output and apply both skip and allow domains logic
    --zincoutputtype=0
    
    # index used to save data in Zinc
    --zincoutputindex=dnsmonster
    
    # zinc endpoint address, example: http://127.0.0.1:9200/api/default/_bulk. Used if zincOutputType is not none
    --zincoutputendpoint=
    
    # zinc username, example: [email protected]. Used if zincOutputType is not none
    --zincoutputusername=
    
    # zinc password, example: password. Used if zincOutputType is not none
    --zincoutputpassword=
    
    # Send data to Zinc in batch sizes
    --zincbatchsize=1000
    
    # Interval between sending results to Zinc if Batch size is not filled
    --zincbatchdelay=1s
    
    # Zing request timeout
    --zinctimeout=10s
    
    # [general]
    # Garbage Collection interval for tcp assembly and ip defragmentation
    --gctime=10s
    
    # Duration to calculate interface stats
    --capturestatsdelay=1s
    
    # Mask IPv4s by bits. 32 means all the bits of IP is saved in DB
    --masksize4=32
    
    # Mask IPv6s by bits. 32 means all the bits of IP is saved in DB
    --masksize6=128
    
    # Name of the server used to index the metrics.
    --servername=default
    
    # Set debug Log format
    --logformat=text
    
    # Set debug Log level, 0:PANIC, 1:ERROR, 2:WARN, 3:INFO, 4:DEBUG
    --loglevel=3
    
    # Size of the result processor channel size
    --resultchannelsize=100000
    
    # write cpu profile to file
    --cpuprofile=
    
    # write memory profile to file
    --memprofile=
    
    # GOMAXPROCS variable
    --gomaxprocs=-1
    
    # Limit of packets logged to clickhouse every iteration. Default 0 (disabled)
    --packetlimit=0
    
    # Skip outputing domains matching items in the CSV file path. Can accept a URL (http:// or https://) or path
    --skipdomainsfile=
    
    # Hot-Reload skipdomainsfile interval
    --skipdomainsrefreshinterval=1m0s
    
    # Allow Domains logic input file. Can accept a URL (http:// or https://) or path
    --allowdomainsfile=
    
    # Hot-Reload allowdomainsfile file interval
    --allowdomainsrefreshinterval=1m0s
    
    # Skip TLS verification when making HTTPS connections
    --skiptlsverification
    
    # [metric]
    # Metric Endpoint Service
    --metricendpointtype=
    
    # Statsd endpoint. Example: 127.0.0.1:8125 
    --metricstatsdagent=
    
    # Prometheus Registry endpoint. Example: http://0.0.0.0:2112/metric
    --metricprometheusendpoint=
    
    # Format for  output.
    --metricformat=json
    
    # Interval between sending results to Metric Endpoint
    --metricflushinterval=10s
    

    Переменные окружения

    все флаги также могут быть установлены через переменные окружения. Имейте в виду, что имя каждого параметра всегда пишется в верхнем регистре, а префикс для всех переменных — "DNSMONSTER."

    Пример:```shell $ export DNSMONSTER_PORT=53 $ export DNSMONSTER_DEVNAME=lo $ sudo -E dnsmonster

    root@kitploit:~
    ## Файл конфигурации
    вы можете запустить `dnsmonster` с помощью следующей команды для использования файла конфигурации:```shell
    $ sudo dnsmonster --config=dnsmonster.ini
    
    # Or you can use environment variables to set the configuration file path
    $ export DNSMONSTER_CONFIG=dnsmonster.ini
    $ sudo -E dnsmonster
    

    Политика хранения данных

    Политика хранения данных по умолчанию для таблиц ClickHouse установлена на 30 дней. Вы можете изменить это число, собрав контейнеры с помощью ./autobuild.sh. Поскольку ClickHouse не имеет внутренней временной метки, TTL будет ориентироваться на дату входящего пакета в файлах pcap. Поэтому при импорте старых файлов pcap ClickHouse может автоматически начинать удалять данные по мере их записи, и вы не увидите никаких реальных данных в вашей Grafana. Чтобы это исправить, вы можете изменить TTL на день, более старый, чем самый ранний пакет в файле PCAP.

    ПРИМЕЧАНИЕ: чтобы изменить TTL в любой момент времени, необходимо напрямую подключиться к серверу Clickhouse с помощью клиента clickhouse и выполнить следующий SQL-запрос (в этом примере он изменяется с 30 на 90 дней):```sql ALTER TABLE DNS_LOG MODIFY TTL DnsDate + INTERVAL 90 DAY;`

    root@kitploit:~
    ПРИМЕЧАНИЕ: Вышеуказанная команда изменяет TTL только для необработанных данных журнала DNS, которые составляют основную часть потребления вашей емкости. Чтобы убедиться, что вы изменили TTL для каждой отдельной таблицы агрегации, вы можете выполнить следующее:```sql
    ALTER TABLE DNS_LOG MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_DOMAIN_COUNT` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_DOMAIN_UNIQUE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_PROTOCOL` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_GENERAL_AGGREGATIONS` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_EDNS` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_OPCODE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_TYPE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_CLASS` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_RESPONSECODE` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    ALTER TABLE `.inner.DNS_SRCIP_MASK` MODIFY TTL DnsDate + INTERVAL 90 DAY;
    

    UPDATE: в последней версии clickhouse внутренние таблицы .inner имеют другие имена, не совпадающие с соответствующими представлениями агрегации. Чтобы изменить TTL, необходимо найти имена таблиц в формате UUID с помощью SHOW TABLES и повторить команду ALTER с этими UUID.

    Сэмплирование и пропуск

    предварительное сэмплирование

    dnsmonster поддерживает предварительное сэмплирование пакетов с помощью простого параметра: sampleRatio. Этот параметр принимает «соотношение», например 1:2. 1:2 означает, что из каждых 2 прибывающих пакетов обрабатывается только один (50% сэмплирование). Обратите внимание, что это сэмплирование происходит ПОСЛЕ фильтров bpf, а не до них. Если у вас возникают проблемы с поддержанием объёма вашего DNS-трафика, вы можете установить, например, 2:10, что означает, что 20% пакетов, прошедших ваш фильтр bpf, будут обработаны dnsmonster.

    пропуск доменов

    dnsmonster поддерживает постобработку списка пропуска доменов, чтобы избежать записи зашумлённых повторяющихся данных в базу данных. Список пропуска доменов — это файл в формате csv, содержащий только два столбца: строку и логику для этой строки. dnsmonster поддерживает три логики: prefix, suffix и fqdn. prefix и suffix означают, что будут пропущены только домены, начинающиеся/заканчивающиеся указанной строкой, и они не будут записаны в БД. Обратите внимание, что поскольку обработка выполняется над DNS-запросами, ваша строка, скорее всего, будет иметь завершающую точку ., которую также необходимо включить в строку списка пропуска (посмотрите skipdomains.csv.sample для наглядности). Вы также можете использовать полное совпадение полного доменного имени (FQDN), чтобы избежать записи сильно зашумлённых полных доменных имён в вашу базу данных.

    разрешённые домены

    dnsmonster поддерживает концепцию разрешённых доменов (allowdomains), которая помогает строить детекцию, если определённые FQDN, префиксы или суффиксы присутствуют в DNS-трафике. Учитывая, что dnsmonster поддерживает несколько выходных потоков с разной логикой для каждого из них, можно собирать весь DNS-трафик в ClickHouse, но записывать только домены из разрешённого списка в stdout или в файл в том же экземпляре dnsmonster.

    SAMPLE в запросах SELECT в Clickhouse

    По умолчанию основные таблицы, созданные файлом tables.sql (DNS_LOG), имеют возможность сэмплирования результата по мере необходимости, поскольку каждый DNS-запрос имеет связанный с ним полууникальный UUID. Для получения дополнительной информации о запросах SAMPLE в Clickhouse, пожалуйста, ознакомьтесь с этим документом.

    Поддерживаемые источники

    • Захват в реальном времени через libpcap/ncap (поддерживается Ethernet и raw IP)
    • Захват в реальном времени через afpacket (поддерживается Ethernet и raw IP)
    • Dnstap сокет (режим прослушивания)
    • Pcap файл (кадр Ethernet)

    ПРИМЕЧАНИЕ: если ваш pcap файл был захвачен одним из мета-интерфейсов Linux (например, tcpdump -i any), dnsmonster не сможет прочитать из него кадр Ethernet, поскольку он отсутствует. Вы можете использовать инструмент, например tcprewrite, чтобы преобразовать pcap файл в Ethernet.

    Поддерживаемые выходные каналы

    • Clickhouse
    • Kafka
    • Elasticsearch
    • Splunk HEC
    • Stdout
    • File
    • Syslog (только Linux)
    • Microsoft Sentinel
    • InfluxDB

    План развития

    • Возможность понижающего сэмплирования для запросов SELECT
    • Добавление поддержки afpacket
    • Опция конфигурационного файла
    • Исключение FQDN из индексации
    • Белый список FQDN для логирования только определённых доменов
    • Поддержка dnstap
    • Поддержка вывода в Kafka
    • Возможность загрузки allowDomains и skipDomains через HTTP(S) конечные точки
    • Поддержка вывода в Elasticsearch
    • Поддержка вывода в Splunk HEC
    • Поддержка вывода в Syslog
    • Улучшение производительности панели Grafana
    • Удаление зависимости libpcap и переход на pcapgo для обработки пакетов
    • Подготовка данных для использования в машинном обучении и обнаружении аномалий
    • Поддержка дедупликации (в процессе)
    • Опциональный SSL для Clickhouse
    • Поддержка statsd и Prometheus
    • Панель Splunk
    • Панель Kibana
    • Инструмент версионирования и миграции Clickhouse
    • Тесты и бенчмарки

    Связанные проекты

    • dnszeppelin
    • passivedns
    • gopassivedns
    • packetbeat

    Спонсоры

    SignPathБесплатная подпись кода на Windows предоставлена signpath.io, сертификат от SignPath Foundation
    Скачать инструмент