
Photo by Tanha Tamanna Syed on Pexels
預計閱讀 1 分鐘原文來源
核心概述
一套 Pi‑hole 風格的 DNS 廣告封鎖器,只需要 $2 的 ESP32‑C3 開發板,且 不需要 PSRAM。透過將 537,000 個網域以 40 位元 FNV‑1a 雜湊 形式儲存於內部 Flash,並以二分搜尋比對,單次查詢耗時約 10 毫秒,僅佔用約 50 KB RAM。
技術細節與實作
- 雜湊儲存:將每個網域轉換為 5 位元組(40 bit)雜湊,排序後寫入 Flash。此方式比傳統把字串載入 RAM 的做法省去大量記憶體,因而不需要外接 PSRAM。
- 位元長度選擇:40 bit 在此 Flash 預算下是最佳折衷。根據生日悖論,141k 網域時衝突率接近 0,537k 時約出現 1 個衝突;若改為 32 bit 可省 20% Flash,但在 250k 網域時會產生約 7 個衝突;64 bit 則每筆多耗 3 byte,對此專案而言屬浪費。
- 效能比較:在 16 MB 的 ESP32‑S3 上,同樣的雜湊表可容納約 2.7 百萬 網域,而使用 8 MB PSRAM 儲存字串僅能容納約 466,000 個。可見 Flash 雜湊 在多數情境下皆優於 PSRAM 字串。
- 建置工具:使用
build_blocklist.py可從任意 URL 或本機檔案產生OUT.bin,支援多種來源格式。若下載失敗會中斷建置,除非加上--allow-missing參數。 - 首次設定:若未設定
secrets.h或無法連網,裝置會啟動名為 C3‑AdBlock‑XXXX 的開放式 AP,提供 Captive Portal 讓使用者選擇 Wi‑Fi 並輸入密碼。之後可於儀表板http://c3adblock.local進行網路切換或忘記設定(需驗證)。 - 韌體 OTA:為支援空中更新,韌體佔用兩個應用槽,留下約 1.3 MB 給區塊清單,最多容納 250k 網域。若使用 537k 的「終極」清單,只能以單槽模式運行。
- 硬體外殼:專為 C3 SuperMini 設計的可列印外殼 STL 檔 (
hardware/esp32-c3-supermini-enclosure.stl) 已提供,方便 DIY 裝置化。
影響與未來展望
此方案證明 低成本 MCU 亦能執行大規模 DNS 封鎖,降低對 PSRAM 的依賴,讓硬體成本與功耗更具競爭力。未來若結合更大型的 ESP32‑S3 或 ESP32‑S2,將可在同樣的 Flash 空間內容納數百萬條規則,進一步提升家庭與小型辦公室的網路安全。對於熱衷開源與自製網路工具的社群而言,這是一個 「以少勝多」 的典範,也為其他資源受限的 IoT 裝置提供了可借鏡的設計思路。
分享