慢雾安全团队正式发布 MistEye DNS Guard:一款使用 Rust 编写的轻量级本地 DNS Relay 与威胁观察工具,面向 macOS 和 Linux 主机提供系统 DNS 接管、域名与公开 IP 检测、进程外联观察、恶意事件留存及 Webhook 告警能力,重点覆盖恶意域名访问、DNS 响应返回恶意指标、程序直连恶意 IP 等常见风险场景。
MistEye DNS Guard 将 DNS 转发与后续威胁检测相互解耦:查询照常完成,域名与 IP 在后台异步进入 MistEye 检测,尽量减少安全检测对正常网络访问的影响。
用户无需部署数据库或消息队列:下载预编译程序,准备一份 TOML 配置即可运行;网页控制台内嵌在主程序中,观察记录、检测队列和恶意事件由本地 SQLite 保存。它既可以临时用于排查,也适合留在开发机、测试机或服务器上持续观察。
一、背景:主机网络风险,往往先留下域名与外联 IP 线索
浏览器访问网页、命令行下载依赖、桌面软件检查更新、后台服务连接远端接口,通常都要先完成域名解析,因此 DNS 往往是观察主机网络活动的重要入口。
但风险线索并不只存在于 DNS 中。有些程序会绕过域名解析,直接连接硬编码的公网 IP;即使已经发现陌生 IP,后续仍需要确认由哪个进程、哪个 PID 发起,以及连接到了哪个端口。
在日常开发和办公环境里,这些线索并不容易被持续看见。
• 系统日志通常不会完整保留每一次 DNS 查询和进程外联;
• 抓包适合专项分析,却不适合在普通主机上长期运行;
• 只看域名,无法覆盖程序绕过 DNS、直接连接公网 IP 的情况;
• 只看到陌生 IP,也不一定能快速确认对应的进程和可执行文件;
• DNS、检测 API 或告警服务短暂故障时,未持久化的观察任务容易丢失。
更现实的问题是,很多人只有在浏览器弹出异常页面、账号出现异动,或者主机明显变慢后,才开始回头寻找网络证据。此时再问“刚才访问过什么”,往往已经缺少连续记录。
基于对恶意基础设施与网络侧威胁的长期跟踪,MistEye 将 DNS Guard 定位为部署在本地主机上的轻量观察层:以本地 DNS Relay 为主要观察入口,并通过可选的进程外联观察补充程序直连公网 IP 的场景。在不解密或检查 HTTP/HTTPS 应用内容的前提下,工具会记录相关域名、公开 IP 与可确认的进程来源,并交由 MistEye 威胁情报能力检测。
二、核心能力:轻量运行,DNS 照常解析,风险持续检测
MistEye DNS Guard 的核心原则很明确:
正常 DNS 转发不等待安全检测;观察到的域名和 IP 在后台完成检测、留存与告警。
当前版本发现恶意结果后会记录并按需告警,但不会修改 DNS 响应,也不会自动阻断访问。它更像一只部署在主机 DNS 路径旁的“观察哨”,负责尽早暴露风险线索,并为后续处置提供证据。
2.1 轻量化运行形态
MistEye DNS Guard 的“轻量”并不是简单删减能力,而是尽量减少一套主机级网络观察工具所需的部署和维护成本。

工具不要求用户先建设新的安全基础设施。不开 Webhook 也可以独立运行;需要接入告警平台时,再配置 Webhook 地址即可。
2.2 五类核心观察场景

DNS 查询和进程外联是两条互补的观察路径。
前者适合发现“访问了哪个域名”,后者用于补足“哪个程序正在连接哪个公网 IP”。即使某个程序没有发起域名查询,而是直接连接硬编码 IP,仍有机会被进程外联观察捕获。
2.3 支持的 DNS 上游与检测对象
MistEye DNS Guard 本身是一个本地 UDP/TCP DNS Relay,上游可以根据实际网络环境选择传统 DNS 或加密 DNS:

当上游地址使用域名时,可以配置独立的 bootstrap IP,避免解析上游 DNS 服务自身时再次依赖本机 DNS,形成回环。
当前会进入观察与检测链路的对象包括:
• DNS 查询中的域名;
• DNS 响应中的 CNAME、ANAME;
• A 记录中的公开 IPv4 地址;
• AAAA 记录中的公开 IPv6 地址;
• 可选进程外联观察发现的公网 IP。
环回地址、内网地址等非公网 IP 不会被当作外部威胁指标提交。用户也可以在配置中加入精确域名、通配子域名或精确 IP 白名单,跳过明确可信的内部目标。
2.4 可配置的去重观察窗口与异步检测
DNS 查询具有明显的重复性。同一个网页加载过程中,一个域名可能被多次解析;后台软件也会周期性访问固定服务。如果每观察到一次就立即重复提交,不仅增加无意义的请求,也会让告警与日志变得嘈杂。
MistEye DNS Guard 支持通过 window_seconds 自定义观察窗口,允许范围为 1–86400 秒,默认值为 120 秒。系统会对窗口内出现的相同指标进行聚合和去重,并保留实际观察次数。窗口结束后,域名和 IP 进入持久化检测队列,由后台任务调用 MistEye API。
用户可以根据自己的运行环境调整这一时间:希望更快得到检测结果时,使用较短窗口;需要减少重复请求时,可以适当延长。默认值提供一个通用参考,不强制所有场景必须一致。
后续检测过程不位于 DNS 转发的关键路径上:
DNS 查询 → 本地 Relay → 上游 DNS → 返回正常解析结果
│
└→ 异步观察 → 按配置窗口聚合 → MistEye 检测 → 留存 / 告警
即使 MistEye API、Webhook 或 SQLite 在某一时刻响应较慢,正常 DNS 请求也不需要等待整条检测链路完成。
2.5 恶意命中后的证据与来源归因
检测结果不能只给出一句“有风险”。用户更需要知道命中了什么,以及接下来从哪里查。
对于恶意 IP 事件,MistEye DNS Guard 会尽量保留命中时观察到的来源信息:
• 来源程序名称;
• PID;
• 可执行文件路径;
• 连接协议;
• 远端端口;
• 来源归属置信度;
• MistEye 返回的匹配详情。
对于 DNS 域名事件,系统会明确标记其来源为 DNS Relay。由于普通 DNS 报文本身不包含发起进程,当前版本不会强行把域名归因到某个程序,而是如实标记原始进程未知。
这一区分很重要:能确认的证据完整展示,无法可靠确认的归因不做猜测。
2.6 检测与告警处理规则

配置 Webhook Secret 后,推送请求支持 HMAC-SHA256 签名,接收方可以据此验证消息完整性,并确认请求方持有双方约定的 Secret。Webhook 不是必填项;不配置时,恶意事件仍会保存在本地数据库中。
三、工作机制:从一条 DNS 查询到恶意事件的完整闭环
MistEye DNS Guard 的工作流程可以概括为五个步骤:
接管或接收 DNS 请求
→ 转发至配置的上游 DNS
→ 提取域名、别名与公开 IP
→ 调用 MistEye Threat Detection API
→ 本地留存并按需推送 Webhook
进程外联观察则作为另一条输入链路,将公网 IP 及其进程来源送入同一套 IP 检测、事件留存和告警流程。
3.1 系统 DNS 接管
只启动 Relay 时,MistEye DNS Guard 仅能观察主动发送到 Relay 的请求。为了覆盖本机大多数传统 DNS 流量,工具提供系统 DNS 接管模式。
在 macOS 上,程序使用系统自带的 networksetup 修改 DNS,并通过 PF 将本机 IPv4/IPv6 的 53 端口请求重定向到配置的 Relay 端口。如果本机 53 端口被 mDNSResponder 占用,推荐将 Relay 配置为 127.0.0.1:15353。
在 Linux MVP 中,程序会根据系统环境使用 resolvectl、NetworkManager 或静态 resolv.conf 配置 DNS,并使用 nftables 配合 SO_MARK 处理绕过与 Relay 自身回环问题。
系统模式启动顺序不是简单地“改一下 DNS”:
1. 先绑定并确认本地 Relay 可用;
2. 保存原有 DNS 与防火墙状态;
3. 加载当前平台的防护规则;
4. 修改系统 DNS;
5. 验证系统 DNS 与防火墙规则是否生效。
3.2 防回环与绕过控制
本地 DNS Relay 最容易出现的问题之一,是它发往上游的请求又被系统规则重定向回自己,形成解析回环。
MistEye DNS Guard 会区分 Relay 自身的上游流量与普通应用流量,并结合 macOS PF 或 Linux nftables 规则,限制应用绕过 Relay 直接访问外部 UDP/TCP 53 及默认 853 端口,同时处理 Relay 自身的解析回环。
需要注意,应用内部自行发起的 DoH/DoQ、VPN 内部 DNS、代理远端解析、hosts 文件、mDNS 和 LLMNR 不在当前版本的覆盖范围内。对于 Clash Verge 或 mihomo 等代理工具,建议将 127.0.0.1:15353 放在其 DNS 列表前面,让普通 DNS 请求先经过 MistEye Relay。
3.3 快照、租约与异常恢复
DNS 是主机网络的基础配置。如果工具退出后不能恢复现场,再多功能也不适合长期运行。
MistEye DNS Guard 在接管系统 DNS 前会保存恢复快照,运行期间定期更新租约(lease)。正常停止时,程序会移除防火墙规则并恢复原有 DNS;如果主进程异常退出而系统仍在运行,独立恢复助手会在租约过期后尝试清理防火墙规则并恢复 DNS。用户也可以使用快照手工恢复:

这套恢复机制的目的很直接:工具可以接管系统 DNS,也必须为用户提供清晰、可验证的恢复路径。
四、持续运行:从一次查询检测到本地主机观察
网络风险不是只在安装软件的那一刻出现。一个正常程序可能在更新后开始访问新的域名,一个此前未标记的 IP 也可能随着威胁情报更新被重新识别。
MistEye DNS Guard 因此不以“一次性扫描”为目标,而是围绕本机实际发生的 DNS 和进程外联持续记录。
4.1 网页控制台与终端管理台
macOS 用户可以启动内嵌网页控制台,在本机浏览器中完成主要操作:
• 启动或停止 DNS Relay;
• 启动 Relay 并接管系统 DNS;
• 验证当前保护状态;
• 停止并恢复原有 DNS 与防火墙配置;
• 查看最近观察到的域名;
• 查询进程外联记录;
• 查看恶意事件、检测队列与 Webhook 队列;
• 查看 Relay 日志;
• 启动 Relay 时选择是否启用进程外联观察,并设置采样间隔。
网页管理服务默认只监听 127.0.0.1:8080,确需远程访问时必须配置 API Token 并配合主机防火墙限制范围。
终端管理台方面,交互式界面会展示最近 24 小时的 DNS 观察、进程外联、恶意检测和队列状态;在 SSH 分配了 TTY 的情况下,也可以使用终端管理台查看运行状态。
4.2 持久队列与失败重试
MistEye 检测任务和 Webhook 事件都会写入 SQLite 持久队列。
当 API 暂时不可用、网络连接失败或服务返回限流状态时,检测任务不会被直接丢弃,而是按照退避时间重新进入待处理状态。Webhook 推送也会记录尝试次数、下次重试时间与最后一次错误。
这让工具可以在网络偶尔波动的个人电脑、测试主机或远程服务器上持续运行,而不是把“刚好断网”误当成“没有风险”。
4.3 当前版本边界
MistEye DNS Guard 当前以 macOS 为主要验证平台,并提供 Linux MVP。为了避免用户对覆盖范围产生错误预期,以下边界需要明确说明:

运行过程中产生的观察记录和队列状态默认保存在本地。观察到的相关域名和公开 IP 会发送到配置的 MistEye API 进行检测;只有配置了 Webhook,恶意事件才会进一步推送到用户指定地址。
网页端:

终端管理台:

五、部署与接入
5.1 获取预编译程序
GitHub Releases 已提供以下预编译版本:

使用预编译版本时,无需安装 Rust,也不需要准备独立数据库或 Web 服务。核心运行文件加上一份配置模板即可开始部署。
macOS Apple Silicon 可以直接下载:
curl -L -o misteye-dns \
https://github.com/slowmist/MistEye-DNS-Guard/releases/latest/download/misteye-dns-macos-aarch64
curl -L -o misteye-dns.toml.example \
https://raw.githubusercontent.com/slowmist/MistEye-DNS-Guard/main/misteye-dns.toml.example
chmod +x misteye-dns
需要自行编译时,项目固定使用 Rust 1.95.0:
cargo build --release --locked --bin misteye-dns
5.2 获取 MistEye API Key
1. 访问app.misteye.io/api-keys;
2. 注册或登录 MistEye;
3. 创建并复制 API Key;
4. 将密钥写入受保护的本地配置,或通过环境变量提供。
API 文档可查看:app.misteye.io/api-docs。
5.3 配置 API Key
先复制配置模板并限制文件权限:

可以直接在配置中填写:

也可以使用环境变量:

两种方式同时存在时,环境变量优先。不要把真实 API Key 提交到 Git 仓库。
观察窗口也可以在同一配置文件中按需调整,例如:

5.4 检查配置并启动
修改系统 DNS 前,先运行配置检查:
./misteye-dns doctor --config ./misteye-dns.toml
成功时会输出:
configuration valid
macOS 推荐启动网页控制台:
sudo ./misteye-dns serve --config ./misteye-dns.toml
随后访问:
http://127.0.0.1:8080
点击“启动并接管系统 DNS”,程序会完成 Relay 启动、系统 DNS 配置、PF 规则加载和保护状态验证。停止时,程序会按保存的快照恢复原有设置。
如果只想使用命令行:

完整配置和 Clash Verge / mihomo TUN 接入方式,请查看中文文档。
文档链接:https://github.com/slowmist/MistEye-DNS-Guard/blob/main/README.zh-CN.md
六、结语
MistEye DNS Guard 不试图替代 EDR、流量审计或专业取证工具。它选择了一条更轻、更靠前的路径:用一个本地程序把 DNS 作为观察点,让主机访问过的域名、解析出的公开 IP 和程序直接外联不再轻易从视野中消失。
项目仍在持续完善,欢迎在真实环境中体验,并通过 GitHub Issues 提交反馈和建议。
MistEye DNS Guard 开源地址:github.com/slowmist/MistEye-DNS-Guard
如有问题或建议,欢迎通过以下渠道与慢雾安全团队联系:
• 官方网站:slowmist.com
• 微信公众号:慢雾科技
• GitHub:github.com/slowmist
• MistEye 平台:app.misteye.io
关于 MistEye:MistEye 是由 SlowMist 自主研发的 Web3 威胁情报与动态安全监控平台,提供域名、IP、文件哈希、供应链包等多维威胁检测能力。
MistEye-DepScan:github.com/slowmist/MistEye-DepScan — 轻量级 CLI 工具,一行命令扫描项目依赖与全局安装包中的已知恶意包,支持 npm / PyPI / Cargo / Go / RubyGems 生态。
MistEye-Skills:github.com/slowmist/misteye-skills — AI 编码助手安全技能包,在依赖安装与 URL 访问前自动触发 MistEye 安全检测。

