我们正在探索dnsmonster的托管SaaS解决方案! 通过分享您的反馈和需求,帮助塑造被动DNS监控的未来:参加我们的快速调查
目录
基于Golang的被动DNS监控框架。
dnsmonster实现了一个用于DNS流量的数据包嗅探器。它可以接受来自pcap文件、实时接口或dnstap套接字的流量,
并且可用于索引和存储每秒数十万个DNS查询,因为它已经证明能够在普通计算机上每秒索引20万+个DNS查询。它旨在可扩展、简单且易于使用,并帮助
安全团队了解企业DNS流量的详细信息。dnsmonster不旨在跟踪DNS会话,而是旨在在DNS数据包到达时立即进行索引。它也不旨在侵犯
最终用户的隐私,具有屏蔽第三层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属性自动数据保留策略
- 内置的Grafana仪表板,用于ClickHouse输出。
- 能够作为单个静态链接的二进制文件分发
- 能够使用环境变量、命令行选项或配置文件进行配置
- 能够使用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+版本,因此应该可以开箱即用。如果您的发行版无法与预编译版本一起使用,请提交包含详细信息的问题,并使用本节的[手动构建](#build-manually)手动构建`dnsmonster`。
### 容器
由于`dnsmonster`使用原始数据包捕获功能,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` 的一个函数,即把 `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 地址的表格,以及一个类似如下的“传输名称”列:`\Device\Tcpip_{16000000-0000-0000-0000-145C4638064C}`
- 在 `cmd.exe` 中像这样运行 `dnsmonster.exe`:```sh
dnsmonster.exe --devName \Device\NPF_{16000000-0000-0000-0000-145C4638064C}
请注意,您必须将 \Tcpip 从 getmac.exe 更改为 \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,并由两个DNSMonster代理查看流量。
运行 `./autobuild.sh` 会创建多个容器:
* 多个 `dnsmonster` 实例用于查看任何接口上的流量。接口列表将在 `autobuild.sh` 运行时提示。
* 一个 `clickhouse` 实例用于收集 `dnsmonster` 的输出,并将所有日志/数据保存到数据和日志目录。两者将在 `autobuild.sh` 运行时提示。
* 一个 `grafana` 实例用于查看 `clickhouse` 数据,并带有预构建的仪表板。
### 一体化演示
[](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