esp32-c3-adblock es un bloqueador de anuncios por DNS al estilo Pi-hole, de código abierto, que corre en una placa o módulo ESP32-C3 de 2 dólares sin necesitar PSRAM. Lo desarrolló Zed (M-Abozaid). Filtra las consultas DNS y así bloquea anuncios y dominios de rastreo en todos los equipos de una red doméstica o de una oficina pequeña.

El truco está en no guardar los dominios como texto en la RAM. El proyecto los almacena en la memoria flash como hashes FNV-1a de 40 bits, ordenados, y revisa cada consulta con búsqueda binaria. Cuando llega una consulta DNS por UDP, el firmware en C++ extrae el dominio, calcula su hash (también el de los sufijos padre) y lo busca en la tabla de la flash. Si el dominio está en la lista, el ESP32-C3 responde 0.0.0.0 y la petición queda bloqueada. Si no, reenvía la consulta a un servidor DNS externo y le devuelve la respuesta al cliente.

Con ese método caben más de 140.000 dominios en unos 0,7 MB de flash, y el programa usa solo alrededor de 50 KB de RAM. Cada búsqueda toma cerca de 10 ms, incluido el viaje de ida y vuelta por WiFi, y necesita unas 18 lecturas de la flash.

Requisitos y características

  • Módulo inalámbrico. ESP32-C3 Super Mini de 16 pines con el SoC ESP32-C3FH4 de Espressif. Microcontrolador RISC-V de 32 bits y un núcleo hasta 160 MHz, 400 KB de SRAM, 4 MB de flash, WiFi 4 de 2,4 GHz, USB tipo C para programarlo y antena cerámica. La comunidad también lo probó en placas ESP32 clásicas (DevKit y WROOM).
  • Almacenamiento. Pide al menos 4 MB de flash. Usa cerca de 0,7 MB para más de 140.000 dominios, guardados como hashes de 40 bits (5 bytes cada uno) y no como cadenas de texto en RAM.
  • Rendimiento. Unos 10 ms por búsqueda. Admite cerca de 141.000 dominios con colisiones casi nulas, unos 250.000 con dos particiones de aplicación para actualizar el firmware por OTA, o hasta unos 537.000 con una sola partición y alrededor de una colisión.
  • Seguridad. Autenticación HTTP Basic para todo lo que cambie la configuración, dominios personalizados con escape HTML para evitar XSS y protección contra ataques CSRF.
  • Alimentación. 5 V por USB. Necesita una fuente estable para que la radio no se caiga por baja tensión.
  • Carcasa. Incluye el archivo STL para imprimir una caja con el formato del ESP32-C3 SuperMini.
El bloqueador de DNS con ESP32-C3 SuperMini conectado directo al puerto USB de un router

El bloqueador conectado directo al puerto USB de un router. CNX Software advierte que la imagen fue mejorada con IA.

Un panel web y actualizaciones por OTA

El proyecto trae un panel web en http://c3adblock.local. Desde ahí se ven las consultas bloqueadas y permitidas de cada cliente, se pueden bloquear equipos específicos y agregar dominios propios a la lista. La configuración inicial del WiFi se hace con un portal cautivo, así que no hay que escribir la clave de la red dentro del código.

También acepta actualizaciones por OTA del firmware y de las listas, y puede programar descargas automáticas de listas ya armadas desde una URL. En una placa ESP32-C3 de 4 MB, actualizar el firmware por OTA exige dos espacios de aplicación, lo que deja cerca de 1,3 MB de flash para la lista. Eso alcanza para unos 250.000 dominios. Para usar la lista más grande, de 537.000 dominios, hay que pasar a una sola partición de aplicación, y ahí se pierde la actualización del firmware por OTA.

Panel web de ESP32-C3 AdBlock con estadísticas de la lista, clientes conectados, intensidad de la señal WiFi, uso de memoria y dominios bloqueados a mano

El panel muestra las estadísticas de la lista, los clientes conectados, la señal WiFi, el uso de memoria y los dominios agregados a mano. Esta imagen también fue mejorada con IA, según CNX Software.

¿Por qué hashes de 40 bits?

El ancho de 40 bits llama la atención. El desarrollador explica que es el tamaño óptimo para el espacio de flash disponible. Con 141.000 dominios las colisiones son prácticamente cero. Al estirar la lista a unos agresivos 537.000 dominios aparece más o menos una colisión, o sea un dominio bloqueado por error. Un hash estándar de 32 bits ahorraría espacio en la flash, pero con 250.000 dominios produciría unas siete colisiones.

HashDominiosColisiones
40 bits141.000casi cero
40 bits537.000alrededor de una
32 bits250.000unas siete

El autor cuenta que se inspiró en ESP32_AdBlocker de s60sc, pero su versión es una implementación independiente que guarda las listas grandes en la flash y no en PSRAM. El mismo enfoque sirve en chips más grandes. Un ESP32-S3 con 16 MB podría guardar unos 2,7 millones de dominios con hashes de 40 bits, contra los cerca de 466.000 que caben como texto en 8 MB de PSRAM.

El código fuente en C++, las instrucciones para compilarlo con PlatformIO y la caja imprimible están en el repositorio de GitHub.