esp32-c3-adblock 完整教程一行编译参数切换上游 DNS不改源码 10 分钟搞定【免费下载链接】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 芯片上的 DNS 广告拦截器默认把未被拦截的查询转发给 Quad99.9.9.9。本文只做一件事不动任何源码在platformio.ini里加一行编译参数完成切换上游 DNS 到1.1.1.1或任一家公共解析器的操作全程约 10 分钟。动手前备齐更换上游 DNS 的三项前置条件开改之前先确认三件事能省掉后面一大半的排查时间设备已在网内运行C3 已配好 WiFi、能 ping 通浏览器打开http://c3adblock.local能看到仪表盘你所在网络能直连公共 DNS上游是公共解析器家庭宽带通常无需端口映射一台会执行dig的电脑dig是命令行里的 DNS 查询工具作用就是问一个域名、看谁答的、答了什么Windows / macOS / Linux 都有对应版本macOS 装好系统自带。三样齐了下面两步就能完成切换。为什么只改一行就行默认值藏在 #ifndef 保护里先看数据流向搞清楚上游到底管哪一段DNS 查询 ─▶ 提取域名 ─▶ 算 FNV-1a 哈希 ─▶ 在 flash 哈希表里二分查找 ├─ 命中 ──▶ 直接回 0.0.0.0广告域名到此为止 └─ 未命中 ─▶ 转发给上游 DNS ─▶ 把答复原路回给客户端FNV-1a 哈希可以理解为给域名算出的一个 5 字节指纹查表只认指纹。而上游 DNS就是设备请来的外援它只接收那些没被拦下来的查询真正负责查域名对应 IP。默认值在 src/main.cpp 的第 2429 行#ifndef UPSTREAM_IP #define UPSTREAM_IP 9, 9, 9, 9 // Quad9 #endif #ifndef UPSTREAM_PORT #define UPSTREAM_PORT 53 #endif#ifndef是条件编译守卫等价于作者留的后门如果你已经在编译命令里定义过UPSTREAM_IP我就用你的我这行默认值直接作废。所以只要编译时传进一个UPSTREAM_IP9.9.9.9自动被丢弃——源码一行都不用碰。结论就一句换上游 在编译参数里覆盖一个宏拦截逻辑零改动。三步完成切换从选解析器到烧录生效5.1 选哪家四家公共解析器怎么选解析器地址特点Quad9当前默认9.9.9.9安全向自带恶意域名/DGA 拦截Google8.8.8.8节点覆盖广多数地区延迟低Cloudflare1.1.1.1主打速度和隐私不记查询日志Cloudflare 家庭版1.1.1.2在 1.1.1.1 基础上额外屏蔽成人内容选择依据就看三点你所在网络到该地址的实测延迟、你能接受的日志政策、是否需要附加安全能力比如 Quad9 的恶意域名拦截、家庭版的成人过滤。三家在普通家宽下都能直连。拿不准就用ping 1.1.1.1/ping 9.9.9.9各测一下延迟再定。5.2 改参数platformio.ini 加一行 build_flags打开 platformio.ini定位到[env:c3]段在build_flags末尾追加一行读者本地构建环境里改仓库文件保持原样[env:c3] board esp32-c3-devkitm-1 build_flags -DARDUINO_USB_MODE1 -DARDUINO_USB_CDC_ON_BOOT1 -DUPSTREAM_IP1, 1, 1, 1 ; 上游 DNS 改为 Cloudflare 1.1.1.1想换 Google 就写-DUPSTREAM_IP8, 8, 8, 8切回 Quad9 写-DUPSTREAM_IP9, 9, 9, 9或直接删掉这一行。如果上游跑在非标准端口比如5353再补一行-DUPSTREAM_PORT5353 ; 仅非标准端口需要保存即可这一步是整个任务唯一的改动。5.3 烧录或 OTA两条路二选一✅路线 AUSB 烧录。设备插着 USB 线时在项目根目录执行pio run -t upload # 重新编译并把新固件刷进设备✅路线 B免拔线的 OTA。OTA 就是通过网络远程刷程序像手机在线升级。编译完成后把产物.pio/build/c3/firmware.bin拖进仪表盘http://c3adblock.local的Firmware → OTA update设备校验通过会自动重启进新镜像也可以在命令行直接推pio run -t upload --upload-port c3adblock.local --upload-protocol espota两条路殊途同归新固件带上了你的 UPSTREAM_IP重启后生效。验证生效两条 dig 分别查拦截分支和转发分支重新上电或 OTA 重启后在电脑上执行两条digc3-ip表示把查询指给 C3 设备dig c3-ip doubleclick.net # 拦截分支应仍返回 0.0.0.0 dig c3-ip github.com # 转发分支应返回真实 IP第一条证明广告拦截没被折腾坏——命中哈希的查询根本走不到上游跟换谁当外援无关第二条是重点只要拿到的 IP 是新上游解析的结果可对照dig 1.1.1.1 github.com的答复就确认流量真的换了路线。辅助信号打开仪表盘顶部Total allowed计数持续增长说明转发通道在正常干活。两条dig一拦一放都正常切换才算真正落地。容易踩的坑三个不相关别搞混上游 ≠ 拦截列表。拦截列表是 flash 里的 53.7 万个域名哈希想更新它是另一条独立链路用 tools/build_blocklist.py 重新构建blocklist.bin再经仪表盘Blocklist → Upload上传或配置Remote auto-update定时拉取跟这次改的上游互不干扰。换上游不会削弱拦截效果。命中查询在转发之前就被掐死上游只服务没被拦的那部分流量转发层还会丢弃过期应答、严格匹配事务 ID避免多客户端应答串包。设备断网是另一套问题。⚠️ 如果切换后设备连不上网那是配网WiFi 凭据的事与上游无关——用Forget WiFi或开机按住 BOOT 键重新配网即可详见 README.md 的 WiFi setup 一节。坑都绕开了改的是外援是谁不是拦什么也不是怎么上网。结尾改一行-DUPSTREAM_IP→pio run -t upload或仪表盘 OTA→ 两条dig确认一拦一放正常。相关资源src/main.cpp主程序入口UPSTREAM_IP默认值#ifndef守卫处与查询转发逻辑都在这里是只改一行就行的依据platformio.ini构建配置build_flags是本文唯一的改动位置src/page.hWeb 仪表盘页面源码OTA 上传与列表上传的入口对应这份页面README.md完整文档含配网、OTA、安全细节与已知坑位tools/build_blocklist.py拦截列表构建脚本属独立更新链路本文不涉及但常被误认成上游配置。【免费下载链接】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),仅供参考