ESP32-C3 靠 40-bit hash 將 53.7 萬封鎖網域塞入 4MB flash
3C 產品

ESP32-C3 靠 40-bit hash 將 53.7 萬封鎖網域塞入 4MB flash

圖片:via XDA Developers — https://www.xda-developers.com/this-tiny-esp32-powered-gadget-blocks-537000-domains-only-uses-50kb-of-ram/
TechLab 編輯部(譯)·

細板做到全屋 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 干擾或者長時間運作時都一樣穩定。

ESP32-C3 靠 40-bit hash 將 53.7 萬封鎖網域塞入 4MB flash

圖片: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 取捨嘅玩家。


參考來源

本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。

分享:WhatsAppThreadsTelegramFacebook