Египетский разработчик ZedAxis собрал резервный DNS-фильтр для блокировки рекламы на микроконтроллере ESP32-C3 SuperMini. Всего за 2—5 долларов. В его домашней сети основным маршрутизатором выступает Pi-hole на Raspberry Pi — он раздаёт адреса через DHCP и фильтрует DNS. Но когда Pi-hole перезагружается или падает, клиенты теряют защиту. ZedAxis решил эту проблему крошечной страховкой.
У ESP32-C3 всего 400 КБ оперативной памяти и 4 МБ флеш-памяти. Хранить обычный текстовый список заблокированных доменов на таком объёме нереально — слишком много данных. Выход нашёлся в хэшировании: 40-битные хэши FNV-1a. 32 бита давали бы слишком много коллизий, 64 — тратили бы место впустую. Сборка прошивки скачивает публичные блоклисты, чистит дубликаты и комментарии, хэширует каждый домен, сортирует получившийся массив и записывает его во флеш. При входящем DNS-запросе устройство хэширует имя тем же способом и выполняет бинарный поиск по отсортированной таблице. Совпадение — запрос блокируется, нет — уходит к вышестоящему резолверу. На ответ уходит около 10 миллисекунд, а сама прошивка жрёт всего ~50 КБ RAM.
Есть хитрый компромисс. ESP32 по умолчанию резервирует вторую копию прошивки на флеше для беспроводных OTA-обновлений. Если отказаться от OTA, можно задействовать этот раздел под базу блокировок. С OTA — около 250 000 доменов, без него — уже 537 000. Питается всё от USB-порта на интернет-шлюзе Huawei OptiXstar — данные через кабель не идут, только «пять вольт, спасибо». Вся связь — по встроенному Wi-Fi.
Заменить полноценный Pi-hole или AdGuard Home эта штука не способна. Примитивная панелька, никакой детальной статистики по клиентам, история запросов и настройки отсутствуют. Но это и не нужно: устройство сидит тихо, потребляет десятки миллиампер и включается только когда основная DNS-ферма уходит на перезагрузку. Клиенты в это время не падают на дефолтный резолвер роутера без блокировок. ZedAxis просто взял микроконтроллер за $5 с 400 КБ RAM и решил: «Да, сойдёт».