
ESP32-C3 靠 40-bit hash 將 53.7 萬封鎖網域塞入 4MB flash
細板做到全屋 DNS 過濾,但容量、更新同穩定性有明顯取捨
開發者 ZedAxis(GitHub 帳戶 M-Abozaid)整咗個 ESP32-C3 DNS sinkhole,聲稱用約 50KB RAM,就可以擋住多達 537,000 個網域。數字睇落幾誇張,但個項目有趣嘅位其實係佢點用盡 4MB flash,同埋當中犧牲咗啲咩。屋企已經有 Pi-hole、又想加個細型後備 DNS 嘅話,呢個玩法幾值得研究;不過想插電即用,就未到嗰個程度。
五個 byte 收起一個網域
ESP32-C3 冇 PSRAM,開發者冇將成份純文字清單塞入 RAM。編譯清單嗰陣,script 會下載來源、清走註解同重複項目,再將每個網域轉成 40-bit FNV-1a hash。每筆資料固定佔 5 bytes,537,000 筆大約要 2.56MiB,放入 4MB flash 就合理得多。hash 排好次序之後,DNS 查詢入到嚟會用同一方法轉換,再二分搜尋;命中就回覆 0.0.0.0,冇命中就交畀上游 DNS。
二分搜尋 53.7 萬筆資料,理論上大約查 19 次就有結果,毋須逐行掃完整份清單。開發者話封鎖查詢約 10ms,README 補充呢個數字包括 Wi-Fi round-trip,RAM 用量約 50KB。不過暫時未見獨立測試,所以呢兩個數字只可以當係作者自報表現,未足以證明多人同時查詢、有 Wi-Fi 干擾或者長時間運作時都一樣穩定。

圖片:Wikimedia Commons — Alecv(CC BY-SA 3.0)
53.7 萬模式食咗 firmware OTA 空間
標題入面最搶眼嗰個 537,000,其實跟住一個幾大取捨。ESP32 做 firmware OTA 通常要留兩個 app slot,等新版本寫入另一格、驗證後先重啟。呢個項目保留 OTA 時,blocklist 空間約 1.3MB,上限約 250,000 個網域;要裝「ultimate」53.7 萬清單,就要改用 single-app partition,放棄 firmware OTA,日後更新 firmware 要再駁 USB 燒錄。
開發者預設用 StevenBlack base 加 HaGeZi Light,約 140,000 個網域,亦標明以唔影響 WhatsApp 同社交平台為方向。呢個設定佔約 0.7MB,可以保留 firmware 同 blocklist 經 Wi-Fi 更新,碰撞風險亦低好多。對日常家居網上過濾嚟講,清單夠準、容易更新,通常實際過追求最大筆數;網域多三倍,唔代表廣告一定少三倍。
40-bit 有細微誤封代價
hash 只保留指紋,裝置見唔到原本網域名。如果兩個唔同網域撞中同一個 40-bit 值,清單以外嗰個網域都可能俾佢擋咗。作者按 birthday bound 估算,約 141,000 筆時接近零次碰撞,去到 537,000 筆就約有一次。呢個水平對家用廣告過濾未必嚴重,但誤封發生時會較難查,因為裝置冇原始字串可以直接指出邊兩個網域撞 hash。
同 Pi-hole、AdGuard Home 差喺管理能力
ESP32-C3 呢套有簡單 dashboard、每部 client 嘅封鎖及放行次數、自訂網域,同埋 blocklist 更新。不過 Pi-hole 可以兼任 DHCP、有 DNS cache、查詢記錄、群組管理同較完整嘅規則控制;AdGuard Home 亦有成熟嘅 client 管理、記錄同加密 DNS 功能。ESP32 版個定位較似一個慳電、小巧嘅 DNS 篩選器,或者主 DNS 重啟嗰陣頂住一陣,唔適合當成同級替代品。
設定門檻亦唔算低:要準備 PlatformIO、Python,填入 Wi-Fi 資料,建立 blocklist,再分開燒錄 firmware 同 filesystem。之後仲要確保個 IP 唔會變,再喺 router、DHCP 或每部裝置指定佢做 DNS。項目暫時未識做 DHCP server,所以單靠插入 router USB 只係攞電,網上通訊仍然行 Wi-Fi,DNS 設定要自己處理。
Secondary DNS 唔一定乖乖排隊
作者原本用佢做 Pi-hole 嘅 secondary resolver,但「secondary」喺唔同 client 上未必代表只會等主 DNS 死咗先用。以 Windows 官方描述為例,第一個 server 一秒冇回覆,系統已可查第二個,之後甚至會同時查多個 server;router、手機同 IoT 裝置亦各有自己做法。想避免過濾結果時有時冇,兩邊最好用相近清單,裝好之後亦要逐類裝置驗證,唔好單憑 DNS 欄位次序當成可靠 failover。
DNS sinkhole 本身亦只睇網域。廣告同正常內容共用同一網域時,擋網域可能連內容一齊消失;app 或瀏覽器若果用 DoH、自訂 DNS 或直接連 IP,亦可以繞過屋企呢層過濾。佢可以減少廣告同部分追蹤請求,但代替唔到瀏覽器內容攔截、惡意程式防護、系統更新同 router 防火牆。呢個項目最抵玩嘅版本,大概係保留 OTA 嘅約 14 萬清單設定,53.7 萬模式則較適合想研究 flash 空間同 hash 取捨嘅玩家。
參考來源
- XDA Developers — This tiny ESP32 gadget blocks 537,000 domains while using just 50KB of RAM — original report
- M-Abozaid/esp32-c3-adblock — 開發者原始碼同 README,核對 hash 設計、預設清單、碰撞估算、設定方法同 OTA 取捨。
- Espressif ESP32-C3 Partition Tables — 官方文件解釋 single-app、OTA app slot 同 flash 分區原理。
- Pi-hole Documentation — 官方資料,用嚟比較 Pi-hole 嘅 DNS sinkhole、DHCP、cache 同管理功能。
- Microsoft:DNS client resolution timeouts — 官方資料,說明多個 DNS server 下嘅查詢次序、timeout 同 failover 行為。
- Mozilla:Firefox DNS over HTTPS — 說明 DoH 可以繞過本機 DNS resolver 同網上過濾政策。
- AdGuard DNS:DNS filtering — 官方背景資料,說明 DNS 層封鎖面對共用網域廣告時嘅限制。
- Tom’s Hardware:Clever hacker fits 537,000 domains in a tiny ESP32 — 較早報道同作者訪查,補充項目用途,同時明確表示未親眼驗證運作。
本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。







