ガジェット

ESP32で53万ドメインを広告ブロック、5ドルの巧妙な実装

エジプトの開発者がESP32-C3マイコンを使い、53万7000ドメインをブロック可能なDNSフィルターを構築。40ビットFNV-1aハッシュを活用し、4MBフラッシュメモリに収めた。

8分で読める SINGULISM 編集チームが確認・編集

ESP32で53万ドメインを広告ブロック、5ドルの巧妙な実装
Photo by Vishnu Mohanan on Unsplash

Tom’s HardwareのZak Killian記者の報道によると、エジプトのフルスタック開発者ZedAxisが、わずか5ドルのマイクロコントローラーボード上で53万7000ドメインをブロック可能なDNSフィルターを実装した。

極限のリソース制約への挑戦

ZedAxisが使用したのはESP32-C3「SuperMini」ボードだ。このボードは400KBのRAMと4MBのフラッシュメモリしか搭載していない。一般的な広告ブロックリストは平文テキストで数MBから十数MBに達するため、そのまま格納することは不可能だった。

ZedAxisはこの問題に対して、ハッシュ圧縮という古典的かつ効果的な手法で対処した。具体的には40ビットのFNV-1aハッシュを採用した。32ビットでは衝突(異なるドメインが同じハッシュ値になる現象)が多すぎ、64ビットではメモリを浪費するため、40ビットが最適なバランス点だと判断した。

この手法により、53万7000のドメインをわずか4MBのフラッシュメモリに格納することに成功した。ファームウェアのRAM使用量は約50KBに抑えられ、ブロック判定の応答時間は10ミリ秒と実用的な速度を達成している。

ビルドプロセスの巧妙さ

このプロジェクトの真価は、単なるハッシュ化ではなく、ビルドプロセス全体の設計にある。ZedAxisのシステムは、ビルド時に公開されているブロックリストをダウンロードし、重複エントリとコメントを除去する。その後、各ドメインを40ビットのFNV-1aハッシュ値に変換し、ソート済みのハッシュテーブルとしてESP32のフラッシュメモリに書き込む。

DNSクエリが到着すると、デバイスはリクエストされたホスト名を同じアルゴリズムでハッシュ化し、ソート済みハッシュテーブルに対して二分探索を実行する。マッチした場合はクエリをブロックし、マッチしなければ上流のDNSサーバーに転送する。この仕組みにより、毎回のクエリで最小限の計算資源しか消費しない。

実運用での位置づけ

ZedAxisはこのデバイスを、自宅ネットワークのプライマリDNSフィルターであるPi-hole(Raspberry Pi上で動作する広告ブロックDNSサーバー)のバックアップとして設計した。Pi-holeが再起動中や何らかの理由で利用不可能な場合に、このESP32ベースのフィルターが自動的に処理を引き継ぐ構成だ。

ESP32ファミリーはWi-Fi対応の組み込みマイクロコントローラーとして広く知られており、このようなネットワーク処理は能力の範囲内である。ESP32-C3はコスト削減版であり、高価格帯のモデルが備える8MBのPSRAMを搭載していない。それでもZedAxisの手法は、限られたリソースで実用的なパフォーマンスを引き出している。

既存の類似プロジェクトとの比較

Pi-holeはラズベリーパイ財団のシングルボードコンピュータ上で動作し、完全なオペレーティングシステムを必要とする。システム全体の消費電力やコストを考慮すると、ESP32ベースのソリューションは桁違いに安価で、消費電力も極めて低い。

ただしPi-holeはDHCPサーバー機能や詳細な統計情報、カスタムフィルターの高度な設定が可能であり、機能的にはPi-holeの完全な代替とはならない。ZedAxisの実装は、あくまでバックアップ用途に特化したものであり、限られたリソースで最も重要な機能(DNSフィルタリング)だけを抽出した点に価値がある。

技術的課題と限界

40ビットのハッシュ値を使用する場合、衝突のリスクは32ビットよりは低いが、ゼロではない。53万7000エントリに対して40ビット(約1兆通り)のハッシュ空間は十分に大きいとは言え、稀に誤ったブロックが発生する可能性は否定できない。

また、この実装ではブロックリストの更新にはファームウェア全体の再ビルドと再書き込みが必要となる。動的なリスト更新機能は備えておらず、新しい広告ドメインが追加されるたびにビルドプロセスを実行しなければならない。この点は、定期的に自動更新されるPi-holeと比較すると明らかな制約だ。

オープンソースとしての可能性

ZedAxisはGitHub上でプロジェクトを公開している。ソースコードが公開されることで、他の開発者が自分用にカスタマイズしたり、新しい機能を追加したりすることが可能になる。現在のところ基本的なGUIも備えており、統計情報の表示やカスタムブロックドメインの設定が行える。

このプロジェクトは、組み込みシステムのリソース制約を巧妙なアルゴリズムで克服した好例と言える。特にESP32のような低コストデバイスで実用的なパフォーマンスを達成した点は、IoTやエッジコンピューティングの分野で応用可能な知見を提供している。

編集部の見解

本件は、リソース制約の厳しい環境でのデータ圧縮と検索の実装として高く評価できる。短期的には、ホームネットワークのバックアップDNSフィルターとして実用性がある。Pi-holeを運用しているユーザーであれば、ESP32-C3(約500円)で同様のバックアップを構築できるため、コスト対効果は極めて高い。ただし、誤ブロックのリスクを許容できるかどうかは個々の運用環境に依存する。 長期的な視点では、この40ビットハッシュと二分探索の組み合わせは、広告ブロック以外の用途にも応用可能だ。マルウェアドメインブロック、ペアレンタルコントロール、企業ネットワークでのアクセス制限など、同様のアプローチが適用できる分野は多い。また、ハッシュサイズを調整することで、より大規模なデータセットにも対応できる可能性がある。 編集部としては、このような軽量実装が実際の誤ブロック率やパフォーマンスに与える影響を、第三者による検証で確認したいところだ。理論上の衝突確率と実運用での実測値には差異が生じうる。

参考

よくある質問

ESP32-C3はどこで購入できるか
AliExpressやAmazon、日本の電子部品通販サイトで入手可能。価格は500円前後から。ただしESP32-C3には複数のバリエーションがあり、フラッシュメモリ容量に注意が必要。
Pi-holeの代わりにこのESP32フィルターをメインで使えるか
機能面ではPi-holeの完全な代替にはならない。DHCPサーバー機能や詳細な管理画面、自動更新などの機能は備えていない。特にカスタムフィルターの動的追加や誤ブロックの修正が容易でないため、メイン用途にはPi-holeを推奨する。
ブロックリストの更新はどのように行うか
現状では、ホストPCでブロックリストをダウンロード・ハッシュ化し、ファームウェアを再ビルドしてESP32に書き込む必要がある。自動更新機能は実装されていない。
出典: Tom's Hardware

コメント

← トップへ戻る