
Kit de Captura e Monitoramento Passivo de DNS
Estamos explorando uma solução SaaS gerenciada para o dnsmonster! Ajude a moldar o futuro do monitoramento passivo de DNS compartilhando seu feedback e requisitos: Participe da nossa pesquisa rápida
Índice
Framework de monitoramento passivo de DNS construído em Golang.
dnsmonster implementa um farejador de pacotes para tráfego DNS. Ele pode aceitar tráfego de um arquivo pcap, uma interface ativa ou um socket dnstap,
e pode ser usado para indexar e armazenar centenas de milhares de consultas DNS por segundo, pois mostrou-se capaz de indexar mais de 200 mil consultas DNS por segundo em um computador comum. Ele visa ser escalável, simples e fácil de usar, e ajudar
equipes de segurança a entender os detalhes sobre o tráfego DNS de uma empresa. O dnsmonster não busca seguir conversas DNS, mas sim indexar pacotes DNS assim que eles chegam. Ele também não visa violar a privacidade dos usuários finais, com a capacidade de mascarar IPs de Camada 3 (IPv4 e IPv6), permitindo que as equipes realizem análises de tendências em dados agregados sem conseguir rastrear as consultas até um indivíduo. Blogpost
O código anterior à versão 1.x é considerado de qualidade beta e está sujeito a mudanças significativas. Visite as notas de versão de cada tag para ver a lista de cenários de quebra entre cada versão e como mitigar possíveis perdas de dados.```mermaid graph TD subgraph Input B1["network input"] B2["pcap file"] B3["dnstap socket"] end
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
# Principais funcionalidades
- Capacidade de usar a captura de pacotes `afpacket` e de cópia zero do Linux.
- Suporta BPF
- Capacidade de mascarar o endereço IP para melhorar a privacidade
- Capacidade de ter uma taxa de amostragem de pré-processamento
- Capacidade de ter uma lista de 'skip' `fqdn`s para evitar escrever alguns domínios/sufixos/prefixos no armazenamento
- Capacidade de ter uma lista de domínios 'allow', usada para registrar acesso a determinados domínios
- Recarga a quente de arquivos/urls de domínios skip e allow
- Saída modular com lógica configurável por fluxo de saída.
- Política automática de retenção de dados usando o atributo TTL do ClickHouse
- Painel Grafana integrado para saída do ClickHouse.
- Capacidade de ser distribuído como um binário único, vinculado estaticamente
- Capacidade de ser configurado usando variáveis de ambiente, opções de linha de comando ou arquivo de configuração
- Capacidade de amostrar saídas usando a capacidade SAMPLE do ClickHouse
- Capacidade de enviar métricas usando `prometheus` e `statstd`
- Alta taxa de compressão graças ao armazenamento LZ4 integrado do ClickHouse
- Suporta DNS sobre TCP, DNS Fragmentado (udp/tcp) e IPv6
- Suporta [dnstap](https://github.com/dnstap/golang-dnstap) via soquete Unix ou TCP
- Integração SIEM integrada com Splunk e Microsoft Sentinel
# Instalação
## Linux
A melhor maneira de começar com `dnsmonster` é baixar o binário da seção de releases. O binário é compilado estaticamente contra `musl`, portanto deve funcionar imediatamente em muitas distribuições. Para suporte a `afpacket`, você deve usar kernel 3.x+. Qualquer distribuição Linux moderna (CentOS/RHEL 7+, Ubuntu 14.0.4.2+, Debian 7+) vem com uma versão 3.x+, então deve funcionar imediatamente. Se sua distribuição não estiver funcionando com a versão pré-compilada, envie um problema com os detalhes e compile o `dnsmonster` manualmente usando esta seção [Compilar Manualmente](#build-manually).
### Contêiner
Como o `dnsmonster` usa funcionalidade de captura bruta de pacotes, o daemon Docker/Podman deve conceder a capacidade ao contêiner```
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:
Certifique-se de ter os pacotes go, libpcap-devel e linux-headers instalados. O nome dos pacotes pode variar de acordo com sua distribuição. Depois disso, basta clonar o repositório e executar `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- sem `libpcap`:
`dnsmonster` usa apenas uma função do `libpcap`, que é converter os filtros no estilo `tcpdump` em bytecode BPF. Se você pode viver sem suporte BPF, pode compilar o `dnsmonster` sem `libpcap`. Note que para qualquer outra plataforma, a captura de pacotes recai para o `libpcap`, então ele se torna uma dependência obrigatória (*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
A build acima também funciona em ARMv7 (RPi4) e AArch64.
Se você tiver uma cópia de libpcap.a, pode compilar vinculando-a estaticamente ao dnsmonster e construir tudo de forma totalmente estática. No código abaixo, altere /root/libpcap-1.9.1/libpcap.a para a localização da sua cópia.```
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
Para mais informações sobre como o binário com ligação estática é criado, dê uma olhada [neste](https://github.com/fenkohq/dnsmonster/blob/main/Dockerfile) Dockerfile.
## Windows
Compilar no Windows é muito parecido com Linux. Apenas certifique-se de ter o `npcap`. Clone o repositório (`--history 1` funciona) e execute `go get` e `go build ./cmd/dnsmonster`
Conforme mencionado, a versão para Windows do binário depende da instalação do [npcap](https://nmap.org/npcap/#download). Após a instalação, o binário deve funcionar sem problemas. Foi testado em um ambiente Windows 10 e executou sem nenhum problema. Para encontrar os nomes das interfaces para fornecer o parâmetro `--devName` e começar a captura, você precisará fazer o seguinte:
- abra o cmd.exe como Administrador e execute o seguinte: `getmac.exe`. Você verá uma tabela com o endereço MAC das suas interfaces e uma coluna Nome de Transporte com algo assim: `\Device\Tcpip_{16000000-0000-0000-0000-145C4638064C}`
- execute `dnsmonster.exe` no `cmd.exe` desta forma:```sh
dnsmonster.exe --devName \Device\NPF_{16000000-0000-0000-0000-145C4638064C}
Note que você deve alterar \Tcpip de getmac.exe para \NPF e então passá-lo para dnsmonster.exe.
Muito parecido com Linux e Windows, certifique-se de ter git, libpcap e go instalados, então siga as mesmas instruções:```sh
git clone https://github.com/mosajjal/dnsmonster --depth 1 /tmp/dnsmonster
cd /tmp/dnsmonster
go get
go build -o dnsmonster ./cmd/dnsmonster
# Arquitetura
## Instalação All-in-one usando Docker

No diagrama de exemplo, o tráfego de egresso/ingresso do servidor DNS é capturado, após isso, uma camada opcional de agregação de pacotes é adicionada antes de chegar ao Servidor DNSMonster. Os dados de saída que saem dos Servidores DNS são bastante úteis para realizar análise de cache e desempenho na frota de DNS. Se um agregador não estiver disponível para você, você pode conectar ambos os TAPs diretamente ao DNSMonster e ter dois Agentes DNSMonster analisando o tráfego.
Executar `./autobuild.sh` cria múltiplos contêineres:
* múltiplas instâncias de `dnsmonster` para analisar o tráfego em qualquer interface. A lista de interfaces será solicitada como parte do `autobuild.sh`
* uma instância de `clickhouse` para coletar a saída do `dnsmonster` e salvar todos os logs/dados em um diretório de dados e logs. Ambos serão solicitados como parte do `autobuild.sh`
* uma instância de `grafana` analisando os dados do `clickhouse` com painel pré-construído.
### Demonstração All-in-one
[](static/aio_demo.svg)
## Implantação Empresarial

# Configuração
O DNSMonster pode ser configurado usando 3 métodos diferentes. Opções de linha de comando, variáveis de ambiente e arquivo de configuração. Ordem de precedência:
- Opções de linha de comando (insensível a maiúsculas/minúsculas)
- Variáveis de ambiente (sempre maiúsculas)
- Arquivo de configuração (sensível a maiúsculas/minúsculas, minúsculas)
- Valores padrão (sem configuração)
## Opções de linha de comando
Observe que os argumentos da linha de comando são insensíveis a maiúsculas/minúsculas a partir da 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
todas as flags podem ser configuradas também por variáveis de ambiente. Tenha em mente que o nome de cada parâmetro é sempre em maiúsculas e o prefixo para todas as variáveis é "DNSMONSTER."
Exemplo:```shell $ export DNSMONSTER_PORT=53 $ export DNSMONSTER_DEVNAME=lo $ sudo -E dnsmonster
## Arquivo de configuração
você pode executar `dnsmonster` usando o seguinte comando para usar o arquivo de configuração:```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
A política de retenção padrão para as tabelas do ClickHouse é definida para 30 dias. Você pode alterar o número construindo os contêineres usando ./autobuild.sh. Como o ClickHouse não possui um carimbo de data/hora interno, o TTL considerará a data do pacote recebido nos arquivos pcap. Portanto, ao importar arquivos pcap antigos, o ClickHouse pode começar automaticamente a remover os dados à medida que são escritos e você não verá dados reais no seu Grafana. Para corrigir isso, você pode alterar o TTL para um dia anterior à data do pacote mais antigo dentro do arquivo PCAP.
NOTA: para alterar um TTL a qualquer momento, você precisa se conectar diretamente ao servidor Clickhouse usando um cliente clickhouse e executar a seguinte instrução SQL (este exemplo altera de 30 para 90 dias):```sql
ALTER TABLE DNS_LOG MODIFY TTL DnsDate + INTERVAL 90 DAY;`
NOTA: O comando acima altera apenas o TTL para os dados brutos do log de DNS, que constituem a maior parte do seu consumo de capacidade. Para garantir que você ajuste o TTL para cada tabela de agregação individualmente, você pode executar o seguinte:```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;
ATUALIZAÇÃO: na versão mais recente do clickhouse, as tabelas .inner não têm o mesmo nome que as visualizações de agregação correspondentes. Para modificar o TTL, você precisa encontrar os nomes das tabelas no formato UUID usando SHOW TABLES e repetir o comando ALTER com esses UUIDs.
dnsmonster suporta amostragem de pré-processamento de pacotes usando um parâmetro simples: sampleRatio. Este parâmetro aceita um valor de 'proporção', como 1:2. 1:2 significa que para cada 2 pacotes que chegam, apenas um é processado (amostragem de 50%). Note que esta amostragem ocorre APÓS os filtros bpf e não antes. Se você tiver problemas em acompanhar o volume do seu tráfego DNS, pode definir isso como algo como 2:10, significando que 20% dos pacotes que passam pelo seu filtro bpf serão processados pelo dnsmonster.
dnsmonster suporta uma lista de ignorar domínios pós-processamento para evitar escrever dados ruidosos e repetitivos no seu banco de dados. A lista de ignorar domínios é um arquivo no formato CSV, com apenas duas colunas: uma string e uma lógica para aquela string específica. dnsmonster suporta três lógicas: prefix, suffix e fqdn. prefix e suffix significam que apenas os domínios começando/terminando com a string mencionada serão ignorados para serem escritos no banco de dados. Note que como o processo é feito nas perguntas DNS, sua string provavelmente terá um ponto final . que precisa ser incluído na sua linha da lista de ignorar também (veja skipdomains.csv.sample para uma melhor visualização). Você também pode ter uma correspondência completa de FQDN para evitar escrever FQDNs altamente ruidosos no seu banco de dados.
dnsmonster tem o conceito de allowdomains, que ajuda a construir a detecção se certos FQDNs, prefixos ou sufixos estão presentes no tráfego DNS. Dado o fato de que dnsmonster suporta múltiplos fluxos de saída com lógicas diferentes para cada um, é possível coletar todo o tráfego DNS no ClickHouse, mas coletar apenas domínios da lista de permissão na saída padrão ou em um arquivo na mesma instância do dnsmonster.
Por padrão, as principais tabelas criadas pelo arquivo tables.sql (DNS_LOG) têm a capacidade de reduzir a amostragem de um resultado conforme necessário, já que cada pergunta DNS tem um UUID semi-único associado a ela. Para mais informações sobre consultas SAMPLE no Clickhouse, consulte este documento.
NOTA: se seu arquivo pcap foi capturado por uma das meta-interfaces do Linux (por exemplo tcpdump -i any), o dnsmonster não conseguirá ler o quadro Ethernet dele, pois ele não existe. Você pode usar uma ferramenta como tcprewrite para converter o arquivo pcap para Ethernet.
afpacketallowDomains e skipDomains de endpoints HTTP(S)libpcap e migrar para pcapgo para processamento de pacotesstatsd e Prometheus![]() | Assinatura de código gratuita no Windows fornecida por signpath.io, certificado pela SignPath Foundation |