-
克隆地址:
https://github.com/M-Abozaid/esp32-c3-adblock -
默认的编译环境:VSCode PlatformIO Arduino项目
编译工程,需要安装
VSCode软件,然后安装PlatformIO IDE,在PlatformIO IDE中,安装Espressif 32。 -
esp32c3板子带USB转串口芯片的
platformio.ini配置:\esp32-c3-adblock\platformio.ini

c
[platformio]
default_envs = c3
[env]
platform = espressif32
framework = arduino
board_build.filesystem = littlefs
board_build.partitions = partitions.csv
monitor_speed = 115200
[env:esp32dev]
board = esp32dev
[env:c3]
board = esp32-c3-devkitm-1
; build_flags =
; -DARDUINO_USB_MODE=0
; -DARDUINO_USB_CDC_ON_BOOT=0
; 核心配置:将 Flash 模式设置为 DIO
board_build.flash_mode = dio
不添加flash_mode=dio选项,默认的flash mode应该是qio,烧录后,没有反应。
- ESP32C3板子不带USB转串口芯片的板子
c
[platformio]
default_envs = c3
[env]
platform = espressif32
framework = arduino
board_build.filesystem = littlefs
board_build.partitions = partitions.csv
[env:esp32dev]
board = esp32dev
[env:c3]
board = esp32-c3-devkitm-1
; build_flags =
; -DARDUINO_USB_MODE=1
; -DARDUINO_USB_CDC_ON_BOOT=1
- 其它需要自己配置内容:
esp32-c3-adblock\src\secrets.h(src/secrets.example.h文件重命名而来)
c
#pragma once
// Copy this file to secrets.h and fill in your WiFi credentials.
// secrets.h is gitignored so your credentials never get committed.
static const char* WIFI_SSID = "YOUR_WIFI_SSID";
static const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
// Auth for the dashboard's state-changing endpoints (/ban, /addblock, /upload,
// /update, /setupdate, /forgetwifi) and for network OTA (ArduinoOTA). These used
// to be wide open to anyone who could reach the device on the LAN --- pick real
// values here, ideally not the same as your WiFi password.
static const char* WEB_USER = "admin";
static const char* WEB_PASS = "CHANGE_ME_WEB_PASSWORD";
static const char* OTA_PASS = "CHANGE_ME_OTA_PASSWORD";
推荐修改
src/main.cpp:25 的 Quad9 9.9.9.9(跨境),改为国内的,减少延时。
c
#ifndef UPSTREAM_IP
// Tencent DNSPod (~28-31 ms measured from this network).
// Previous default was Quad9 9,9,9,9: 190-260 ms here with peaks near 700 ms, which
// busted UPSTREAM_WAIT_MS on any WiFi hiccup and made forwarded lookups fail.
// Other mainland options measured: 223.5.5.5 32-58 ms, 114.114.114.114 30-32 ms.
#define UPSTREAM_IP 119, 29, 29, 29
#endif
| 上游 | 平均 | 峰值 |
|---|---|---|
| 9.9.9.9(原来) | 190~260 ms | bilibili 695 / jd 468 |
| 腾讯 119.29.29.29 | 28~31 ms | 34 |
| 114DNS | 30~32 ms | 35 |
| 阿里 223.5.5.5 | 32~58 ms | 63 |
-
后台:
http://c3adblock.local/可以上传编译好的DNS广告域名列表固件("blocklist.bin")

-
连接和更新拦截域名固件信息:

📚过滤表获取源
https://github.com/privacy-protection-tools/anti-AD/tree/masterhttps://anti-ad.net/
blocklist.bin编译
- 编译工具在工程目录下的"tools"文件夹。
- Python命令:
c
python tools/build_blocklist.py data/blocklist.bin tools/domains.txt
surge2.txt需要补充的过滤源。
✅ C3-AdBlock 能生效的广告/网站场景
核心:只拦截【第三方独立域名】的广告、统计、追踪域名(和Pi-hole原理完全一样)
- 网页里的第三方横幅广告、弹窗广告
网页正文加载完成后,额外去广告服务器拉取图片、JS脚本的广告:
- 例:新闻网站、资讯站、下载站侧边广告、弹窗广告
- 广告域名:
doubleclick.net、googleadservices.com、各类广告联盟域名
你刚才测试的
doubleclick.net就属于这类,可以被拦截。
- 网站、APP的统计/追踪埋点(最稳的效果)
Google Analytics、各类网站访问统计、用户行为追踪像素、埋点脚本:
- 作用:不仅去广告,还能阻止网站收集你的浏览行为
- 常见:
google-analytics.com、各类第三方打点域名
- 手机APP内广告(游戏、工具类APP)
很多免费安卓APP、小游戏的开屏广告、插屏广告、横幅广告,广告SDK请求独立广告域名,可以拦截。
比如工具APP启动弹出广告,原理是APP去拉取广告SDK域名,命中黑名单直接返回0.0.0.0,广告加载失败。
4. 恶意域名、挖矿域名、钓鱼站点
如果你的blocklist加入了恶意域名列表,也可以一并拦截。
❌ 无法拦截的广告(重点!很多广告拦不掉)
根本原因:广告和网页主体内容,共用同一个域名(第一方广告),DNS无法区分同域名下哪些资源是广告。
- YouTube视频内贴片广告(最典型)
视频、广告全部来自youtube.com同一个域名。
- 如果把
youtube.com加入黑名单,视频本身也打不开; - DNS层面无法区分这个域名下哪个请求是视频、哪个是广告。
-
社交媒体信息流原生广告(朋友圈、小红书、抖音信息流广告)
广告内容直接由平台自身服务器返回,域名不变。DNS拦截无效。
-
网站内置广告(同域名内嵌广告)
网站自己服务器投放广告(广告和网页是同一个域名),无法拦截。
-
使用加密DNS(DoH/DoT)的设备
手机开启私有DNS、浏览器DoH,查询不走UDP 53,直接绕过C3-AdBlock,广告拦截失效。
-
直接IP访问资源
不走域名解析的请求,DNS系统完全看不到,无法拦截。
📌 视觉上的小缺陷
DNS拦截不会自动清除网页上广告占位框 。
浏览器仍然会预留广告位置,只是广告图片/脚本加载失败,页面会留下空白框。
浏览器插件uBlock Origin可以做页面元素隐藏(CSS过滤),C3-AdBlock做不到。
- 简单总结
✅ 适合:新闻站、论坛、下载站的第三方横幅/弹窗广告;APP开屏插屏广告;网页统计追踪脚本。
❌ 不适合:YouTube视频广告、抖音/小红书信息流原生广告、网站同域名内置广告。