Przejdź do treści

Adblocker na płytce ESP32-C3 za 26 zł. Cała sieć domowa bez reklam

Rejestr pomiarowy: biała karta blokera DNS na płytce ESP32-C3 z pomiarami 537 000 domen na liście, około 50 KB RAM, około 10 ms odpowiedzi z Wi-Fi i ceny płytki 25,90 zł w Polsce, pomarańczowa pieczątka REKLAMY OFF, kapsuły na wybrzeżu: Pi-hole style, OTA co tydzień, licencja MIT

Siedmego października wątek na Hacker News zebrał 188 punktów i ponad 80 komentarzy dla projektu, który po polsku przeszedł niezauważony, choć duże serwisy anglojęzyczne pisały o nim już w lipcu. Nazywa się esp32-c3-adblock, leży na GitHubie pod licencją MIT i odsiewa reklamy oraz trackery dla całej sieci domowej, odpowiadając na zapytania DNS zamiast prawdziwego resolvera. Sprzęt to płytka za 25,90 zł, wpięta przez dongle USB-A do USB-C w wolny port routera i zasilana z tego portu. Nie ma tu systemu operacyjnego, dysku ani wentylatora. Jest mikrokontroler, 4 MB flasha i sposób na zmieszczenie setek tysięcy zablokowanych domen we flashu płytki, przy około 50 kilobajtach RAM.

Tekstu nie poprzemy własnym testem, bo płytki nie mamy: opisujemy README, pomiary cytowane przez Tom’s Hardware i krytykę z wątku HN, z linkiem przy każdym twierdzeniu. Ceny płytek sprawdziliśmy w polskim sklepie z elektroniką, a przy instalacji wskażemy miejsce, w którym łatwo sobie zaszkodzić bezpieczeństwem.

Spis treści:

Skąd ten projekt i czemu piszemy dopiero teraz

Autor o nicku M-Abozaid wrzucił kod na GitHuba 19 czerwca 2026 roku. Na dziś projekt ma 2313 gwiazdek, 210 forków i ostatni zapis w kodzie z 6 października, więc rozwija się na żywo. Tom’s Hardware opisało go 19 lipca pod tytułem o „dongle za 5 dolarów”, który mieści 537 tysięcy domen, zużywa około 50 KB RAM i odpowiada na zablokowane zapytania w 10 milisekund. Wczorajsza fala na Hacker News różniła się od lipcowej tym, że komentujący przestali klaskać i zaczęli mierzyć: latencję przez Wi-Fi, rachunek na kolizje haszy, jakość dokumentacji. Z tej wymiany wyszło więcej niż z nagłówków.

Po polsku temat stoi pusty, choć popyt jest: „esp32 adblocker” ma w Google sześć podpowiedzi, od „esp32 adblocker github” po „esp32 dns adblock”, a frazy „pi hole czy warto” i „adguard home vs pihole” żyją od dawna. Żadne krajowe medium tego projektu nie opisało.

Jak to działa: hasze we flashu zamiast listy w pamięci

Bloker DNS ma prostą robotę: gdy przeglądarka pyta o domenę serwera reklamowego, odpowiada zerowym adresem i śledzik nigdy nie zostaje odpytany. Pi-hole i AdGuard Home robią to na maszynie z systemem, trzymając listę domen jako tekst w RAM. W mikrokontrolerze tej przestrzeni nie ma. ESP32-C3 nie obsługuje zewnętrznego PSRAM, a wewnętrznej pamięci ma kilkaset kilobajtów, z których firmware i tak zużywa większość.

Trik tego projektu polega na tym, że lista domen w ogóle nie ląduje w RAM. Domeny zapisano we flashu jako posortowane hasze 40-bitowe (FNV-1a) i wyszukuje się je binarnie. Zapytanie zamieniane jest na hasz, do tego hasze wszystkich nadrzędnych sufiksów, po czym binarne przeszukanie flasha stwierdza trafienie albo jego brak. Trafienie dostaje w odpowiedzi 0.0.0.0, chybienie idzie do prawdziwego resolvera i odpowiedź wraca do urządzenia. Autor podaje konkretne liczby: 141 tysięcy domen mieści się w 0,67 MB flasha, wyszukanie to około 18 odczytów flasha i około 10 milisekund łącznie z opóźnieniem Wi-Fi, a RAM zajęty przez blokera to około 50 KB.

Lista tekstowa w RAMHasze we flashu (ten projekt)
Wymagany sprzętESP32 z PSRAM, około 8 USDESP32-C3 bez PSRAM, około 2 USD
141 tys. domenokoło 2,5 MB RAM0,67 MB flasha
Zajętość RAMwiększość pamięci układuokoło 50 KB
Wyszukanieporównania tekstówokoło 18 odczytów flasha, ~10 ms z Wi-Fi
Kolizje haszynie dotyczy0 przy 141 tys., 1 przy 537 tys.

Czterdzieści bitów to nie przypadek. Przy 32 bitach autor liczy około siedmiu kolizji na liście 250 tysięcy domen, a 64 bity dokładałyby trzy bajty na domenę, rozwiązując problem, którego nie ma. Na większych układach ten sam pomysł działa jeszcze lepiej: na ESP32-S3 z 16 MB flasha hasze pomieszczą około 2,7 miliona domen, gdy stringi w 8 MB PSRAM tylko 466 tysięcy.

Co dostajesz w praktyce

Płytka wystawia panel w przeglądarce pod adresem c3adblock.local: statystyki zapytań, ręczne dopisywanie i wycofywanie domen. Konfiguracja Wi-Fi idzie przez portal: gdy płytka nie zna sieci, uruchamia własny punkt dostępowy C3-AdBlock-XXXX z witryną konfiguracyjną, do której wchodzisz telefonem, wybierasz swoją sieć i podajesz hasło. Przeniesienie na nową sieć to przycisk Forget WiFi w panelu albo przytrzymanie przycisku BOOT przy zasilaniu.

Listy blokujące buduje się osobnym skryptem w Pythonie z plików hosts, zwykłych list domen albo reguł w formacie AdGuard (blokady ||domena^ i wyjątki @@). Domyślnie skrypt składa bazę StevenBlack z lekką listą Hagezi, około 100 tysięcy domen, z założeniem bezpiecznym dla komunikatorów i mediów społecznościowych. Blokada domeny obejmuje jej subdomeny. Reguł z wyrażeniami regularnymi, gwiazdkami i kosmetycznych, czyli takich, które chowają elementy strony, skrypt nie umie i jawnie je zlicza, zamiast udawać, że je obsłużył. Wyjątek @@ odblokowuje dokładnie jedną domenę, nie tnie subdomen.

Aktualizacje idą przez sieć. Zespół projektu publikuje świeży plik blocklist.bin raz w tygodniu (ostatni wypuszczono 4 października) pod stałym adresem, więc raz wklejony URL w opcji Remote auto-update utrzymuje urządzenie aktualnym bez dotykania. Firmware też da się podmienić po Wi-Fi, ale to kosztuje: dwa sloty na obraz zostawiają około 1,3 MB na listę, czyli maksimum około 250 tysięcy domen. Wariant z 537 tysiącami wymaga partycji jednoslotowej i wtedy aktualizacji firmware po sieci nie ma. Wybór sprowadza się do jednego pliku partitions.csv.

W praktyce jest to bloker reklam i pomiarów naraz: trackery i domeny telemetryczne odpadają razem z banerami, bo siedzą na tych samych listach. Reklam w YouTube to nie wyłączy, bo serwowane są z tych samych serwerów co treść, i to samo pytanie pada przy Pi-hole, bo fizyka DNS jest wspólna. Świat pomiaru reklam opisywaliśmy osobno przy ciasteczku __obi, jeśli chcesz zobaczyć, kto i po co mierzy.

Gdzie to bolało na Hacker News

Latencja to główny zarzut. Autor README podaje około 10 milisekund na zapytanie razem z czasem Wi-Fi, a komentujący rozpisali, co to znaczy w praktyce: samo Wi-Fi dokłada u jednego z nich typowo około 8 ms, każdy skok interferencji potrafi dodać 50-100 ms, podczas gdy DNS po kablu w tej samej sieci odpowiada poniżej 1 ms. Systemy i przeglądarki cache’ują odpowiedzi DNS, więc koszt płaci się głównie przy pierwszym odpytaniu każdej domeny. Jak to wychodzi w domu z kilkunastoma urządzeniami, nikt w wątku nie zmierzył.

Kolizje haszy brzmią groźniej, niż bolą. Kolizja to sytuacja, gdy uczciwa domena wyląduje na tym samym 40-bitowym haszu co zablokowana i przestanie się otwierać. Przy budowaniu list autor zmierzył zero kolizji dla 141 tysięcy domen i jedną dla 537 tysięcy. Część wątku zajęła sobie spór o rachunek oczekiwanej liczby kolizji (wychodzi 0,13 dla 537 tysięcy wg problemu urodzinowego, zamiast „około jednej”), ale rozbieżność jest kosmetyczna: rząd wielkości to „mniej niż jedna”. Gdy już padnie, domenę odblokowujesz w panelu.

Osobny wątek to dokumentacja: kilku komentujących uznało README za pisane przez model, inni odparli, że oskarżanie o AI stało się nowym polowaniem na czarownice. Z naszej strony: liczby z tabeli porównawczej sprawdziło w dyskusji kilku matematycznie zaprawionych czytelników i poza nieścisłą prezentacją kolizji się obroniły. Trzeba też pamiętać o zasilaniu, bo tanie i luźne adaptery USB-C potrafią wybić układ w trakcie nadawania Wi-Fi; autor zaleca ładowarkę albo port routera. Płytka idzie na 45-55 stopni w spoczynku, więc w drukowanej obudowie z repo zostawiono otwory wentylacyjne, a przestrzeń przy antenie PCB ma zostać wolna od tworzywa i metalu.

Instalacja krok po kroku

Do wgrania potrzebujesz zwykłego komputera z aktualnym PlatformIO. Tu pierwsza pułapka: wersja z repozytoriów dystrybucji (4.3.4) jest za stara i wysypuje się z błędem AttributeError na resultcallback, o czym pisze issue #4. Bierz rdzeń z rozszerzenia VSCode albo robisz pip install -U platformio w środowisku wirtualnym. Dalej już prosto:

  1. Kopiujesz src/secrets.example.h do src/secrets.h i wpisujesz WEB_USER, WEB_PASS i OTA_PASS. Te trzy hasła pilnują panelu i aktualizacji OTA i są obowiązkowe, bo jeszcze niedawno endpointy zmieniające stan były otwarte dla każdego w sieci lokalnej. WIFI_SSID i WIFI_PASS możesz zostawić i skonfigurować przez portal.
  2. Budujesz listę: python3 tools/build_blocklist.py data/blocklist.bin (domyślnie StevenBlack plus Hagezi Light, można podać własne URL-e i pliki).
  3. Wgrywasz firmware i system plików: pio run -t upload, potem pio run -t uploadfs. To jedyny raz, gdy płytka widzi kabel USB.
  4. Podpinasz płytkę do portu USB w routerze donglem USB-A do USB-C i sprawdzasz przez pio device monitor, na jakim adresie wstała, albo otwierasz c3adblock.local.
  5. Bez zapisanej sieci płytka wystartuje punkt C3-AdBlock-XXXX: wchodzisz telefonem, podajesz hasło do Wi-Fi, gotowe.
  6. Ostatni krok jest wspólny dla każdego blokera DNS: w ustawieniach DHCP routera wpisujesz adres płytki jako serwer nazw, tak samo, jak zrobiłbyś to z Pi-hole. Od tej chwili cała sieć pyta płytkę.

Ile to kosztuje w Polsce

Wymagany jest dowolny ESP32-C3 z 4 MB flasha. Autor testował na SuperMini, czyli chińskim klonie kosztującym za granicą równowartość kilku złotych, a w polskich sklepach odpowiedniki wg kart produktów z 8 października stoją tak: Seeed Xiao ESP32-C3 to 25,90 zł, Waveshare ESP32-C3-Zero to 32,89 zł, oba na Botlandzie. Klasyczny ESP32 też się buduje (kompilację sprawdzili współpracownicy projektu, choć testowanym celem jest C3). Zasilanie bierze się z portu routera, a obudowę w STL wydrukuje każdy, kto ma dostęp do drukarki 3D.

ŚcieżkaSprzętKoszt startu
ESP32-C3 (ten projekt)płytka + dongle USBod 25,90 zł
Pi-holekomputer działający całą dobę (klasycznie Raspberry Pi) + zasilacz i nośnikkilkukrotnie więcej
AdGuard Homeurządzenie, które już pracuje: router z OpenWrt, NAS, stary laptop0 zł, jeśli je masz

Porównanie ma sens tylko z kontekstem. Jeśli masz NAS albo router z OpenWrt, AdGuard Home na tym urządzeniu będzie szybszy, bo nie idzie przez Wi-Fi, i nie dokłada drugiego urządzenia do prądu. Płytka wygrywa tam, gdzie liczy się osobne, głupie urządzenie, które nie umie nic poza swoją robotą: nie ma na nim konta do przejęcia, nie aktualizuje systemu co miesiąc i nie da się na nim przypadkiem uruchomić czegoś innego.

Dla kogo to jest

Ten projekt jest dla ludzi lubiących grzebać w elektronice, nie dla szukających najprostszej drogi bez reklam. Do flashowania potrzebujesz komputera z terminalem i cierpliwości do PlatformIO; jeśli to brzmi obco, zacznij od AdGuard Home. Za to jeśli niedawno składałeś klaster BitNet na siedmiu płytkach albo myślisz o nim, ta płytka to naturalny następny krok w tym samym klimacie: tani sprzęt robi jedną rzecz lokalnie, bez chmury i abonamentu. Temat lokalnego liczenia bez wysyłania czegokolwiek na zewnątrz rozwinęliśmy w poradniku o lokalnym AI na komputerze.

Projekt żyje: ostatni zapis kodu 6 października, dwadzieścia otwartych zgłoszeń i propozycji zmian, autor zapowiada instalator w przeglądarce jednym kliknięciem. Gdy płytka trafi do redakcji, dopiszymy własne pomiary latencji, bo to jedyna rzecz, której nikt w dyskusji nie zmierzył na prawdziwym sprzęcie.

Źródła

Powiązane artykuły