DNS-блокировщик рекламы с открытым исходным кодом для ESP32-C3 поддерживает до более чем 500 000 доменов без PSRAM

Разработанный 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 SuperMini DNS ad blocker in a 3D printed enclosure with a USB-C to USB-A adapter for direct connection to a router
DNS-блокировщик рекламы ESP32-C3 SuperMini в 3D-печатном корпусе с адаптером USB-C – USB-A для прямого подключения к роутеру

Требования и особенности 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)
  • Хранилище — требуется минимум 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

ESP32-C3 SuperMini DNS ad blocker connected directly to a router's USB port
DNS-блокировщик рекламы ESP32-C3 SuperMini, подключённый напрямую к USB-порту роутера (изображение улучшено с помощью ИИ)

Проект включает веб-панель, доступную по адресу http://c3adblock.local, где пользователи могут просматривать заблокированные и разрешённые DNS-запросы по каждому клиенту, блокировать определённые устройства и добавлять пользовательские домены в список блокировки. Первоначальная настройка Wi-Fi выполняется через портал авторизации, поэтому пользователям не нужно жёстко прописывать свои учётные данные Wi-Fi.

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

ESP32 C3 AdBlock web dashboard showing blocklist statistics, connected clients, Wi Fi signal strength, memory usage, and custom blocked domains
Веб-панель, показывающая статистику списка блокировки, подключённых клиентов, уровень сигнала Wi-Fi, использование памяти и пользовательские заблокированные домены (изображение улучшено с помощью ИИ)

Что странно — это 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.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments