Насколько дёшево можно собрать аппаратный DNS-фильтр для блокировки рекламы? «Бесплатно», если вы готовы использовать списанное оборудование, которое выбрасывают. А если вам не так повезло? В эпоху RAMageddon даже Raspberry Pi обойдётся в пару сотен долларов. Но, знаете, вам не нужно ничего настолько мощного. На самом деле, можно использовать микроконтроллер за 5 долларов, чтобы собрать полностью функциональный фильтр блокировки рекламы, который блокирует более 500 000 доменов с задержкой около 10 мс.
Мы знаем, что это возможно, потому что египетский full-stack разработчик ZedAxis (@M-Abozaid на GitHub) уже собрал такой. Используя плату ESP32-C3 «SuperMini», он создал резервный DNS для своей домашней сети, который по-прежнему обеспечивает блокировку рекламы. Его основной маршрутизатор — это Pi-hole, то есть Raspberry Pi, на котором работает специализированное ПО для управления DHCP-адресацией и DNS-резолвингом со встроенной блокировкой рекламы. SuperMini служит резервом, когда Pi-hole перезагружается или недоступен.
Строго говоря, мы не видели творение ZedAxis в действии, но нет причин сомневаться, что оно работает. Семейство ESP32 — встраиваемых микроконтроллеров с Wi-Fi — хорошо известная величина, и эта функциональность никоим образом не выходит за пределы его возможностей. Более того, этот конкретный трюк позволяет использовать ESP32-C3 — урезанную по стоимости версию чипа, в которой нет 8 МБ PSRAM, как на некоторых старших моделях. (Существует МНОГО вариантов ESP32.)
Вместо этого ESP32-C3, используемый ZedAxis, имеет всего 400 КБ ОЗУ и 4 МБ флеш-памяти. С такими ограниченными характеристиками он не мог хранить список блокировки в открытом виде сколько-нибудь реального размера — это просто слишком много данных. Поэтому он поступил, как любой предприимчивый хакер: начал хешировать данные, чтобы уменьшить их объём. Используя 40-битные хеши FNV-1a (поскольку 32-битные дали бы слишком много коллизий, а 64-битные занимают слишком много места), он смог сохранить около 537 000 доменов во флеш-памяти устройства.
Хитрость, однако, не столько в самом хешировании. Вместо хранения самих доменов процесс сборки загружает один или несколько публичных списков блокировки, удаляет дубликаты и комментарии, хеширует каждый оставшийся домен в 40-битное значение, сортирует полученный список и записывает готовую базу данных во флеш-память ESP32. Когда приходит DNS-запрос, устройство хеширует запрашиваемое имя хоста тем же способом и выполняет бинарный поиск по отсортированной хеш-таблице. Если совпадение найдено, запрос блокируется. В противном случае запрос перенаправляется вышестоящему резолверу. По словам ZedAxis, готовая прошивка использует всего около 50 КБ ОЗУ, отвечая на заблокированные запросы примерно за 10 миллисекунд.
В конструкции скрыт ещё один изящный компромисс. Обычно ESP32 резервирует достаточно флеш-памяти для хранения двух полных копий своей прошивки, чтобы обеспечить обновления «по воздуху» (OTA) без риска, что неудачная прошивка сделает устройство незагружаемым. Если вам не нужны беспроводные обновления прошивки, вы можете использовать второй раздел прошивки под базу данных списков блокировки. С поддержкой OTA проект вмещает около 250 000 заблокированных доменов. Откажитесь от OTA — и количество подскочит примерно до 537 000 доменов на микроконтроллере, который обычно можно купить по цене обеда в фастфуде. ZedAxis называет цену в 2 доллара; мне не удалось найти платы SuperMini дешевле примерно 5 долларов США, но при такой цене о разнице можно не спорить.
Конечно, это не замена полноценной установке Pi-hole или AdGuard Home. Проект на ESP32 имеет примитивную панель управления, но не предоставляет детальной статистики по клиентам, исторических логов запросов или всех тех настроек, которые делают эти платформы привлекательными. Вместо этого он задуман как крошечная страховка. Он тихо сидит в сети, потребляет всего несколько десятков миллиампер, и если основной DNS-сервер исчезнет из-за перезагрузки или отключения питания, клиенты всё равно получат отфильтрованные DNS-ответы, а не откатятся к тому резолверу, который случайно настроен в маршрутизаторе.
Моя любимая деталь: ZedAxis питает всё устройство от USB-порта на задней панели своего шлюза, предоставленного провайдером, — Huawei OptiXstar, домашнего оптоволоконного шлюза. USB-соединение не передаёт данные; вся интеграция сводится к тому, что роутер говорит «вот 5 вольт», а ESP32 отвечает «спасибо». Просто порт является удобным источником питания для устройства, настолько маленького, что оно практически исчезает за роутером. Вся связь осуществляется через встроенный Wi-Fi-адаптер ESP32.
Понятия не имею, станут ли такие проекты распространёнными. Вероятно, нет, потому что большинство людей, желающих блокировать рекламу во всей сети, по-прежнему купят Raspberry Pi, б/у мини-ПК или запустят AdGuard Home в виртуальной машине. Тем не менее, освежает, когда кто-то смотрит на микроконтроллер за 5 долларов с 400 КБ ОЗУ и решает: «Да, сойдёт».
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Zak Killian




