Ein DNS-basierter Werbeblocker für das ganze Netz läuft normalerweise auf einem Raspberry Pi, einem Mini-PC oder einem kleinen Server, der rund um die Uhr Strom zieht. Das Projekt esp32-c3-adblock von Entwickler Zed (M-Abozaid) zeigt, dass dafür auch ein ESP32-C3-Board für rund zwei bis fünf Dollar reicht – ein Mikrocontroller mit 4 MB Flash und ohne PSRAM 1, 3. Der praktische Nutzen liegt bei den Geräten, auf denen du keinen Browser-Erweiterungsblocker installieren kannst: Smart-TVs, Konsolen, IoT-Geräte und Handy-Apps werden über die DNS-Auflösung mitgefiltert, ohne dass auf dem Gerät selbst etwas läuft 1.
Die Aufgabe dieses Artikels ist konkret: Du erfährst, was das Gerät blockt und was nicht, wie du die Firmware baust und flasht, wie du es ins Netz hängst und wie du das Ergebnis mit zwei Befehlen prüfst. Am Ende steht ein Test, der für eine Werbe-Domain 0.0.0.0 und für github.com eine echte IP-Adresse liefert 2.
Kurzantwort#
So baust du auf einem ESP32-C3 für wenige Euro einen netzwerkweiten DNS-Werbeblocker mit bis zu 537.000 Domains – Anleitung, Test, Grenzen. Kurz gesagt: open-source esp32-c3 dns ad blocker supports up to over 500,000 domain ist vor allem dann relevant, wenn du schnell verstehen willst, was konkret dahinter steckt, welche Grenzen es gibt und welche Entscheidung daraus folgt. Die Details, Quellen und Einschränkungen stehen in den folgenden Abschnitten.
Was der ESP32-C3-Werbeblocker kann – und was nicht#
Der ESP32-C3 arbeitet als DNS-Sinkhole im Stil von Pi-hole. Er hängt sich als DNS-Resolver in dein Netz, fängt DNS-Anfragen ab und beantwortet Domains, die auf einer Blockliste stehen, mit 0.0.0.0. Anfragen an nicht blockierte Domains leitet er an einen vorgelagerten DNS-Server weiter und reicht die Antwort an den Client zurück 1, 2. Damit wirkt die Blockade auf jedem Gerät im Netz, das den C3 als DNS-Resolver nutzt, ohne dass du auf jedem Gerät eine App oder Erweiterung installierst.
Das ist aber kein vollwertiger Pi-hole-Ersatz. Die Weboberfläche zeigt grundlegende Statistiken: blockierte und erlaubte Anfragen pro Client, die Blocklisten-Statistik sowie die Option, einzelne Geräte zu sperren oder eigene Domains hinzuzufügen 1, 2. Was fehlt, sind detaillierte Verlaufsdaten, Query-Logs über längere Zeiträume und die vielen Einstellmöglichkeiten, die Pi-hole oder AdGuard Home mitbringen 3. Auf der Roadmap stehen zudem ein bucketed Prefix-Index, der die rund 18 Flash-Lesezugriffe pro Lookup auf ein bis zwei senken soll, und die Rolle als DHCP-Server, damit sich das Gerät selbst als DNS-Server an die Clients verteilt – beides ist noch nicht umgesetzt 2. Der Hersteller des Projekts nutzt den ESP32-C3 selbst als Zweit-DNS neben seinem Pi-hole – als Ausweichlösung, die weiterhin filtert, wenn der Pi-hole neu startet oder ausfällt 3. Genau für diese Rolle als kleine, dauerhaft laufende Reserve ist das Gerät gebaut, nicht als Ersatz für eine ausgewachsene Filter-Installation 3.
Der Trick: Hashes statt Domain-Strings#
Die eigentliche Leistung liegt darin, wie die Blockliste gespeichert wird. Ein DNS-Filter mit hunderttausenden Domains muss diese Daten irgendwo halten. Die meisten ESP32-Lösungen laden die Domains als Strings in den Arbeitsspeicher und brauchen dafür PSRAM – zusätzlichen, externen Speicher, den günstige ESP32-C3-Boards schlicht nicht haben 1, 2.
Dieses Projekt speichert stattdessen sortierte 40-Bit-FNV-1a-Hashes im Flash. Jede Domain wird beim Erstellen der Blockliste zu einem festen 5-Byte-Hash umgewandelt, die Hashes werden sortiert abgelegt, und bei jeder DNS-Anfrage durchsucht die Firmware die Tabelle per binärer Suche 1, 2. Trifft die Anfrage einen Hash, antwortet der Controller mit 0.0.0.0; sonst geht die Anfrage an den Upstream-Resolver 2.
Die Zahlen dahinter: Rund 140.000 Domains passen in etwa 0,7 MB Flash und belegen nur rund 50 KB RAM. Ein Lookup dauert etwa 10 ms, inklusive WiFi-Roundtrip und rund 18 Flash-Lesezugriffen 1, 2.
Beim Nachschlagen hasht die Firmware die angefragte Domain und zusätzlich die übergeordneten Domains, die Parent-Suffixe. Ein Eintrag für example.com in der Blockliste deckt damit auch ads.example.com und jede andere Subdomain darunter ab 1, 2.
Warum 40 Bit? Das ist laut Entwickler der Kompromiss für genau dieses Flash-Budget. Bei 141.000 Domains liegen die Kollisionen nahe null, bei 537.000 Domains kommt es zu etwa einer Kollision – eine Domain wird dann fälschlich mitgeblockt. Ein 32-Bit-Hash sparte zwar Flash, verursachte aber bei 250.000 Domains rund sieben Kollisionen; ein 64-Bit-Hash verschwendet drei Byte pro Domain für ein Problem, das es hier nicht gibt 1, 2.
Der Ansatz funktioniert auch auf größeren Chips. Ein ESP32-S3 mit 16 MB Flash könnte mit 40-Bit-Hashes rund 2,7 Millionen Domains speichern, verglichen mit etwa 466.000 Domains als Strings in 8 MB PSRAM 1, 2. Als Vorbild nennt der Entwickler das Projekt s60sc/ESP32_AdBlocker mit seiner Grundidee, blocklistete Domains mit 0.0.0.0 zu beantworten – die Umsetzung hier ist aber eine eigenständige, die statt PSRAM Flash für die Blockliste nutzt 1, 4.

Hardware: ein ESP32-C3 SuperMini reicht#
Getestet ist das Projekt auf dem ESP32-C3 SuperMini, einem 16-Pin-Board mit USB-C-Anschluss und PCB-Antenne. Der verbaute Espressif ESP32-C3FH4 ist ein Single-Core-RISC-V-Mikrocontroller mit bis zu 160 MHz, 400 KB SRAM, 4 MB Flash und 2,4-GHz-WiFi (WiFi 4) 1. PSRAM ist nicht nötig. Auch klassische ESP32-Boards (DevKit/WROOM) bauen laut Projekt, sind aber nur kompiliert-getestet – das C3-Board ist das eigentliche Ziel 2.
Wichtig ist die Stromversorgung. Das Board läuft über 5 V USB und braucht eine stabile Quelle, damit das Radio bei WiFi-Sendebursts nicht unter Spannung einbricht. Ein Netzteil oder der USB-Port deines Routers reicht; billige, wackelige USB-C-auf-A-Adapters können genau diese Brownouts auslösen 1, 2. Der Entwickler betreibt sein Gerät direkt am USB-Port seines Glasfaser-Gateways – der Port liefert nur die 5 Volt, die gesamte Kommunikation läuft über WiFi 3.
Zum Gehäuse liegt eine druckbare STL-Datei für den SuperMini-Formfaktor bei. Beim Drucken gilt: Die Antennenseite freihalten – die PCB-Antenne des C3 sitzt als Zickzack-Leiterbahn auf der kurzen Kante gegenüber dem USB-C-Port, und Metall oder massives Plastik davor kostet Empfangsstärke. Lüftungsschlitze offen lassen; das Board idlet bei etwa 45 bis 55 Grad Celsius 2.
Drei Kapazitätsstufen – und was OTA kostet#
Die Blocklistengröße hängt an einer einzigen Entscheidung: Willst du Firmware-Updates über WLAN?
Für Over-the-Air-Firmware-Updates reserviert der ESP32 zwei App-Partitionen im Flash. Damit bleiben auf einem 4-MB-Board rund 1,3 MB für die Blockliste, was etwa 250.000 Domains erlaubt. Ohne Firmware-OTA – mit Single-App-Partitionstabelle – passen bis zu rund 537.000 Domains, bei etwa einer Kollision 1, 2.
Konkret stehen drei Stufen zur Wahl: etwa 141.000 Domains mit nahezu null Kollisionen, etwa 250.000 Domains mit aktiviertem Firmware-OTA, oder die aggressive Liste mit bis zu 537.000 Domains ohne Firmware-OTA 1, 2. Die Entscheidung triffst du in der partitions.csv 2. Als Faustregel: Willst du Firmware-Updates über die Oberfläche behalten, nimm die 250k-Liste – Blocklisten-OTA bleibt dabei ohnehin möglich. Willst du die maximale Abdeckung und ist dir das Firmware-Update über die CLI egal, wähle die Single-App-Variante mit bis zu 537k 1, 2.
Blocklisten-Updates bleiben in allen Varianten per WLAN möglich – nur das Firmware-Update über OTA entfällt in der größten Stufe. Der Blockliste-OTA läuft über die Weboberfläche oder einen geplanten Download von einer URL 1, 2.
Bauen und Flashen mit PlatformIO#
Der Bau läuft über PlatformIO und ist in vier Schritten dokumentiert. Verwende eine aktuelle PlatformIO-Version: Die veraltete apt-/Distro-Version (etwa 4.3.4) bricht mit einem Attributfehler ab 2.
Erst die Secrets-Vorlage kopieren und bearbeiten:
cp src/secrets.example.h src/secrets.hIn src/secrets.h setzt du WEB_USER, WEB_PASS und OTA_PASS. Die Felder sind nicht optional – sie schützen die statusverändernden Endpunkte der Weboberfläche und das Netzwerk-OTA. WIFI_SSID und WIFI_PASS darfst du leer lassen; die Einrichtung läuft dann über ein Captive Portal (siehe unten) 2.
Zweitens die Hash-Tabelle der Blockliste bauen. Die Standardeinstellung kombiniert die StevenBlack-Basisliste mit Hagezi Light – rund 100.000 Einträge, die laut Projekt WhatsApp- und Social-Media-Domains unangetastet lassen 2:
python3 tools/build_blocklist.py data/blocklist.binDrittens Firmware und Blocklisten-Dateisystem flashen – das ist der einzige USB-Flash:
pio run -t upload
pio run -t uploadfsViertens das Gerät beobachten und die IP ablesen:
pio device monitorEigene Blocklisten sind vorgesehen. build_blocklist.py nimmt eine Mischung aus URLs und lokalen Dateien in drei Formaten: hosts-Dateien (0.0.0.0 ads.example.com), einfache Domain-Listen (eine Domain pro Zeile) und AdGuard-/Adblock-Grundregeln (||ads.example.com^ zum Blocken, @@||ok.example.com^ zum Entsperren). Eine geblockte Domain blockt auch ihre Subdomains; eine @@-Regel entsperrt dagegen nur genau diesen Eintrag und kann eine Subdomain nicht aus einer geblockten Parent-Domain herausschneiden. Regeln, die ein DNS-Hash nicht ausdrücken kann – Regex, Wildcards, $-Modifier, kosmetische ##-Regeln – werden übersprungen und gezählt. Schlägt der Download einer Quelle fehl, bricht der Build ab, statt still eine kleinere Liste zu erzeugen; mit –allow-missing lässt sich das übersteuern 2.
Ein Ein-Klick-Browser-Installer ist angekündigt, aber noch nicht veröffentlicht (Hosting offen). Bis dahin bleibt der PlatformIO-Weg der dokumentierte Weg 2.
Einrichtung im Netz und der erste Test#
Die WiFi-Einrichtung braucht keinen Reflash. Statt Zugangsdaten fest in secrets.h einzutragen, kannst du die Platzhalter dort leer lassen und das Captive Portal nutzen: Kann sich das Gerät nicht verbinden, startet es einen offenen Access Point namens C3-AdBlock-XXXX mit Captive Portal – vom Handy aus verbinden, Netz wählen, Passwort eingeben, fertig. Für einen späteren Netzwerkwechsel gibt es auf der Oberfläche die Funktion Forget WiFi – oder du hältst beim Einschalten den BOOT-Knopf gedrückt, um das Portal erneut zu starten 2.
Den Filter testest du mit zwei dig-Befehlen. Der erste muss 0.0.0.0 liefern, der zweite eine echte IP 2:
dig @<c3-ip> doubleclick.net
dig @<c3-ip> github.comDamit der Filter wirkt, trägst du die IP des C3 als DNS-Server einzelner Geräte ein – oder hängst ihn als sekundären Resolver hinter deinen bestehenden DNS 2.
Updates über WLAN#
Nach dem einmaligen USB-Flash laufen Blockliste und Firmware über WiFi. Eine frisch gebaute blocklist.bin lädst du unter „Blocklist → Upload“ hoch, oder du hinterlegst unter „Remote auto-update“ eine URL, von der das Gerät die Datei nach Zeitplan zieht. Das Projekt baut die Standardliste jeden Montag per GitHub Actions neu und veröffentlicht sie unter einer stabilen URL; einmal eingetragen, hält sich das Gerät damit selbst aktuell 2.
Firmware-Updates gehen über die Oberfläche (Datei .pio/build/c3/firmware.bin hochladen, das Gerät prüft und startet neu) oder direkt per CLI:
pio run -t upload --upload-port c3adblock.local --upload-protocol espotaNetzwerk-OTA setzt OTA_PASS aus secrets.h voraus 2.
Sicherheit: was abgesichert ist – und was nicht#
Das Gerät sitzt im Pfad jeder DNS-Anfrage deines Netzes, deshalb lohnt ein ehrlicher Blick auf die Absicherung. Die reine Leseansicht der Oberfläche bleibt offen, aber alle statusverändernden Endpunkte – /ban, /addblock, /unblock, /forgetwifi, /upload, /update, /setupdate, /fetchnow – verlangen HTTP Basic Auth mit den Zugangsdaten aus secrets.h. Netzwerk-OTA braucht zusätzlich OTA_PASS 2.
Drei weitere Härtungen stecken drin: Eigene Domain-Namen werden vor der Anzeige HTML-escaped, was eine gespeicherte-XSS-Lücke schließt. Gegen CSRF verlangt jeder mutierende Endpunkt zusätzlich den Header X-Requested-With: c3-adblock, den ein simples Bild- oder Formular-Angriff nicht mitschicken kann. Und läuft das Gerät noch mit den Platzhalter-Passwörtern aus secrets.example.h, warnt die Firmware per Serial-Log und Banner auf der Oberfläche – sie bootet aber trotzdem 2.
Die Grenze ist deutlich benannt: Basic Auth ist hier eine LAN-Vertrauensgrenze, keine Verschlüsselung. Alles läuft unverschlüsselt über HTTP auf Port 80, die Zugangsdaten gehen base64-kodiert mit jeder Anfrage über das Kabel. Wer deinen LAN-Verkehr bereits mitschneiden kann – offenes WLAN, ARP-Spoofing –, liest sie mit. Die Absicherung schützt gegen den häufigen Fall: ein anderes Gerät im Netz, das die API ohne Zugangsdaten aufruft, oder ein Browser-Tab, der sie per CSRF triggert. Gegen einen Angreifer im eigenen Netzwerk hilft sie nicht 2. Auch der Access Point des Einrichtungsportals bleibt bewusst offen – er muss ohne vorher bekanntes Passwort beitretbar sein, und das WiFi-Passwort, das du dort eingibst, ist nur so sicher wie diese kurze, lokale Funkverbindung während der Einrichtung 2.
Stolperfallen aus der Praxis#
Drei Punkte aus der Projekt-Dokumentation ersparen dir Frust beim ersten Aufsetzen.
Erstens ModemManager. Auf Fedora und Ubuntu übernimmt ModemManager standardmäßig /dev/ttyACM0 und schaltet DTR/RTS um, was den C3 neu startet und die serielle Verbindung blockiert. Die Lösung ist eine udev-Regel, die das ESP32-Gerät ignoriert 2:
sudo systemctl stop ModemManager
echo 'ATTRS{idVendor}=="303a", ENV{ID_MM_DEVICE_IGNORE}="1"' | sudo tee /etc/udev/rules.d/99-esp-no-modemmanager.rules
sudo udevadm control --reload-rules && sudo udevadm triggerZweitens die EDNS-Option. Moderne DNS-Clients hängen einen EDNS-OPT-Record an. Eine geblockte Antwort darf nur Frage plus Antwort enthalten (ANCOUNT=1, NSCOUNT=ARCOUNT=0), sonst gilt sie als fehlerhaft 2. Das ist in der Firmware berücksichtigt, aber gut zu wissen, wenn du selbst an der Antwort herumtestest.
Drittens der USB-Serial-JTAG-Anschluss des C3 verschluckt frühe Boot-Ausgaben, bis der Host verbindet; ein while(!Serial) hilft beim Debuggen 2.
Wann sich der ESP32-C3 lohnt – und wann Pi-hole bleibt#
Das Gerät ist dann die richtige Wahl, wenn du einen dauerhaft laufenden, sehr günstigen DNS-Filter willst, der wenige zehn Milliampere zieht und ohne eigene Stromversorgung direkt am Router hängt 1, 3. Die Blockliste mit bis zu 537.000 Domains deckt dafür ein sehr breites Spektrum an Werbe- und Tracking-Domains ab, bei einer Antwortzeit um 10 ms 1, 2. Der Preis liegt real irgendwo zwischen der Entwickler-Angabe von zwei Dollar und dem, was Tom’s Hardware im Handel fand – rund fünf Dollar für ein SuperMini-Board. Auch am oberen Ende bleibt das deutlich unter dem, was ein Raspberry Pi oder Mini-PC heute kostet 3.
Es ist die falsche Wahl, wenn du detaillierte Query-Logs, Verlaufsstatistiken pro Client, komplexe Allowlist-Regeln oder eine Oberfläche mit vielen Einstellungen erwartest 3. Auch wer auf verschlüsselte Übertragung der Zugangsdaten im LAN besteht, findet hier nur die dokumentierte HTTP-Grenze 2. In diesen Fällen bleibt Pi-hole oder AdGuard Home auf einem Pi oder Mini-PC die bessere Basis – und der ESP32-C3 der günstige Zweit-Resolver dahinter, wie der Entwickler selbst ihn einsetzt 3.

Weiterführende Artikel#
- Pi-hole Blocklisten 2026: DNS-Filter, Ad-Blocking und Privatsphäre im Heimnetz
- iOS 27 umgeht Pi-hole: Connectivity Assist und Limit IP Address Tracking ausschalten
- JetKVM Mini: ESP32-P4X-KVM mit Ethernet oder WiFi ab 39 Dollar
- ESP32 Bit Pirate: So verwandelt sich dein Mikrocontroller in ein Debugging-Multitool
- Lokales KI-Modell Needle 2: Tool-Calling in der Praxis mit 14 MB
Passende Produktrecherchen#
Wenn du die praktische Seite vertiefen möchtest: Diese konkreten Produkte passen zum Thema dieses Artikels. Es ist keine Rangliste und keine Kaufpflicht, sondern eine kurze Auswahl mit Begründung, für wen sie interessant sein kann:
- ESP32-C3 Super Mini, 3 Stück (4 MB Flash, 400 KB SRAM, RISC-V) – Für Leser, die den DNS-Werbeblocker selbst nachbauen und ein Reserve-Board zum Flashen wollen. – Exakt das Board aus dem Projekt: ESP32-C3 SuperMini mit 4 MB Flash und 400 KB SRAM, passend zur beschriebenen Firmware und zum 3D-Gehäuse.
- ESP32-C3 Super Mini Entwicklungsboard, 3 Stück (Devkit, USB-C) – Für Leser, die eine zweite Bezugsquelle für das gleiche Board-Format suchen. – Alternatives ESP32-C3-SuperMini-Devkit mit USB-C als Zweitquelle, wenn man Preis oder Lieferzeit vergleichen will.
- Starlink-Verfügbarkeit und Konditionen prüfen
Hinweis: Als Amazon-Partner verdient kalika.de an qualifizierten Verkäufen. Für dich ändert sich der Preis nicht.
Hinweis: Dieser Link ist ein Starlink-Empfehlungslink. Wenn du darüber bestellst, können für dich und kalika.de Vorteile nach den jeweils geltenden Starlink-Bedingungen entstehen.
Grenzen der Einordnung#
Die zitierten Daten beschreiben eine Erhebung beziehungsweise einen allgemeinen Markt- oder Regelungsstand. Sie ersetzen weder eine technische Prüfung noch eine individuelle Kostenrechnung. Änderungen bei Preisen, Förderung, Netzentgelten oder Vorgaben können das Ergebnis beeinflussen; daher sollten Leserinnen und Leser die Primärquellen vor einer konkreten Entscheidung erneut prüfen.
Transparenzhinweis#
Dieser Beitrag wurde mit Unterstützung künstlicher Intelligenz erstellt und automatisiert auf Quellen, Fakten und Qualitätskriterien geprüft.
Quellen#
[1] Debashis Das, „Open-source ESP32-C3 DNS ad blocker supports up to over 500,000 domains without PSRAM", CNX Software, 9. Oktober 2026 – https://www.cnx-software.com/2026/10/09/open-source-esp32-c3-dns-ad-blocker-supports-up-to-over-500000-domains-without-psram/
[2] M-Abozaid, esp32-c3-adblock – README, GitHub – https://github.com/M-Abozaid/esp32-c3-adblock
[3] Zak Killian, „Clever hacker fits 537,000 domains in a tiny $5 ESP32 ad-blocking dongle", Tom’s Hardware, 19. Juli 2026 – https://www.tomshardware.com/networking/clever-hacker-fits-537-000-domains-in-a-tiny-usd5-esp32-ad-blocking-dongle-firmware-uses-only-around-50kb-of-ram-and-can-answer-blocked-lookups-in-10-milliseconds
[4] s60sc, ESP32_AdBlocker, GitHub – https://github.com/s60sc/ESP32_AdBlocker

