
パッシブDNSキャプチャ・モニタリングツールキット
Golangで構築されたパッシブDNS監視フレームワーク。
dnsmonsterはDNSトラフィック用のパケットスニファを実装しています。pcapファイル、ライブインターフェース、またはdnstapソケットからトラフィックを受け入れることができ、
一般的なコンピュータ上で毎秒20万件以上のDNSクエリをインデックス化できることが実証されており、毎秒数十万件のDNSクエリをインデックス化・保存するために使用できます。スケーラブルでシンプル、かつ使いやすく、セキュリティチームが企業のDNSトラフィックの詳細を理解するのに役立つことを目的としています。dnsmonsterはDNSの会話を追跡するものではなく、むしろDNSパケットが到着次第インデックス化することを目的としています。また、エンドユーザーのプライバシーを侵害するものではなく、レイヤ3のIP(IPv4およびIPv6)をマスクする機能があり、チームが集計データに対してトレンド分析を行えるようにしつつ、個々のユーザーにクエリを追跡できないようにします。ブログ記事
バージョン1.xより前のコードはベータ品質とみなされ、破壊的変更が発生する可能性があります。各リリース間の破壊的シナリオのリストと、潜在的なデータ損失を軽減する方法については、各タグのリリースノートを参照してください。```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
# 主な機能
- Linuxの`afpacket`とゼロコピーパケットキャプチャを使用可能。
- BPFに対応
- プライバシー強化のためIPアドレスをマスク可能
- 前処理サンプリング比率を設定可能
- ストレージへの書き込みを回避するための"スキップ"`fqdn`のリストを保持可能
- 特定のドメインへのアクセスをログに記録するための"許可"ドメインのリストを保持可能
- スキップおよび許可ドメインファイル/URLのホットリロード
- 出力ストリームごとに設定可能なロジックを持つモジュラー出力。
- ClickHouseのTTL属性を使用した自動データ保持ポリシー
- ClickHouse出力用の組み込みGrafanaダッシュボード。
- 単一の静的リンクされたバイナリとして配布可能
- 環境変数、コマンドラインオプション、設定ファイルで設定可能
- ClickHouseのSAMPLE機能を使用した出力のサンプリングが可能
- `prometheus`および`statstd`を使用したメトリクス送信が可能
- ClickHouseの組み込みLZ4ストレージによる高い圧縮率
- DNS Over TCP、フラグメント化DNS(udp/tcp)、IPv6に対応
- UnixソケットまたはTCP経由の[dnstap](https://github.com/dnstap/golang-dnstap)をサポート
- SplunkおよびMicrosoft Sentinelとの組み込みSIEM統合
# インストール
## Linux
`dnsmonster`を使い始める最善の方法は、リリースセクションからバイナリをダウンロードすることです。バイナリは`musl`に対して静的にビルドされているため、多くのディストリビューションでそのまま動作するはずです。`afpacket`をサポートするには、カーネル3.x+を使用する必要があります。最近のLinuxディストリビューション(CentOS/RHEL 7+、Ubuntu 14.0.4.2+、Debian 7+)は3.x+バージョンを搭載しているため、そのまま動作するはずです。ディストリビューションがプリコンパイル版で動作しない場合は、詳細を添えてIssueを送信し、このセクション[手動でビルド](#build-manually)に従って手動でビルドしてください。
### コンテナ
`dnsmonster`はrawパケットキャプチャ機能を使用するため、Docker/Podmanデーモンはコンテナにその機能を付与する必要があります```
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- `libpcap`なしの場合:
`dnsmonster`は`libpcap`から1つの機能のみを使用します。それは`tcpdump`形式のフィルターをBPFバイトコードに変換することです。BPFサポートなしでも問題ない場合、`libpcap`なしで`dnsmonster`をビルドできます。ただし、他のプラットフォームでは、パケットキャプチャは`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
静的にリンクされたバイナリの作成方法の詳細については、[この](https://github.com/fenkohq/dnsmonster/blob/main/Dockerfile) 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}`
- 次のように `cmd.exe` で `dnsmonster.exe` を実行します:```sh
dnsmonster.exe --devName \Device\NPF_{16000000-0000-0000-0000-145C4638064C}
注意点: getmac.exe の \Tcpip を \NPF に変更し、それを dnsmonster.exe に渡す必要があります。
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
# アーキテクチャ
## Dockerを使用したオールインワンインストール

このダイアグラムの例では、DNSサーバートラフィックの出口/入口をキャプチャし、その後、オプションのパケット集約レイヤーを追加してからDNSMonsterサーバーに到達します。DNSサーバーから送信されるデータは、DNSフリートのキャッシュおよびパフォーマンス分析に非常に有用です。アグリゲーターが利用できない場合は、両方のTAPを直接DNSMonsterに接続し、2つのDNSMonsterエージェントでトラフィックを監視することもできます。
`./autobuild.sh` を実行すると、複数のコンテナが作成されます:
* 任意のインターフェース上のトラフィックを監視する `dnsmonster` の複数インスタンス。インターフェースリストは `autobuild.sh` の一部としてプロンプト表示されます。
* `dnsmonster` の出力を収集し、すべてのログ/データをデータおよびログディレクトリに保存する `clickhouse` の1インスタンス。両方とも `autobuild.sh` の一部としてプロンプト表示されます。
* プリビルドのダッシュボードで `clickhouse` データを参照する `grafana` の1インスタンス。
### オールインワンデモ
[](static/aio_demo.svg)
## エンタープライズデプロイメント

# 設定
DNSMonsterは3つの異なる方法で設定できます。コマンドラインオプション、環境変数、設定ファイル。優先順位:
- コマンドラインオプション(大文字小文字を区別しない)
- 環境変数(常に大文字)
- 設定ファイル(大文字小文字を区別、小文字)
- デフォルト値(設定なし)
## コマンドラインオプション
注: コマンドライン引数は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
## 設定ファイル
以下のコマンドで `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ファイル内の最も古いパケットより1日古い値に変更してください。
注意: 任意の時点でTTLを変更するには、clickhouseクライアントを使用してClickhouseサーバーに直接接続し、次のSQL文を実行する必要があります(この例では30日から90日に変更しています):```sql
ALTER TABLE DNS_LOG MODIFY TTL DnsDate + INTERVAL 90 DAY;`
注記: 上記のコマンドは、生のDNSログデータ(容量消費の大部分を占める)のTTLのみを変更します。すべての集計テーブルの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;
更新: clickhouseの最新バージョンでは、.innerテーブルは対応する集約ビューと同じ名前ではありません。TTLを変更するには、SHOW TABLESを使用してUUID形式のテーブル名を見つけ、それらのUUIDでALTERコマンドを繰り返す必要があります。
dnsmonsterは、シンプルなパラメータsampleRatioを使用したパケットの事前処理サンプリングをサポートしています。このパラメータは、1:2のような「比率」値を受け入れます。1:2は、到着する2パケットごとに1つだけを処理することを意味します(50%サンプリング)。このサンプリングはbpfフィルターの後(前ではない)に行われることに注意してください。DNSトラフィックの量に追いつけない場合は、この値を2:10のように設定できます。これは、bpfフィルターを通過するパケットの20%をdnsmonsterが処理することを意味します。
dnsmonsterは、データベースにノイズの多い反復データを書き込むのを避けるための、後処理ドメインスキップリストをサポートしています。ドメインスキップリストはCSV形式のファイルで、2つのカラムのみを持ちます: 文字列と、その文字列に対するロジックです。dnsmonsterは3つのロジックをサポートしています: prefix, suffix, fqdn。prefixとsuffixは、指定された文字列で始まる/終わるドメインのみがDBに書き込まれないようにスキップされることを意味します。この処理はDNS質問に対して行われるため、文字列には末尾に.が含まれる可能性が高く、それをスキップリストの行にも含める必要があることに注意してください(詳細はskipdomains.csv.sampleを参照)。また、完全修飾ドメイン名(FQDN)の完全一致を使用して、非常にノイズの多いFQDNがデータベースに書き込まれるのを回避することもできます。
dnsmonsterにはallowdomainsの概念があり、DNSトラフィックに特定のFQDN、プレフィックス、またはサフィックスが存在するかどうかの検出を支援します。dnsmonsterはそれぞれ異なるロジックを持つ複数の出力ストリームをサポートしているため、同じdnsmonsterインスタンスで、すべてのDNSトラフィックをClickHouseに収集しつつ、許可リストに含まれるドメインのみをstdoutまたはファイルに収集することが可能です。
デフォルトでは、tables.sql (DNS_LOG) ファイルによって作成されるメインテーブルは、必要に応じて結果をダウンサンプリングする機能を持っています。これは、各DNS質問に半一意のUUIDが関連付けられているためです。ClickhouseのSAMPLEクエリの詳細については、このドキュメントを参照してください。
注: pcapファイルがLinuxのメタインターフェース(例: tcpdump -i any)でキャプチャされた場合、dnsmonsterはそこからイーサネットフレームを読み取ることができません(存在しないため)。tcprewriteのようなツールを使用して、pcapファイルをイーサネット形式に変換できます。
afpacketサポートの追加allowDomainsとskipDomainsを読み込む機能libpcap依存関係の削除と、pcapgoへの移行によるパケット処理statsdおよびPrometheusサポート![]() | Windows向けの無料コード署名は、signpath.ioによって提供され、証明書はSignPath Foundationによるものです。 |