
幾十蚊整全屋廣告攔截後備 DNS:ESP32-C3 點塞入 53 萬網域
40-bit hash 慳盡 flash,但設定同攔截能力都有取捨
一塊拇指咁大嘅 ESP32-C3 SuperMini,插喺 router USB 取電,就可以幫全屋裝置擋一批廣告同追蹤網域。開發者 ZedAxis 將呢個開源項目定位做屋企 Pi-hole 嘅後備 DNS,硬件亦真係平:香港 eBay 同類通用板單板標價約 HK$51,連運費估算約 HK$78。不過呢啲 SuperMini 冇統一品牌,板材、USB 接頭同天線表現可以差好遠,買最平嗰塊要預咗有抽獎成分。
4MB flash 點容得落 53 萬個網域
Espressif 官方資料顯示,ESP32-C3 得 400KB SRAM;呢個項目所用通用板就配 4MB flash。直接儲存幾十萬條長短不一嘅網域名稱,RAM 同 flash 都頂唔順。ZedAxis 嘅做法係先下載 StevenBlack、HaGeZi 呢類公開 blocklist,清走註解同重複項目,再將每個網域轉成固定 5 bytes、即 40-bit 嘅 FNV-1a hash,排序後寫入 flash。
收到 DNS 查詢時,ESP32 會用同一方法計算網域同上層網域嘅 hash,再喺排序表做 binary search。撞中就回覆 0.0.0.0,等裝置連唔到廣告 server;搵唔到就交畀上游 DNS。537,000 個 hash 理論資料量約 2.56MiB,毋須將成張表搬入 RAM。開發者話 firmware 約用 50KB RAM,封鎖查詢連 Wi-Fi 往返約 10ms,但呢兩個數字暫時都係開發者自報。Tom’s Hardware 亦明講未見過部機實際運作,未有獨立壓力測試或者長時間穩定性數據。

圖片:Wikimedia Commons — Ubahnverleih(CC0)
537,000 係極限玩法,日常預設細好多
53 萬條呢個數字幾搶眼,但項目而家預設用 StevenBlack base 加 HaGeZi Light,約 140,000 條網域,亦刻意保留 WhatsApp 同社交平台。想塞到約 537,000 條,要轉用進取 blocklist,連社交、通訊服務都有機會一齊封。blocklist 每次更新、合併同去重後,實際數量亦會郁,唔應該當 537,000 係固定規格。
另一個代價係 OTA。正常 ESP32 會留兩個 firmware partition,更新失敗都仲有舊版本可開機;保留呢套安排,blocklist 空間約得 1.3MB,開發者估計最多放約 250,000 條。要上 537,000,就要改用單一 app partition,放棄 firmware OTA 嘅安全網。更新 blocklist 仍可經 dashboard 上載,但 firmware 出事時可能要重新插線刷機。
40-bit hash 夠慳位,碰撞風險冇消失
40-bit 係空間同碰撞之間嘅折衷。32-bit 再慳兩成,但開發者估算 250,000 條資料約有 7 次碰撞;64-bit 就每條多用 3 bytes。項目提到嗰次 537,000 條網域嘅 build 出現過一次相同 hash,建表工具亦會統計,再合併重複 hash。兩條本身已喺 blocklist 嘅網域撞 hash,其實照樣都會俾人封;較麻煩係某個正常網域碰巧撞中表內 hash,ESP32 又冇保留原始名稱核對,就會誤封。
現有 dashboard 可以加自訂封鎖網域,但暫時冇對應嘅 allowlist;如果 hash 碰撞搞到誤封,未必撳兩下就解決到,可能要重建 blocklist。就算冇 hash collision,公開清單本身都會偶爾收錯網域;進取清單愈大,網站登入、付款頁或者 app 某項功能突然失靈嘅機會亦愈高。
同 Pi-hole、公共 DNS、瀏覽器外掛差喺邊
Pi-hole 或 AdGuard Home 有完整查詢紀錄、按裝置分組、allowlist、regex 規則、DHCP 同較細緻嘅統計,搵誤封容易好多。ESP32 版本雖然已有簡單 dashboard、client 計數同自訂封鎖,但管理能力仍然薄,亦未識自己做 DHCP。第一次裝要準備 PlatformIO、填 Wi-Fi 資料、刷 firmware 同 blocklist,再喺 router 或個別裝置指定 DNS;對未玩過開發板嘅人,門檻明顯高過改一個公共 AdGuard DNS 地址。
公共攔廣告 DNS 最省事,冇硬件要養,代價係查詢交咗畀外部供應商,規則同紀錄控制亦少。瀏覽器外掛就可以睇完整網址、攔網頁 request 同收走空白廣告位,精準過只識網域名稱嘅 DNS,不過保護唔到電視、遊戲機同其他 app。三者可以互補,ESP32 呢類 DNS sinkhole 強項係低成本覆蓋全屋裝置。
YouTube 廣告同加密 DNS 照樣有機會走甩
DNS sinkhole 只可以決定某個網域去唔去到。YouTube 呢類服務可以用同一批網域派正常影片同廣告,成個網域封晒會連片都睇唔到,所以一般 DNS blocklist 未必擋得乾淨。手機 app、瀏覽器或者 IoT 裝置如果自行用 DNS-over-HTTPS、DNS-over-TLS,亦可能繞過 router 派發嘅本地 DNS;Mozilla 自己都指出,DoH 可以避開本地 DNS 過濾政策。
「secondary DNS」亦唔等於嚴格待命。DHCP 規格只話 DNS server 應按偏好排序,實際查邊一部由 router、作業系統同 client 實作話事,有裝置會喺主要 DNS 正常時照樣問第二部。結果可能係部分查詢長期經 ESP32,統計分散之餘,Pi-hole 嘅本地名稱同自訂規則亦未必同步。Pi-hole 重啟嗰陣,用呢個項目頂住一陣幾合理;不過想 failover 穩定,就要先用屋企啲裝置試清楚點揀 DNS,亦唔好當佢係買返嚟即插即用嘅完整攔廣告方案。
參考來源
- Tom's Hardware — Clever hacker fits 537,000 domains in a tiny $5 ESP32 ad-blocking dongle — firmware uses only around 50KB of RAM and can answer blocked lookups in 10 milliseconds — original report
- M-Abozaid/esp32-c3-adblock — 項目原始碼、blocklist 設計、OTA 取捨、預設清單同限制
- Espressif:ESP32-C3 系列規格比較 — 核對 ESP32-C3 嘅 400KB SRAM、flash 同冇外置 RAM 支援等規格
- Pi-hole 官方文件 — 核對 Pi-hole 嘅查詢資料庫、規則管理、DHCP、DNS cache 同管理功能
- RFC 2132:DHCP DNS Server Option — 核對 DHCP Option 6 只列出 DNS server 偏好次序,冇規定嚴格主副切換
- Mozilla:Firefox DNS over HTTPS — 說明 DoH 可以繞過本地 DNS resolver 同過濾政策
- AdGuard 公共 DNS 設定頁 — 比較免硬件公共攔廣告 DNS 嘅功能同設定方法
- eBay 香港:ESP32-C3 SuperMini 刊登 — 核對香港可落單嘅單板標價、運費估算同通用板身份
本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。







