Если бы интернет был подъездом, реклама давно бы расклеила объявления даже на коте у консьержа. Но нашёлся маленький дворник с метлой: плата ESP32-C3 SuperMini за несколько долларов, которая умеет отгонять мусорные домены от всей домашней сети.
Проект сделал египетский full-stack-разработчик ZedAxis, он же @M-Abozaid на GitHub. Идея звучит почти дерзко: взять микроконтроллер с Wi-Fi, 400 КБ оперативной памяти и 4 МБ flash — и превратить его в резервный DNS-фильтр рекламы.
Не сервер. Не мини-ПК. Не Raspberry Pi.
Малютку.
Обычно для таких задач ставят Pi-hole или AdGuard Home. Это удобные и мощные решения: статистика, журналы запросов, красивые панели, настройки на любой вкус. Но ZedAxis нужен был не главный командир сети, а запасной часовой. Такой, который молча стоит у ворот, пока основной Pi-hole перезагружается или временно недоступен.
Главная магия проекта — в упаковке данных.
Обычный текстовый список из сотен тысяч доменов в такую плату просто не влезет. Он распухнет, как чемодан перед отпуском: вроде всё нужное, но молния уже просит пощады. Поэтому автор не хранит домены в виде текста. Он превращает их в 40-битные FNV-1a хэши.
Почему не 32 бита? Слишком много совпадений. Почему не 64? Жалко места. 40 бит — золотая середина: компактно и достаточно надёжно для такой задачи.
Сборка прошивки работает как кухонный комбайн для блоклистов. Она скачивает публичные списки, выкидывает комментарии и дубликаты, хэширует домены, сортирует результат и записывает готовую базу во flash-память ESP32.
А дальше всё просто.
Приходит DNS-запрос. Устройство хэширует имя домена тем же способом и ищет его в отсортированной таблице бинарным поиском. Нашло совпадение? Запрос блокируется. Не нашло? Уходит к вышестоящему DNS-серверу.
По словам автора, прошивка использует около 50 КБ RAM, а ответ на заблокированный запрос занимает примерно 10 миллисекунд. Моргание — и готово!
Есть и инженерный компромисс. Обычно ESP32 хранит две копии прошивки, чтобы безопасно обновляться по воздуху. Если оставить OTA-обновления, база вмещает примерно 250 тысяч доменов. Если отказаться от них и отдать вторую область памяти под список, лимит вырастает до 537 тысяч доменов.
Да, это не полноценная замена Pi-hole. Здесь нет богатой аналитики, истории по клиентам и россыпи переключателей. Зато есть устройство размером с ноготь, которое питается от USB-порта роутера и общается по Wi-Fi. Роутер говорит: «Вот тебе 5 вольт». ESP32 отвечает: «Спасибо, я на посту».
И в этом вся прелесть. Иногда технологии впечатляют не гигагерцами и терабайтами, а умением сделать много из почти ничего. Маленькая плата, крошечная память, аккуратный алгоритм — и вот уже полмиллиона назойливых доменов стоят за дверью. Кто сказал, что герои обязаны быть большими?
