Categories: 工作・開発

ルーターに挿す約320円の広告ブロッカー、13万ドメインをRAM40KBで判定

自宅のネットワーク全体で広告をブロックするなら、Pi-holeを入れたRaspberry Piを常時動かすのが定番だ。もっと小さく安くと考えてESP32でやろうとすると、ブロック対象のドメインを覚えておくメモリーが足りず、PSRAMを積んだ高い方のチップが要る。M-Abozaid氏は、覚え方を変えることで、200円台のESP32-C3で同じことをやってのけた。ファームウェアはMITライセンスで公開している。

DNSシンクホールは、機器が「この広告配信サーバーの住所を教えて」と聞いてきたときに、本当の住所ではなく0.0.0.0を返す仕組みだ。行き先を失った通信はそこで止まる。仕掛けそのものは単純で、問題はリストの持ち方にある。

これまでのESP32向けの実装は、ドメインの文字列をそのままRAMに読み込んでいた。13万件ともなると数MBを食うため、8MBのPSRAMを積んだESP32-S3が必要になる。ボードの値段は8ドル(約1300円)ほどだ。

同氏は、文字列を捨ててハッシュを使った。ドメイン名をFNV-1aで8バイトの値に変え、並べ替えてフラッシュメモリーに書いておく。問い合わせが来たら、同じ計算をして二分探索するだけでいい。13万件でも1.02MBに収まり、RAMの消費は約40KBで済む。照合はキャッシュを効かせたフラッシュの読み出し17回ほどで終わり、時間はマイクロ秒の単位になる。ハッシュが64bitあるため、別のドメインと値がぶつかることもない。

結果として、必要なのはPSRAMなしのESP32-C3ボード1枚だけになった。価格は2ドル(約320円)ほどだ。USB-AとUSB Type-Cの変換ドングルを挟めば、ルーターの背面に空いているUSBポートにそのまま挿せる。電源も別の箱もいらない。ただし電源は安定したものを使うようにと同氏は書く。緩い変換アダプターだと、Wi-Fiの送信時に電圧が落ちて動作が不安定になる。

設定はブラウザーからできる。ダッシュボードでは機器ごとのブロック数と許可数が見え、特定の機器を遮断したり、独自のドメインを足したりもできる。ファームウェアとブロックリストは、最初の1回だけUSBでつなげば、あとはWi-Fi経由で更新できる。

フラッシュの容量には割り切りが要る。4MBのうちファームウェアの更新用に2つの領域を確保すると、ブロックリストに使えるのは約1.3MB、ドメインにして25万件ほどになる。53万7000件の厳しめのリストを丸ごと入れたい場合は、更新用の領域を諦める構成にする。

ケースのデータも同梱した。3Dプリンターで作れて、サポートは要らず、0.2mmの積層とインフィル15%ほどで済む。ただしアンテナのある側を樹脂で埋めないよう注意を促している。基板は動作中に45〜55℃になるため、通気口もふさがない。

関連情報

FabScene編集部

FabScene編集部