ESP32-фильтр рекламы за $5 уместил базу из 537 000 доменов и отвечает на заблокированные DNS-запросы примерно за 10 мс. Проект сделал разработчик ZedAxis, он опубликовал код на GitHub.
В основе — плата ESP32-C3 SuperMini. Это маленький Wi-Fi-микроконтроллер с 400 КБ ОЗУ и 4 МБ флеш-памяти. По меркам домашнего сервера смешные цифры. По меркам встроенной электроники — нормальная площадка для аккуратного трюка с данными.
ZedAxis использует устройство не как основной фильтр, а как резервный DNS. Основной сервер у него — Pi-hole на Raspberry Pi. ESP32 подхватывает сеть, когда Pi-hole перезагружается или временно недоступен.
537 000 доменов в 4 МБ флеша
Главная находка проекта — не хранить домены обычным текстом, потому что такой список быстро съедает всю память ESP32-C3. Вместо этого сборка превращает каждый домен в короткий 40-битный хеш FNV-1a, сортирует базу и записывает ее во флеш-память микроконтроллера.
Схема выглядит просто, но она хорошо ложится на слабое железо. Скрипт скачивает публичные блоклисты, убирает дубликаты и комментарии. Потом он хеширует оставшиеся домены, сортирует таблицу и кладет ее в прошивку.
Когда приходит DNS-запрос, ESP32 хеширует имя хоста тем же способом. Затем прошивка делает бинарный поиск по отсортированной таблице. Совпадение есть — запрос блокируется. Совпадения нет — запрос уходит к вышестоящему DNS-резолверу.
Автор выбрал именно 40-битный FNV-1a. 32-битный вариант давал бы слишком много коллизий на базе такого размера. 64-битный расходовал бы больше места, а флеша здесь всего 4 МБ.

- Плата: ESP32-C3 SuperMini
- ОЗУ: 400 КБ физически, около 50 КБ использует прошивка
- Флеш-память: 4 МБ
- База блокировки: до 537 000 доменов без OTA
- Задержка: около 10 мс для заблокированных запросов
Цена памяти: OTA или большая база
У проекта есть жесткий компромисс с обновлениями прошивки по воздуху. ESP32 обычно держит во флеше две копии прошивки, чтобы не превратиться в кирпич при неудачном OTA-обновлении. Если отказаться от этой страховки, вторую область можно отдать под DNS-базу.
С включенным OTA проект вмещает около 250 000 заблокированных доменов. Без OTA лимит растет примерно до 537 000 доменов. Для микроконтроллера дешевле обеда это редкий пример, когда архитектурная экономия важнее грубой мощности.

Но это не замена полноценному Pi-hole или AdGuard Home. У ESP32-проекта есть простая панель, но нет подробной статистики по клиентам. Нет истории запросов и тонкой настройки, за которую такие системы любят администраторы домашних сетей.
Зато устройство почти не занимает места и потребляет считанные десятки миллиампер. В домашней стойке оно может жить как резервный DNS-фильтр. Клиенты не сваливаются на обычный резолвер роутера, если основной сервер ушел на перезагрузку.
Самая бытовая деталь — питание. ZedAxis подключил плату к USB-порту домашнего оптического шлюза Huawei OptiXstar. USB здесь дает только 5 В питания, а все сетевое общение идет через встроенный Wi-Fi ESP32.
Автор проекта называет цену платы около $2. В рознице такие ESP32-C3 SuperMini чаще встречаются ближе к $5, то есть примерно за 500 рублей, если не считать доставку и разброс цен у продавцов.