Pihole y DNS hardcodeados

Nacho - - Tiempo de lectura 4 mins

Pihole es genial. No te agarra toda la publicidad, pero sí bastante, como para hacer la experiencia un poco mejor. Obviamente tener ublock instalado es mejor, sí, pero el problema es que en teléfonos, por ejemplo, es un poco demasiado pesado. Y tampoco anda adentro de apps, que en algunos casos puede ser que lo quieras.

Entonces vos vas, instalás Pihole, configurás el router para que mande la IP del Pihole como DNS, y listo, todos tus dispositivos automáticamente tienen bloqueo de publicidad.

¿Todos? Bueno, no todos. Una aldea de galos… No, pará. El problema acá no son los galos, son los dispositivos que tienen el DNS hardcodeado. Por ejemplo, el Chromecast. No importa lo que vos le digas con el DHCP, Chromecast va a querer usar siempre el DNS de Google, el famoso 8.8.8.8, o sea que se va a saltear tu hermoso Pihole.

La solución existe: tenés que ir al router y agregarle un par de reglas de nftables (o iptables si sos retro, o ipchains si sos muy retro) y listo, magia hecha.

El problema es si tu router no soporta eso. Como el mío. Podría instalarle DD-WRT, pero la verdad, no quiero hacerlo. Tengo cosas que dependen del router específico (como el script que me actualiza el DNS cuando Antel me cambia la IP) y no quiero andar arrancando de cero con eso.

Lo que sí tiene mi router es la posibilidad de agregarle rutas estáticas. Le podés decir “cuando tengas que mandar un paquete a 8.8.8.8, mandalo a través de este gateway”. Entonces ponele que el Chromecast dice “voy a consultar el DNS en 8.8.8.8”, y cuando al router le llega un paquete dice “ah, ya sé qué hacer con esto, los paquetes para 8.8.8.8 van a través de 192.168.1.9 (el server que tiene Pihole corriendo)”, y entonces lo manda para ahí. El problema es que el server del Pihole recibe un paquete que dice “paquete para 8.8.8.8” y dice “no es para mí, chau” y lo tira a /dev/null, así que no funciona esta solución.

Pero lo que sí funciona es combinar las dos cosas: la ruta estática le dice al router quién se encarga de routear el paquete, y después hacés el NAT en el server de Pihole, en lugar de en el router. La conversación sería más o menos así:

  • Chromecast: Che Router, tengo un paquete para 8.8.8.8
  • Router: Yo me encargo. A ver… sí, ya sé, se lo tengo que mandar a ServerPirata.
  • ServerPirata: 8.8.8.8? Sí, por supuesto, yo me encargo (jejejeje, no saben que les estoy mintiendo). A ver… toqueteo el paquete, y el remitente, y se lo mando a Pihole.
  • Pihole: ¡Un pedido de DNS! Me encantan estos. Acá tenés la respuesta.
  • ServerPirata: Listo, tengo la respuesta, la maquillo para que parezca que viene de 8.8.8.8, y ya está. Bo, Router, acá te va la respuesta (jejejeje).
  • Router: ¡Gracias! Se la mando a Chromecast.
  • Chromecast: Oh, una respuesta de 8.8.8.8. Muchas gracias Router por encargarte de esto sin redirigir el pedido a un servidor pirata.

El resultado es que ahora cualquier dispositivo que intente acceder a 8.8.8.8 va a estar, sin saberlo, hablando con PiHole.

Paso a paso

Lo primero que tenés que hacer es agregar el NAT. Es un dnat lo que querés: “destination nat”. Lo que yo hice fue poner esto en /etc/nftables.conf:

destroy table inet dnsrerouting
table ip dnsrerouting {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        ip daddr 8.8.0.0-8.8.255.255 dnat to 192.168.1.9
    }
}

Si buscás en internet, todos te van a decir que uses una tabla prerouting, pero le podés poner el nombre que quieras, y para mí tiene sentido tener una tabla aparte, así no te queda todo mezclado (en mi caso, Docker mete pila de cosas, entonces no quiero andar entreverando).

Después es sudo systemctl restart nftables (y enable también si es necesario), y listo.

Ahora, el router tiene que saber a dónde mandar los paquetes. Eso va a depender del router. En mi caso, la opción se ve más o menos así:

Screenshot de configuración del router

Y con eso ya queda. Para probarlo, podés usar el comando dig:

$ dig +short pi.hole @8.8.8.8
10.26.3.9

Si te responde, es tu server Pihole. Si la respuesta está vacía, es que estás yendo al 8.8.8.8 de verdad, y no sabe qué es pi.hole.

Y listo, ahora sí, toda la red está con Pihole. Y gracias a la magia de WG-Easy, mi teléfono fuera de casa también.