monxas/nosey-privacy-monitor
GitHub: monxas/nosey-privacy-monitor
Nosey 是一个局域网隐私监控工具,通过透明网关和Zeek流量分析,帮助用户发现并阻止智能设备的不必要的网络通信。
Stars: 0 | Forks: 0
# 🔍 Nosey *(已归档)*
**查明你的智能设备究竟在与谁通信。**
为你的局域网打造的即插即用 L3 流量监控器 + 隐私审计工具。
[](LICENSE)
[](https://www.python.org/)
[](CONTRIBUTING.md)
[**快速开始**](#quick-start) · [**你会有什么发现**](docs/what-i-found.md) · [**模板**](templates/) · [**设置指南**](docs/setup/) · [**剧本**](docs/playbooks/)
## 为什么
你的电视。你的手机。你的 Echo。你的智能灯泡。**它们中的大多数每分钟都会拨回家几十次**——连接到广告网络、遥测服务器、模型训练云。设备是你买的,数据他们留着。
**Nosey** 将选定的设备路由通过一个透明的 L3 网关,使用 Zeek 监控它们的流量,并应用从实际观察中精心策划的(而非 2018 年的陈旧公共广告列表)的每个设备的屏蔽列表。
在 LG 电视上使用 Nosey 一周后:
- 仅剩余 12 个不同的 SNI 目标(全部是 Netflix / Amazon Prime —— 合法流量)
- 100% 的 LG 遥测端点被拦截(`lgtvcommon`、`lgtvsdp`、`lgeapi`、`lgtvonline`)
- 内置的 Alexa 语音搜索在正确的现代端点被终止(`*.avs.amazon.dev`、`*.apl-alexa.com` —— **大多数公共广告列表针对的是已于 2024 年弃用的旧 AVS 主机**)
本仓库包含工具和精心策划的屏蔽列表。自行搭配你自己的 Pi-hole 或 AdGuard。
## 功能
- 📋 **设备注册表** 使用 YAML —— 一个文件,唯一的事实来源。
- 🌐 **Web UI 桥接** —— `nosey serve` 启动一个本地仪表板(FastAPI + HTMX),拉取 Pi-hole 统计数据,并**通过差异/确认流程将模板规则推送到 Pi-hole 组**。不再需要手动将屏蔽列表复制粘贴到 Pi-hole 管理员界面。
- 🔬 **取证捕获模式** —— `nosey capture
` 从网关拉取 Zeek 日志,并生成一份包含热门 SNI、IP、字节数、TLS 状态和频率(心跳检测)的 Markdown 报告。无需中间人,无需自定义 CA —— 被动观察即可提供约 90% 的取证价值。
- 🎯 **为每个设备类别精心策划的屏蔽列表模板**(LG TV、三星电视、Echo Dot、iPhone、Android 等),**每个域名都有注释说明**(由你决定屏蔽什么)。
- 🛡 **同意执行** —— 除非引用了 `consent_doc:`,否则拒绝为你不拥有的设备启用监控。默认采用家庭友好设置。
- 🔍 **自动发现** —— `nosey discover` 扫描局域网,通过 MAC 厂商标识设备,并推荐模板。
- 📊 **独立模式** —— 仅需 Pi-hole + nft 即可工作,无需 Loki/Grafana(可观测性为可选)。
- 🧱 **多后端 DNS** —— Pi-hole、AdGuard Home、Unbound。
- 🔥 **DoH/DoT 终结者** —— 丢弃已知的加密 DNS 端点(1.1.1.1、8.8.8.8、Quad9、Apple Private Relay),使设备无法绕过你的屏蔽列表。
- 📈 **可选的 Grafana 仪表板**(如果你已有该技术栈)。
- 🐧 可在 **Proxmox LXC、Raspberry Pi、Docker、裸金属** 上运行。
## 快速开始
```
# 1. Clone
git clone https://github.com/monxas/nosey-privacy-monitor.git
cd nosey-privacy-monitor
# 2. Run interactive bootstrap (asks about your setup)
./scripts/install.sh
# 3. Add your first device (interactive)
bin/nosey wizard
# 4. Apply config
bin/nosey apply
# 5. On the device: configure WiFi → Router = , DNS =
# (Nosey prints the exact instructions after `apply`)
# 6. Watch what your device is doing
bin/nosey status my-device
# 7. Optional — launch the web UI bridge to Pi-hole
pip install "fastapi[standard]" uvicorn
bin/nosey serve # → http://127.0.0.1:8765
```
就这样。无需 Kubernetes。无需 Docker。无需云账户。只需约 50 MB 的 Python + Zeek。
## 这里“监控”的含义
Nosey **不会**拦截 TLS(无中间人,无自定义 CA,无需在你的 iPhone 上安装配置文件)。它能看到的是:
- ✅ **服务器名称指示 (SNI)** —— 你的设备请求的主机名(在 TLS 握手期间以明文形式可见)。
- ✅ **DNS 查询**(通过 Pi-hole 日志)。
- ✅ **IP、端口、字节数**(Zeek `conn.log`)。
- ✅ **明文 HTTP 头**(如果仍有设备使用 HTTP —— 这种情况每年都在减少)。
它看不到的:
- ❌ HTTPS 请求正文 / API 载荷。
- ❌ 加密的 DNS 响应 (DoH/DoT) —— 但 Nosey 会在网关拦截这些,使设备回退到普通 DNS,这时 Pi-hole 就能捕获它们。
这足以识别约 95% 的追踪器和大部分遥测端点。阅读 [docs/what-i-found.md](docs/what-i-found.md) 了解实际发现的例子。
## 工作原理(一段话)
你将局域网中的一台主机指定为“监控网关”—— 一台运行带有 `nftables` + Zeek 的 Linux 的小型机器(Proxmox LXC、树莓派、旧笔记本)。你选择加入的设备(在 iOS/macOS 中手动配置,或通过 WireGuard)被配置为使用该主机作为其**默认网关**。网关伪装它们的流量到互联网,Zeek 以 JSON 格式嗅探流量,可选的 promtail 将日志推送到 Loki/Grafana。DNS 指向你的 Pi-hole(或 AdGuard),按设备分组,因此每个设备都有自己的屏蔽列表策略。未选择加入的设备不受影响。
详细架构图:[docs/architecture.md](docs/architecture.md)。
## Pi-hole 桥接 (`nosey serve`)
运行 `nosey serve` 并打开 `http://127.0.0.1:8765` —— 一个仅本地访问的仪表板,它:
- **通过 Pi-hole 6 的 REST API 拉取实时 Pi-hole 统计数据**(过去 24 小时的查询/拦截/客户端数)。
- **列出每个已注册设备**及其每个客户端的查询计数 + 拦截百分比。
- **按设备启用/禁用开关** —— 与命令行一样执行同意检查。
- **每个设备的“模板差异”按钮** —— 精确显示模板将在 Pi-hole 组中**添加** / **移除** / **保留**哪些域名,并附上每个域名的 `why_block`(为什么拦截)和 `breaks_if_blocked`(拦截后会破坏什么)原因。确认后 → 直接通过 API 将这些更改推送到 Pi-hole。
这样你终于可以回答“*我的 LG 电视屏蔽列表现在真的应用到 Pi-hole 里了吗?*”而无需点击 5 个管理界面。
UI 是一个单独的 Python 文件。从 CDN 加载 Tailwind + HTMX。无需构建步骤,无需 Node,无需 Docker。总共约 600 行代码。
```
pip install "fastapi[standard]" uvicorn
bin/nosey serve --host 127.0.0.1 --port 8765
```
## 与单独使用 Pi-hole / AdGuard 的对比
**Nosey 不是 Pi-hole 的替代品——它是一个赋予 Pi-hole 洞察力和每设备精细化管理的桥梁。**
| | 仅 Pi-hole | Nosey + Pi-hole |
| ----------------------------------------------------------------- | ------------------------------ | ---------------------------------------------- |
| 按域名进行 DNS 阻断 | ✅ | ✅ (Pi-hole 作为引擎不变) |
| 设备硬编码 `8.8.8.8` → 绕过你的拦截器 | ❌ 不可见 | ✅ 通过 nft DNAT 重定向到 Pi-hole |
| 应用程序使用 DoH (`1.1.1.1:443`, `dns.google:443`) | ❌ 不可见 | ✅ 在网关 DROP,应用回退到操作系统 DNS |
| 电视连接到缓存的 IP(无 DNS 查询) | ❌ 从未看到 | ✅ nft IP DROP 规则 |
| **每个设备此刻*究竟*在做什么?**(每个 IP 的 SNI) | ❌ 仅 DNS,无解析后数据 | ✅ Zeek `ssl.log` 显示真实的 TLS 主机名 |
| 带有每个域名 `breaks_if_blocked` 说明的每设备屏蔽列表 | ⚠️ 分组+广告列表,无备注 | ✅ 带推理的精选 YAML 模板 |
| 发现全新的追踪器(Marfeel, Sensic, Adobe DTM) | ❌ 仅当出现在公共广告列表中 | ✅ 从你自己的 SSL 日志中,捕获 1-2 小时即可获得 |
| 将一个模板(12 个域名)应用到一个设备组 | ❌ 手动 UI 点击 | ✅ 一键 + 在 `nosey serve` 中进行差异/确认 |
**一句话总结**:Pi-hole 告诉你它拦截了哪些查询。Nosey 告诉你当 Pi-hole 没在看时,每个设备在做什么。
## 内置隐私伦理
Nosey 故意设计为**每设备可选加入**并进行同意检查:
```
# In devices.yaml
ramons-iphone:
owner: ramon # "self" — proceeds
enabled: true
partner-iphone:
owner: gloria # NOT self
consent_doc: docs/consent-log-gloria.md # REQUIRED to enable
enabled: false
```
如果你尝试 `nosey enable partner-iphone` 但没有 `consent_doc`,工具会拒绝并显示一条清晰的消息,指向一个示例同意日志模板。家庭隐私在这里不是附带说明。
## 项目状态
**v0.1** —— 作者可用。代码量小(约 400 行 Python),仅在 Debian 12 + Pi-hole 6 + Proxmox LXC 上测试过。欢迎 PR,特别是针对:
- 树莓派 OS、Ubuntu Server、NixOS 的设置脚本。
- AdGuard Home / Unbound 后端。
- 更多设备模板(Roku、Apple TV、三星 Frame、Google Home、Sonos)。
- WireGuard 伴侣模式(第二阶段——针对无法设置静态网关的移动设备)。
参见 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 这不是什么
- ❌ **不是** [Pi-hole](https://pi-hole.net/) / [AdGuard Home](https://adguard.com/en/adguard-home/overview.html) / [Blocky](https://0xerr0r.github.io/blocky/) 的 PSA 替代品 —— Nosey 通过每设备路由和精选模板**补充**它们。
- ❌ **不是** NIDS(无基于签名的威胁检测)—— 请使用 [Suricata](https://suricata.io/) 或 [Crowdsec](https://crowdsec.net/)。
- ❌ **不会**击败最顽固的追踪器 —— IP 锁定服务、ECH 加密握手和蜂窝网络回退都会削弱 SNI 检查。阅读 [docs/limitations.md](docs/limitations.md)。
## 许可证
MIT。随意使用、分叉、做任何你想做的。如果你发现值得拦截的新追踪域名,请针对模板提交 PR —— 这正是重点所在。
开发此项目,是因为 2018 年的隐私广告列表无法捕捉到 2026 年电视在做什么。标签:AV绕过, FastAPI, HTMX, L3网关, LAN监控, Pi-hole, Python, Rootkit, SNI检查, Web界面, Zeek, 取证捕获, 插件式监控, 无后门, 智能设备阻塞, 物联网安全, 网络安全, 设备注册表, 逆向工具, 透明网关, 阻塞列表, 隐私保护, 隐私审计, 隐私工具, 隐私监控