Ciberseguridad

Blocky : Una Solución Ligera para Bloquear Anuncios y Sitios Maliciosos en una Red

I. Introducción

Blocky se presenta como un bloqueador de anuncios y proxy DNS para la red local, que permite bloquear la publicidad, el malware y los sitios web pertenecientes a determinadas categorías (pornografía, redes sociales, etc.). Ligero, de código abierto y escrito en Go, Blocky requiere pocos recursos y puede configurarse de forma flexible gracias a un archivo de configuración en formato YAML. ¿Quieres saber más y aprender a configurarlo? Pues sigue leyendo.

Muchos internautas quieren bloquear los anuncios en Internet, entre otras cosas por su carácter intrusivo. Sin embargo, son vitales para algunos sitios web, como IT-Connect, donde representan una de las principales fuentes de ingresos. Para lograr este objetivo, es posible utilizar lo que se conoce como bloqueador de anuncios. Puede adoptar diversas formas, entre ellas :

  • Una extensión del navegador web como AdBlock o uBlock Origin.
  • Una aplicación disponible en la red que los clientes pueden utilizar como DNS para filtrar determinadas peticiones, bloqueando no sólo la publicidad, sino también los sitios maliciosos o pertenecientes a determinadas categorías.

Como puede ver, Blocky pertenece a la segunda categoría de bloqueadores de anuncios. Comenzaremos con una descripción general de la solución, antes de pasar a su instalación y configuración en Linux.

Nota : Blocky puede instalarse en Linux, FreeBSD e incluso Windows. También se puede ejecutar dentro de un contenedor Docker.

A. Blocky, un DNS sinkhole

Podemos pensar en Blocky como un servidor DNS capaz de controlar y filtrar las consultas realizadas por los dispositivos conectados a una red. Se comporta como un DNS sinkhole, una técnica bien conocida. Consiste en redirigir ciertas peticiones DNS a una dirección controlada por el administrador de la red, en lugar de a su destino legítimo, con el objetivo de bloquear ciertos dominios.

Por ejemplo, si una máquina intenta conectarse a un sitio asociado con una mala reputación (malware), el sumidero DNS puede responder con una dirección IP como 0.0.0.0 (o la dirección de un servidor interno) para que la conexión no pueda tener éxito. Se trata de un método eficaz y reconocido para proteger una red bloqueando determinadas comunicaciones.

Estas son algunas de las principales características de Blocky:

  • Escrito en GB, Blocky es más ligero que otras alternativas (el binario ocupa menos de 10 MB).
  • Bloquear (o permitir) consultas DNS desde listas externas o directivas estáticas
  • Gestionar reglas por grupo de dispositivos
  • Bloqueo de dominio de solicitud, CNAME de respuesta (inspección exhaustiva de CNAME) y direcciones IP de respuesta
  • Precarga y almacenamiento en caché de consultas solicitadas con frecuencia por los clientes.
  • Resolución DNS personalizada para determinados nombres de dominio
  • Función de redirección condicional (útil para su nombre de dominio local)
  • Utilización simultánea de varios resolvers externos
  • Compatibilidad con varios protocolos: DNS (sin cifrar), DNS sobre HTTPS (DoH) y DNS sobre TLS (DoT)

B. Blocky, una alternativa a Pi-Hole y AdGuard

Si hace una búsqueda en Internet del tipo « network ad-blocker », seguramente se encontrará con dos soluciones: Pi-Hole y AdGuard. Hay muchos tutoriales disponibles para instalar estas soluciones, que en mi opinión son más engorrosas que Blocky.

En comparación con estas dos soluciones, la principal desventaja de Blocky -aunque no la principal- es su falta de interfaz web. Con Blocky, la configuración se realiza exclusivamente desde la línea de comandos y un archivo de configuración global. No obtendrás informes online como con otras soluciones como Pi-Hole o AdGuard, pero se ofrece una solución: integración con Prometheus y Grafana (con cuadros de mando listos para usar).

Blocky me parece perfectamente adecuado para el mundo corporativo, gracias a su sistema de grupos, su configuración YAML que no debería asustar a los administradores de sistemas y su integración con soluciones como Prometheus y Grafana.

II. Instalación y configuración de Blocky en Linux

A. Requisitos previos

Para instalar Blocky, necesitas un servidor Linux (o Raspberry Pi) que funcione.

También debe tener acceso a Internet y derechos de administrador en la máquina (o acceso a través de sudo).

B. Instalación de Blocky (sin Docker)

En este tutorial, vamos a realizar una instalación nativa. Descargaremos el ejecutable Blocky desde el repositorio oficial de GitHub y lo desplegaremos como un servicio del sistema.

Comience por crear un directorio en el que alojaremos Blocky y, a continuación, acceda a este directorio :

sudo mkdir -p /opt/blocky
cd /opt/blocky

Para los propósitos de este tutorial, descargaremos la última versión, Blocky v0.25 en el momento de escribir esto. El archivo tar.gz resultante se descomprimirá.

sudo wget https://github.com/0xERR0R/blocky/releases/download/v0.25/blocky_v0.25_Linux_arm64.tar.gz
sudo tar -xvf blocky_v0.25_Linux_arm64.tar.gz

Luego debes ejecutar esta línea para autorizar a Blocky a escuchar en el puerto 53 (DNS). De lo contrario, no será posible debido a las restricciones por defecto en Linux.

sudo setcap CAP_NET_BIND_SERVICE=+eip /opt/blocky/blocky

A continuación, crearemos la cuenta de usuario blocky asociada a la /opt/blocky para asociarlo a un servicio del sistema. Cree el archivo :

sudo useradd -d /opt/blocky blocky

A continuación, cree este archivo para declarar los archivos :

sudo nano /etc/systemd/system/blocky.service

Copia y pega este código en el archivo que acabas de crear:

[Unit]
Description=Blocky
After=syslog.target
After=network.target

[Service]
RestartSec=2s
Type=simple
User=blocky
Group=blocky
WorkingDirectory=/opt/blocky/
ExecStart=/opt/blocky/blocky -c config.yml
Restart=always

[Install]
WantedBy=multi-user.target

El comando de inicio del servicio es /opt/blocky/blocky -c config.ymllo que significa que Blocky carga el archivo de configuración config.yml en el arranque. Así que, antes de iniciar Blocky, tenemos que configurarlo...

C. Configuración de Blocky

Blocky utiliza listas de bloqueo para impedir el acceso a dominios y anuncios maliciosos. Puede añadir varias listas reconocidas, como la de Steven Black, modificando el archivo de configuración config.yml. En general, este archivo se utiliza para configurar toda la solución. Además de este tutorial, puede consultar la documentación de Blocky, que es muy detallada.

Nota : Blocky puede gestionar listas de bloqueo y/o listas de autorización, en función de sus necesidades.

A continuación se muestra la configuración propuesta para este tutorial:

# Servidores DNS ascendentes para la resolución de nombres
upstreams:
  groups:
    default:
      # DNS over HTTPS upstreams
      - https://cloudflare-dns.com/dns-query
      - https://dns.google/dns-query
      - https://dns.quad9.net/dns-query
  # Seleccione los dos servidores ascendentes más rápidos
  strategy: parallel_best
  timeout: 2s
 
# Sólo conectividad IPv4, en caso contrario: v6, dual
connectIPVersion: v4
 
# Redirección condicional para el dominio local
# Resolver it-connect.local a través del servidor 192.168.14.201
conditional:
  mapping:
    it-connect.local: 192.168.14.201 
 
# Declarar listas, aquí «denylists» = lista de bloqueo
# ads: Lista de anuncios de Steven Black
# porno: La lista porno de Steven Black
blocking:
  denylists:
    ads:
      - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
    porn:
      - https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/porn-only/hosts
  # Grupos de usuarios
  # Grupo por defecto, aplicar lista ads
  # Grupo con dirección IP 192.168.14.100, aplicar listas "ads" y "porn"
  clientGroupsBlock:
    default:
      - ads
    192.168.14.100:
      - ads
      - porn
  # Bloquear devolviendo 0.0.0.0 como IP
  blockType: zeroIp
  blockTTL: 1m
  loading:
    refreshPeriod: 6h
    downloads:
      timeout: 60s
      attempts: 5
      cooldown: 10s
    concurrency: 16
    # Respuesta a peticiones DNS desde el inicio
    strategy: fast
    maxErrorsPerSource: 5
 
# Precarga de consultas DNS populares
# Durante 24 horas (prefectExpires), a partir de 3 consultas sobre un nombre (prefectTheshold)
# maxItemsCount - Limitar los elementos en caché a 1000 (útil para limitar el consumo de RAM, de lo contrario 0 para ilimitado)
# prefetchMaxItemsCount - Límite de 1000 elementos a precargar
caching:
  maxItemsCount: 1000
  prefetching: true
  prefetchExpires: 24h
  prefetchThreshold: 3
  prefetchMaxItemsCount: 1000
 
# Resolver nombres de servidores upstream
bootstrapDns:
  - https://8.8.8.8/dns-query

# Crear un archivo de registro para cada cliente
# Conservar los datos durante 31 días
queryLog:
  type: csv-client
  logRetentionDays: 31

# Registro de servicio Blocky
# Registrar sólo errores, por defecto es "info".
log:
  level: error

Guarde y cierre el archivo.

Nota : Blocky actualizará los datos de la lista periódicamente. Por defecto, cada 4 horas. Puede ajustar este comportamiento mediante la directiva refreshPeriod. También puede desactivar esta función, estableciendo esta directiva a 0.

En esta configuración, ten en cuenta estos puntos importantes:

  • Resolver nombres DNS utilizando el protocolo DNS-over-HTTPS con servidores declarados bajo upstreams.
  • Bloquear anuncios + malware para todos los clientes utilizando los datos de la lista de Steven Black
  • Bloquear anuncios + malware + sitios porno sólo para clientes con dirección IP 192.168.14.100 (puede especificar una dirección de red)
  • Se generará un archivo de registro por cliente, que contendrá todas las solicitudes DNS del cliente, rotadas a lo largo de 31 días.

Existen muchas listas en Internet, más o menos completas y más o menos específicas. Las del repositorio Steven Black tienen una excelente reputación, y existen diferentes listas, en particular con categorías (juegos de azar, redes sociales, etc.). En este caso, utilizo la lista principal para bloquear la publicidad y el malware, y la lista exclusiva de pornografía para una máquina específica.

Nota : La dependencia de Blocky en un único archivo de configuración hace que sea fácil hacer copias de seguridad y restaurar la aplicación. Sin embargo, es posible configurar Blocky para leer múltiples archivos YAML.

D. Inicio Blocky

Necesitamos finalizar la configuración para lanzar y probar Blocky. Cambia los permisos en el directorio /opt/blocky para que el usuario blocky propietario.

sudo chown -R blocky:blocky /opt/blocky

Then enable the service to start automatically and run it:

sudo systemctl enable blocky
sudo systemctl start blocky

Compruebe el estado con el siguiente comando:

sudo systemctl status blocky

Deberías ver líneas similares a estas:

INFO server: UDP server is up and running on address :53
INFO server: TCP server is up and running on address :53
INFO list_cache: import succeeded count=75409 source=https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/po>
INFO list_cache: group import finished group=porn total_count=75409
INFO list_cache: import succeeded count=132370 source=https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
INFO list_cache: group import finished group=ads total_count=132368

¡Tu instancia Blocky está en línea! Sólo tienes que probarla.

III. Uso de Blocky en un PC

Para que una máquina cliente realice la resolución de nombres a través de Blocky, es necesario cambiar la configuración de la tarjeta de red. Bueno, eso no es del todo cierto, ya que depende del modo de despliegue.

  • Cuando se utiliza Blocky como servidor DNS clásico, es necesario especificar la dirección IP del servidor Blocky en la configuración de la tarjeta de red de la máquina (o modificar la configuración de su servidor DHCP, ya sea una caja, un cortafuegos u otro).
  • Cuando Blocky se utiliza como servidor DNS-over-HTTPS, debe configurarse en los ajustes de Windows 11 y/o directamente en los ajustes del navegador Web que estés utilizando.

Este segundo caso de uso no está cubierto en este tutorial. Requiere un nombre de dominio y un certificado, lo que puede ser útil si quieres usar tu servidor Blocky desde cualquier lugar. Si sólo quieres usar tu servidor Blocky desde la red local o a través de una VPN, las consultas DNS tradicionales pueden ser suficientes (teniendo en cuenta que se transmiten en claro, como es el comportamiento de DNS). Como recordatorio, DNS-sobre-HTTPS tiene la ventaja de encapsular las peticiones DNS en tráfico HTTPS, por lo que están encriptadas.

Así, en una máquina Windows, basta con especificar la dirección IP del servidor Blocky como DNS. Esto es una prueba, de lo contrario sería preferible modificar la configuración DHCP para distribuir esta dirección IP como DNS.

Entonces llega el momento de navegar por la Red para probar el filtrado...

Por su parte, Blocky creó un archivo llamado 2025-03-17_192_168_14_100.log correspondiente a los registros de la máquina con la dirección IP 192.168.14.100.

En este registro, podemos ver todas las peticiones DNS realizadas por esta máquina. Por ejemplo, al acceder a IT-Connect :

RESOLVED (https://cloudflare-dns.com/dns-query) www.it-connect.fr.      CNAME (www.it-connect.fr.cdn.cloudflare.net.), A (172.67.207.30), A (104.21.22.214)     NOERROR RESOLVED        A       srv-dns

Entonces, cuando hay un bloqueo en un dominio relacionado con la publicidad:

BLOCKED (ads)   securepubads.g.doubleclick.net.         NXDOMAIN        BLOCKED HTTPS   srv-dns

Y, por último, cuando se realiza una solicitud DNS para resolver un nombre en la carpeta it-connect.local. Aquí se ha llamado al servidor DNS declarado en la regla de redirección condicional.

CONDITIONAL     srv-adds-01.it-connect.local.   A (192.168.14.201)      NOERROR CONDITIONAL     A       srv-dns

Si intenta acceder a un sitio web pornográfico desde la máquina con la dirección IP 192.168.14.100 address, se bloquea el acceso.

Nuestro Blocky funciona de maravilla.

IV. Integración de Blocky con Grafana

Puede implementar Grafana y Prometheus específicamente para Blocky si desea un panel de control y algunas estadísticas. Alternativamente, y más interesante, puedes conectar Blocky a tu instalación existente, ya que Grafana y Prometheus son ampliamente utilizados por las empresas.

Para permitir que Prometheus recopile información de su instancia de Blocky, que luego será leída por Grafana, debe ajustar la configuración de Blocky. En la sección config.yml añade estas líneas:

# Prometheus
prometheus:
  enable: true
  path: /metrics

ports:
  http: 4000

En esta página puede recuperar la plantilla del panel de control de Grafana para Blocky.

He aquí un vistazo al panel de control de Blocky en Grafana:

V. Conclusión

Blocky es fácil de desplegar y configurar, salvo que puede que necesites dedicar un poco de tiempo a estudiar cómo funciona la configuración. Si prefieres desplegar con Docker, puedes consultar la documentación oficial.

Aunque no tengas pensado bloquear anuncios a nivel de red, puedes utilizar Blocky para bloquear sitios maliciosos a nivel de DNS. Si este es tu único objetivo, también puedes prescindir de una solución como esta y optar directamente por un DNS que realice el filtrado. Ya hablamos de ello en este tutorial :

¿Qué le parece?

author avatar
Florian Burnel Co-founder of IT-Connect
Systems and network engineer, co-founder of IT-Connect and Microsoft MVP "Cloud and Datacenter Management". I'd like to share my experience and discoveries through my articles. I'm a generalist with a particular interest in Microsoft solutions and scripting. Enjoy your reading.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.