Разработанный Zed (M-Abozaid), esp32-c3-adblock — это DNS-блокировщик рекламы с открытым исходным кодом в стиле Pi-hole, который работает на плате/модуле микроконтроллера ESP32-C3 за $2 без необходимости в PSRAM. Он блокирует рекламу и трекерные домены на устройствах домашней или небольшой офисной сети путём фильтрации DNS-запросов.
Вместо хранения строк доменов в RAM проект хранит их как отсортированные 40-битные хеши FNV-1a во флеш-памяти и использует бинарный поиск для проверки DNS-запросов. Когда поступает UDP DNS-запрос, прошивка на C++ извлекает домен, хеширует его (включая родительские суффиксы) и выполняет бинарный поиск по таблице хешей во флеш-памяти. Если домен находится в списке блокировки, ESP32-C3 возвращает 0.0.0.0 для блокировки запроса. В противном случае он пересылает запрос вышестоящему DNS-серверу и возвращает ответ клиенту. Этот метод позволяет разместить более 140 000 доменов в ~0,7 МБ флеш-памяти, используя только ~50 КБ RAM. Один поиск занимает около 10 мс (включая время кругового обмена по WiFi), требуя около 18 чтений из флеш-памяти.

Требования и особенности esp32-c3-adblock:
- Беспроводной модуль – 16-контактный ESP32-C3 Super Mini модуль
- SoC – Espressif Systems ESP32-C3FH4
- CPU – одноядерный 32-битный микроконтроллер RISC-V @ до 160 МГц
- Системная память – 400 КБ SRAM
- Хранилище – 4 МБ флеш-памяти
- Беспроводная связь – 2,4 ГГц WiFi 4
- USB – порт USB Type-C для программирования
- Керамическая антенна
- Также проверено сообществом на классических платах ESP32 (DevKit / WROOM)
- SoC – Espressif Systems ESP32-C3FH4
- Хранилище — требуется минимум 4 МБ флеш-памяти
- ~0,7 МБ флеш-памяти используется для 140 000+ доменов
- Хранит домены непосредственно во флеш-памяти в виде отсортированных 40-битных хешей FNV-1a (по 5 байт каждый), а не строк в ОЗУ.
- Производительность DNS-синкхола:
- Время поиска — ~10 мс (включает ~18 операций чтения из флеш-памяти и RTT Wi-Fi)
- Варианты емкости — ~141 тыс. доменов (почти без коллизий), ~250 тыс. доменов (с двумя разделами приложений для OTA-обновления прошивки), или до ~537 тыс. доменов (один раздел приложения, ~1 коллизия).
- Безопасность
- Для конечных точек, изменяющих состояние, требуется HTTP Basic Auth
- HTML-экранирование пользовательских доменов для предотвращения XSS
- Защищено от CSRF-атак
- Питание – 5 В через USB (требуется стабильный источник питания для предотвращения просадок напряжения питания радиомодуля)
- Корпус – предоставлен STL-файл корпуса для 3D-печати под форм-фактор ESP32-C3 SuperMini

Проект включает веб-панель, доступную по адресу http://c3adblock.local, где пользователи могут просматривать заблокированные и разрешённые DNS-запросы по каждому клиенту, блокировать определённые устройства и добавлять пользовательские домены в список блокировки. Первоначальная настройка Wi-Fi выполняется через портал авторизации, поэтому пользователям не нужно жёстко прописывать свои учётные данные Wi-Fi.
Он также поддерживает обновления по воздуху (OTA) как прошивки, так и списков блокировки, а также запланированные автоматические обновления, которые загружают готовые файлы списков блокировки с указанного URL. На плате ESP32-C3 с 4 МБ обновления прошивки по OTA требуют двух слотов приложения, оставляя около 1,3 МБ флеш-памяти для списка блокировки. Это позволяет устройству хранить до 250 000 доменов. Чтобы использовать более крупный список блокировки на 537 000 доменов, пользователям нужно переключиться на схему разделов с одним приложением, что отключает OTA-обновления прошивки.

Что странно — это 40-битная ширина; разработчик утверждает, что это оптимальный размер для такого бюджета флеш-памяти. При 141 тыс. доменов коллизии почти отсутствуют. Расширение списка до агрессивных 537 тыс. доменов приводит примерно к одной коллизии (одному ложно заблокированному домену). Переход к стандартному 32-битному хешу сэкономил бы место во флеш-памяти, но вызвал бы около семи коллизий при 250 тыс. доменов.
Разработчик упоминает, что проект вдохновлён s60sc’s ESP32_AdBlocker , но это независимая реализация, использующая флеш-память вместо PSRAM для хранения больших списков блокировки. Тот же подход можно использовать на более мощных чипах. Например, ESP32-S3 с 16 МБ мог бы хранить около 2,7 млн доменов с использованием 40-битных хешей по сравнению с примерно 466 000 доменов, хранимых в виде строк в 8 МБ PSRAM.
Исходный код на C++, инструкции по сборке в PlatformIO и корпус для 3D-печати можно найти в репозитории GitHub .
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.
