kakarot-dev/dnsink

GitHub: kakarot-dev/dnsink

高性能 Rust DNS 代理,通过威胁情报与熵检测在 DNS 层主动防御恶意流量。

Stars: 7 | Forks: 0

# dnsink 一个高性能的 Rust DNS 代理,使用实时威胁情报源在 DNS 层阻止恶意软件、C2 和钓鱼域名,并采用 Shannon-entropy 隧道检测、CDN 白名单、DoH 上游、热重载、Prometheus 指标和终端仪表板。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/4c41515566213056.svg)](https://github.com/kakarot-dev/dnsink/actions/workflows/ci.yml) [![Docker](https://img.shields.io/badge/ghcr.io-dnsink-blue?logo=docker)](https://github.com/kakarot-dev/dnsink/pkgs/container/dnsink) [![Deploy with flyctl](https://img.shields.io/badge/deploy%20with-flyctl-7b3fbf?logo=flydotio&logoColor=white)](https://fly.io/docs/launch/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ## 目录 - [快速开始](#quickstart) - [功能特性](#features) - [工作原理](#how-it-works) - [基准测试](#benchmarks) - [部署](#deploy) - [配置](#configuration) - [许可证](#license) ## 快速开始 ``` docker run -d --name dnsink \ -p 53:5353/tcp -p 5353:5353/udp -p 9090:9090 \ ghcr.io/kakarot-dev/dnsink:v0.2.0 dig @127.0.0.1 +tcp example.com # resolves dig @127.0.0.1 +tcp malware.example.com # NXDOMAIN curl http://127.0.0.1:9090/metrics # Prometheus counters ``` 或者启动终端仪表板: ``` cargo run --release -- --tui ``` ## 功能特性 | | dnsink | Pi-hole | AdGuard Home | crab-hole | |---|---|---|---|---| | 语言 | Rust | Shell/PHP | Go | Rust | | 安全威胁源(URLhaus、OpenPhish、PhishTank) | 是 | 否 | 否 | 否 | | DNS 隧道检测(Shannon 熵 + CDN 白名单) | 是 | 否 | 否 | 否 | | 布隆过滤器预筛选 | 是 | 否 | 否 | 否 | | DNS-over-HTTPS 上游 | 是 | 需要 cloudflared | 是 | 是 | | 热重载(基于 ArcSwap 的无锁) | 是 | 基于重启 | 是 | 是 | | Prometheus `/metrics` | 是 | 否 | 否 | 否 | | 两阶段查询 | ~490 ns | — | — | — | 与专注于广告拦截的 Pi-hole 和 AdGuard Home 不同,dnsink 主动针对威胁基础设施——C2 服务器、钓鱼页面、恶意域名——使用每小时更新的威胁情报源。 ## 工作原理 ``` Client query (UDP/TCP :5353) | v +---------------+ | DnsProxy | receives raw DNS bytes, starts latency timer +-------+-------+ | v +---------------+ | BloomFilter | stage 1: ~184 ns, 117 KB for 100K items, 1% FPR | | definite miss -> skip trie, forward immediately +-------+-------+ | maybe blocked v +---------------+ | DomainTrie | stage 2: label-reversed radix trie | | is_blocked at any ancestor = wildcard block +-------+-------+ | +----+----+ | | blocked allowed | | v v NXDOMAIN forward to upstream (UDP, TCP, or DoH) | | +----+----+ | v log + metrics ``` **两阶段查询。** 布隆过滤器在约 184 ns 内消除 99% 的合法流量查询。仅可能的匹配项会进入基数树进行权威确认。基数树以反标签顺序存储域名,因此通配符阻断(`malware.com` 阻断 `*.malware.com`)在遍历中自然生效。 **热重载。** 阻断列表在可配置间隔内刷新,不会丢弃进行中的查询。`ArcSwap` 提供无锁读取;旧数据通过 `Arc` 引用计数保持活跃,直到查询排空。 **隧道检测。** 子域名标签按 Shannon 熵评分;长度超过最小阈值且熵高于配置阈值的会被标记。CDN 白名单(AWS / Akamai / Cloudflare)使用标签边界安全的后缀匹配来抑制来自合法高熵提供商的误报。 ## 基准测试 10 万个域名下的 Criterion,发布构建: | 操作 | 耗时 | |---|---| | 布隆查找(未命中) | 184 ns | | 布隆查找(命中) | 87 ns | | **两阶段(未命中)** | **288 ns** | | **两阶段(命中)** | **491 ns** | ## 部署 **Docker**(distroless/cc-debian12:nonroot,多架构支持 amd64 + arm64): ``` docker run -d -p 53:5353/tcp -p 5353:5353/udp -p 9090:9090 \ ghcr.io/kakarot-dev/dnsink:v0.2.0 ``` **Fly.io** — `fly.toml` 已包含在仓库中。需要专用 IPv4 用于 UDP(每月 $2): ``` flyctl apps create flyctl ips allocate-v4 --yes flyctl deploy ``` Fly.io 要求 UDP 服务绑定 `fly-global-services`(否则回复的源 IP 错误)。仓库中的 `config.docker.toml` 使用不对称的 `listen.tcp_address` 覆写来处理此问题。请参考 [`config.docker.toml`](config.docker.toml) 和 [`fly.toml`](fly.toml)。 ## 配置 默认配置文件为 `config.toml`。最小示例如下: ``` [listen] address = "127.0.0.1" port = 5353 [upstream] protocol = "doh" doh_url = "https://1.1.1.1/dns-query" [feeds] urlhaus = true openphish = true refresh_secs = 3600 [tunneling_detection] enabled = true entropy_threshold = 3.5 [metrics] bind_addr = "127.0.0.1:9090" ``` 完整 schema 位于 [`src/config.rs`](src/config.rs)。 ## 许可证 MIT
标签:Bloom过滤器, C2阻断, CDN白名单, Distroless Docker, DNS代理, DNS隧道检测, DoH, fly.io, GitHub Container Registry, NXDOMAIN, Prometheus指标, Rust, Shannon熵, TUI, 两阶段查找, 可视化界面, 威胁情报, 容器化部署, 并发解析, 开发者工具, 恶意域名阻断, 热重载, 终端仪表盘, 缓存优化, 网络安全, 网络流量审计, 自定义请求头, 请求拦截, 通知系统, 钓鱼域名, 隐私保护, 零信任网络