精准排除误杀域名:完整实战指南)
esp32-c3-adblock怎么用AdGuard白名单规则()精准排除误杀域名完整实战指南【免费下载链接】esp32-c3-adblockPi-hole-class DNS ad-blocker on a $2 ESP32-C3 (no PSRAM): 537k domains as 40-bit FNV-1a hashes in flash, binary-searched. UDP DNS sinkhole web dashboard. https://youtube.com/shorts/RaxszOUMi8E?featureshare项目地址: https://gitcode.com/GitHub_Trending/es/esp32-c3-adblockesp32-c3-adblock是一个运行在 2 美元 ESP32-C3 开发板上的 Pi-hole 风格DNS 广告拦截器无需 PSRAM它把 53 万 广告域名压缩成 40 位 FNV-1a 哈希存入闪存每次查询约 10 毫秒完成二分查找。默认拦截清单偏向激进偶尔会把正常网站误杀。好消息是它原生支持AdGuard 白名单规则语法让你在重建拦截表时精准豁免指定域名——全程只需本地重建一个blocklist.bin文件再通过网页面板无线上传。先搞懂原理误杀从哪来又如何救场 ️拦截设备的工作流非常直接DNS 查询 ──▶ 提取域名 ──▶ 计算 FNV-1a 哈希含所有父级后缀 ──▶ 在闪存哈希表中二分查找 ├─ 命中 ──▶ 应答 0.0.0.0被拦截 └─ 未命中 ──▶ 转发给上游 DNS这里有两个关键点直接决定了误杀的产生父域名连带子域名只要bad.example.com在清单里app.bad.example.com、api.bad.example.com全部被拦设备端只认哈希闪存里存的是哈希值不是域名字符串设备没有运行时的逐条白名单接口——所以豁免必须在构建阶段完成。规则正是构建阶段的减法工具构建脚本 tools/build_blocklist.py 会把||domain^行的域名收进 allow 集合最终从拦截集合中扣除见 tools/build_blocklist.py输出净拦截表。三步快速上手白名单从零到生效第 1 步编写 白名单规则在任意文本文件中把要豁免的域名写成 AdGuard 基础规则格式每行一条||good-site.example.com^ ||forum.good-site.example.com^⚠️新手最容易踩的坑||双竖线是必需的。只写good-site.example.com不会被识别为白名单规则而是被当作无法表达的语法直接跳过正则定义见 tools/build_blocklist.py。规则会被自动规范化转小写、去掉www.前缀和首尾的.所以||WWW.Good-Site.example.com.^与标准写法等价。第 2 步重建拦截表哈希表把清单文件URL 或本地路径均可可以多个混用传给构建脚本python3 tools/build_blocklist.py data/blocklist.bin my-blocklist.txt构建完成时终端会给出关键回执allowlisted : 2 removed (2 rules) ← 白名单生效的域名数 skipped rules : 14 ← 被跳过的无法表达规则数 hash entries : 99,998看到allowlisted计数符合预期说明规则确实命中并扣除了对应条目。相关构建行为详见 README.md。第 3 步OTA 上传到设备打开仪表盘http://c3adblock.local在Blocklist → Upload把新生成的blocklist.bin拖入即可——无需 USB 重新烧录。也可以在Remote auto-update配置定时拉取让设备自动保持最新。仓库中还附带了预构建的更新产物位于 docs/ 目录如firmware.bin、blocklist.bin。语法支持清单哪些规则能用哪些会被跳过 语法示例构建结果基础拦截‖ads.example.com^✅ 加入拦截集合白名单豁免‖ok.example.com^✅ 从拦截集合扣除带$修饰符‖a.com^$clientmobile⏭️ 跳过并计数无法表达正则 / 通配符/regex/、‖a*.com^⏭️ 跳过并计数外观规则##.ad-banner⏭️ 跳过并计数原因很简单设备端是 DNS 哈希查找只能按整个域名匹配无法表达仅对某客户端生效或URL 路径级过滤。被跳过的规则不会报错但都会计入skipped rules——这个数字偏大时说明源清单里有大量 DNS 层表达不了的规则换一份更适合的清单即可。 规则的局限两种误杀场景与对策 ⚠️场景一想让某个子域名独善其身父域名却整体被封。例如tracker.big-shop.com被拦但父域big-shop.com也在清单里。此时写‖tracker.big-shop.com^无效——因为查询子域时命中的是父域名的哈希。这正是哈希白名单的边界README 原文Anrule only un-blocks that exact entry。对策用‖big-shop.com^豁免整个父域连带其所有子域恢复访问或换用更精准的拦截源。场景二运行时才发现误杀想找页面按钮一键解封。仪表盘运行时接口只有两个/addblock自定义封禁与/unblock撤掉自己自定义的封禁见 src/main.cpp它们只管理手动添加的域名无法豁免闪存里的默认清单域名。所以标准流程只有一条路改清单 → 重建 → 上传。好消息是这条路完全无线化一分钟内可走完。另外提醒所有会改变状态的接口上传、解封等都需要 HTTP Basic Auth请在 src/secrets.h 中配置WEB_USER/WEB_PASS否则局域网内任何人都能改写你的拦截表。如何验证白名单是否真正生效 上传完成后用dig对照测试最直接dig c3-ip good-site.example.com # - 真实 IP 已豁免 dig c3-ip doubleclick.net # - 0.0.0.0 仍在拦截再打开仪表盘首页src/page.h查看 Total blocked / Total allowed 与按客户端拆分的计数豁免生效后对应设备的 blocked 计数应明显下降。常见问题速查 Q可以镜像 AdGuard Home 的 allowlist 吗可以。构建脚本明确支持 AdGuard / Adblock 基础规则格式直接把 AdGuard Home 的 allowlist 文件作为源传入即可--allow-missing参数可用于容忍个别源下载失败。Q白名单文件里能写注释吗普通行支持#注释但‖或开头的规则行不支持行尾注释——注释请单独成行。Q怎么确认规则没有静默失效盯住构建输出里的allowlisted : N removed。若写了规则但 N 为 0说明规则未命中常见原因少了‖‖、或该域名本就不在清单中。Q想测试构建逻辑是否正确仓库自带单元测试 tools/test_build_blocklist.py覆盖 hosts 行、域名解析等核心路径可运行验证。小结在 esp32-c3-adblock 中AdGuard白名单规则是构建阶段的精准减法——一条‖domain^就能把误杀域名连同整棵子域树一并豁免认清无法从被拦父域中拆出单个子域这一边界配合重建 OTA 上传的标准流程就能把误杀率压到最低。【免费下载链接】esp32-c3-adblockPi-hole-class DNS ad-blocker on a $2 ESP32-C3 (no PSRAM): 537k domains as 40-bit FNV-1a hashes in flash, binary-searched. UDP DNS sinkhole web dashboard. https://youtube.com/shorts/RaxszOUMi8E?featureshare项目地址: https://gitcode.com/GitHub_Trending/es/esp32-c3-adblock创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考