tg12/dns-honeypot

GitHub: tg12/dns-honeypot

基于 Docker 和可观测性技术栈构建的被动式 DNS 蜜罐,用于实时捕获、分析并可视化互联网背景辐射及恶意扫描流量。

Stars: 99 | Forks: 6

# 我运行 DNS 蜜罐的第一个 24 小时 作为一名整天埋头于可观测性工具的工程师,我偶尔会萌生一些必须付诸实施的想法。这就是其中一次实验:在一个未公开宣传的干净 IP 上启动一个 DNS 解析器,然后任由互联网与它交互。该解析器的唯一任务就是保持静默、记录所有内容,并将产生的查询结果提供给 Grafana。只需一个 `docker compose up -d`,我就让 Unbound、Loki、Prometheus、Grafana 和 Traefik 开始跟踪实时流量,并绘制出关于好奇心、错误配置以及偶尔出现的扫描器的直方图。本 README 就是第一天的报告,内容包括该技术栈捕获了什么、它为何对我重要,以及它凸显了当前安全格局的哪些方面。 ## 实验内容 我有意在我这一端不引入任何信号——没有丢包、没有定制回复、没有缓解措施。只是启用了日志记录的 Unbound、Loki 负责跟踪日志文件、Prometheus 抓取 exporter 指标、Traefik 前端代理 Grafana,以及 Docker Compose 将它们连接在一起。该解析器位于 94.130.27.226,这是我找到的一个令人耳目一新的“干净” IPv4 地址(如果你想在噪声产生前查看基准状态,可以访问 https://www.abuseipdb.com/check/94.130.27.226 查看其状态),然后我就听任全世界自行其是。只需一台笔记本电脑就能监控每个面板,在我想搅动局势时运行 `tools/dns_query_storm.sh`,然后让噪声回归到全球互联网选择的任何模式中。 你可以通过 https://dns.cybersafeintl.co.uk/public-dashboards/eb554b5b74e14f4d95e376c0033ee83d 实时查看这些仪表板,不过它们位于该堆栈中最低端的服务器上,因此在查询量较大时期望刷新速度会较慢。 ## 仪表板捕获了什么 - **吞吐量**:Prometheus 抓取 Unbound exporter 的 `unbound_total_num_queries` 指标,因此“吞吐量 (QPS, 5m rate)”面板显示每秒查询数并按来源进行细分。该视图回答了“谁在猛烈冲击解析器?”这个问题,突然的峰值直接指向位于孟加拉国或波兰的 ASN,日志也很容易查看 SERVFAIL/NXDOMAIN 风暴是否伴随这些突发而来。 - **顶级客户端**:Loki 的 LogQL 按 `client_ip` 分组,仪表板已经将所有内容包裹在 `topk(sort_desc(...))` 中。这保持了面板的整洁,而 exporter 脚本让我可以将相同的查询转储为 CSV 文件,以便进行离线分析、报告或复现故事。第一次捕获显示,五个位于 45.179.* 和 45.6.* 范围内的 IP 地址在五分钟内各自触发了 5000+ 次查询——这要么是一个扫描器农场,要么是一个极具攻击性的客户端。 - **域名**:“顶级域名”面板展示了 5 分钟和 24 小时窗口内的 `qname` 热度。5 分钟快照中出现了 `scb.se`、`dhl.com` 和 `cmu.edu`,而 24 小时导出中包含了 `cbs.nl`、`scb.se`、`atlassian.com`、`abb.com` 和 `up.pt`。为什么是这些域名?这是有趣的部分——这些是合法服务、错误配置的解析器,还是追逐过期记录的机会主义扫描器?如果你有理论,请给我发个便条。 - **日志**:Loki 还会流式传输原始日志尾部,因此你可以看到与 SERVFAIL、缓存预热或客户端扩展其查询混合相关的峰值。将这些日志与导出的 CSV 结合起来,你可以重建世界在询问什么的时间线。 你看到的每个面板在 `exports/` 中都有对应的 CSV;当你想将原始故事附加到博客文章或事件报告时,可以将它们打包(`zip -r exports.zip exports/`)。 ## 内部机制 - `docker-compose.yml` 通过一个命令启动 Unbound、Unbound exporter、Loki + Promtail、Prometheus、Grafana 和 Traefik。 - `unbound/` 存储解析器配置和日志。TTL 控制、`serve-expired` 和缓存设置维护了保真度,以便我们捕获客户端实际请求的内容。 - `prometheus/`、`loki/` 和 `grafana/` 目录保存数据和置备文件,以便指标和仪表板在重启后依然存在。 - `grafana/dashboards/unbound-traffic-insights.json` 已预先置备了你看到的视图;所有 PromQL/Loki 查询均已聚合和排序,以保持面板的可读性。 - `tools/dns_query_storm.sh` 让你在需要测试响应时间时模拟查询风暴。 - `redeploy.sh` 自动执行关闭整个堆栈、拉取更新以及使用单个脚本重建的过程。 - `export_dashboard_data.py` 现在遍历仪表板 JSON,访问每个 Prometheus/Loki 查询,并将经过净化的 CSV 文件写入 `exports/` 目录以便共享。 image image ## 入门指南 1. `cd hetzner_deploy/unbound-dns` 2. `cp .env.example .env` 并配置 `GRAFANA_DOMAIN`、Grafana 管理员凭据、`LETSENCRYPT_EMAIL` 以及你需要的任何 TLS 覆盖设置。 3. `sudo chown -R 472:472 grafana-data && sudo mkdir -p prometheus/data && sudo chown -R 65534:65534 prometheus/data` 4. `docker compose build && docker compose up -d` 5. 将 DNS 客户端指向主机的 53 端口,让 Traefik 为 Grafana 处理 HTTPS,几分钟内你就能开始监控被动流量。 ## 导出和分享你看到的内容 1. `pip install requests`(该 exporter 是纯 Python 编写的)。 2. `python export_dashboard_data.py --duration 24h --outdir exports/24h --timeout 90` 以拉取每个仪表板查询,将其转换为 CSV,并将结果放置在 `exports/24h` 下。 3. `zip -r exports.zip exports/` 在发布原始表之前将它们打包,附加到博客文章,或发送给协作者。 4. 使用 `--duration 6h` 或 `--end` 时间戳重新运行以获取特定切片,或者如果只想要域名面板,则使用 `--filter domains`。 ## 我在第一天注意到的现象 - 在 5 分钟粒度的导出中,`scb.se`、`dhl.com`、`cmu.edu`、`up.pt` 和 `utc.fr` 各自产生了数十万次查询。为什么是这些目标?这些欧洲企业域名的组合让我怀疑这是一个 CDN、恢复服务,或者是试图重新填充过期缓存的扫描器。 - 24 小时导出描绘了一幅更大的图景:`cbs.nl`、`scb.se`、`atlassian.com`、`abb.com` 和 `up.pt` 总共产生了超过 2.5 亿次查询。这种流量水平并非随机噪声——要么是大规模客户端,要么是一个永不停止解析的持久设备。 - 最忙碌的客户端是少数几个 `45.179.*` 和 `45.6.*` IPv4 地址,在观察到的五分钟内每个都触发了超过 5000 次查询。它们可能是 ISP 或扫描农场的一部分,但无论它们是什么,仪表板都让跟踪它们变得轻而易举。 这凸显了什么?它说明了即使 DNS 基础设施没有对外宣传,也可能成为有趣流量的被动来源。互联网一直在提出问题,而这个设置只是仔细地倾听。如果你好奇这个实验如何融入我更广泛的工作,请查看其他仓库——有时我会运行这样的想法,并且必须看看它会通向何方。 ## 这个实验给我的感觉 - 这个设置运行成本极低,但感觉就像一个完整的研究实验室。看着解析器充满了未经请求的查询,让这个堆栈感觉充满了活力——有点令人不安但也非常迷人。 - 我没有过滤任何东西,所以如果你想对其进行压力测试或指向你自己的脚本,请便。仪表板会准确地向你展示你搅动了多少噪声。 - 导出功能使得保留这些噪声变得容易。压缩 `exports/` 文件夹,或者在你讲述故事的任何地方直接附加 CSV 文件。 - 我仍然对那些域名和客户端 IP 感到好奇;如果你在自己的蜜罐上看到类似的模式,请把统计数据反馈到这里,以便我们可以交换意见。 ## 未来的方向 - 如果你想对异常情况做出反应,例如 SERVFAIL 突发或突然的 NXDOMAIN 风暴,可以添加 Alertmanager 或自定义脚本。 - 使用额外的元数据(客户端 ASN、SERVFAIL 原因、国家/地区)扩展 `export_dashboard_data.py` 或 Loki 查询,以回答更深层的问题。 - 将 Loki 输出馈送到二级分析管道,或将 Prometheus CSV 转储到笔记本中进行分类实验。 - 保持故事的活力:使用新窗口(`--duration 12h`、`--end ...`)重新运行 exporter,将输出保存在带时间戳的目录中,并使用最新的统计数据更新此 README,以便情节保持最新。 如果你正在使用自己的蜜罐跟进,请使用导出中的统计数据更新此 README,以便我们可以比较故事,看看相同的站点和客户端是否持续出现。 ## 法律声明 本项目“按原样”提供。不提供任何形式的明示或暗示保证,包括但不限于适销性、适用于特定用途或非侵权性的保证,且我对其使用造成的任何损害不承担责任。你承担部署、配置或操作此堆栈相关的所有风险。
标签:API集成, DevSecOps, DFIR, DNS蜜罐, Docker, Exporter, Grafana, IPv4, Loki, Mutation, QPS统计, Traefik, Unbound, 上游代理, 云存储安全, 互联网安全, 可观测性, 可视化, 命令控制, 基础设施, 威胁情报, 安全防御评估, 开发者工具, 数据采集, 监控, 网络安全, 网络扫描, 自定义请求头, 蜜罐, 证书利用, 请求拦截, 逆向工具, 隐私保护