Router con PiHole 6
Hace un par de meses moví el servicio DHCP y DNS a mi Router linux de casa y dejé el servicio de Pi-Hole 5 en otra máquina virtual. A pesar de funcionar perfecto me topé con una pega, el troubleshooting desde PiHole es complicado, porque todas las peticiones DNS las resuelve el router y en PiHole no se ve nada, así que he decidido volver a cambiar el diseño.
En este apunte describo cómo instalo Pi-Hole 6 en mi router Linux para que ofrezca DNS, DHCP (con dnsmasq) y sumidero de la publicidad. Esto conlleva deshacer la instalación nativa de dnsmasq.
Introducción
En mi “montaje” anterior tenía el Servidor DHCP y DNS con dnsmasq en mi router y un Pi-Hole 5 en una máquina virtual como sumidero de la publicidad. En este apunte evoluciono a un montaje distinto, instalo Pi-Hole 6 en el router, sustituyendo el dnsmasq y evoluciono toda la configuración anterior, de modo que a partir de ahora Pi-Hole 6 hace todo: DNS, DHCP y sumidero de publicidad:
Evolución a PiHole 6
El proceso es delicado, cortafuegix
está en producción… Tengo que evitar que el dnsmasq
entre en conflicto con la instancia que Pi-hole trae incorporada, migrar las configuraciones y evitar que el propio router tenga problemas de “resolución” durante el proceso. He seguido estos pasos:
- Salvo toda la configuración de
dnsmasq
- Copia de seguridad de
cortafuegix
- Cambio Netplan en
cortafuegix
para que sus consultas vayan alpihole
externo durante el proceso de instalación - Paro
dnsmasq
encortafuegix
(nota: la casa se queda sin DNS/DHCP) - Reactivo
systemd-resolved
para que haga bind al puerto 53. - Instalo Pi-Hole 6
- Configuro Pi-Hole 6 y adapto para usar los ficheros antiguos de
dnsmasq
. - Vuelvo a cambiar Netplan para que apunte a si mismo y reactivo
systemd-resolved
. - Desinstalo dnsmasq
- Paro la máquina virtual Pi-Hole 5 antigua
Salvo la configuración
Guardo los ficheros importantes de dnsmasq
para su uso posterior. Me guardo mis tres ficheros que tengo bajo /etc/dnsmasq.d
al home de mi usuario.
ls -al /home/luis/*.conf
-rw-r--r-- 1 root root 3620 mar 9 09:30 /home/luis/000-dnsmasq.conf
-rw-r--r-- 1 root root 15609 mar 9 09:30 /home/luis/100-vlan.conf
-rw-r--r-- 1 root root 3671 mar 9 09:30 /home/luis/205-vlan.conf
Copia de serguridad
En mi caso hago un clone del router cortafuegix
. Es una máquina virtual en mi servidor Proxmox.
Netplan
Cambio netplan
para que cortafuegix
resuelva todo vía la 192.168.100.224
(Pi-Hole 5 antiguo) mientras dura la migración.
# e /etc/netplan/netplan.yaml
:
# Vlan principal
vlan100:
:
nameservers:
addresses:
- 192.168.100.224 <-- IP del pihole externo, antes tenía 127.0.0.1
:
# netplan apply
# resolvectl
:
Link 6 (vlan100)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Servers: 192.168.100.224
DNS Domain: parchis.org
Paro dnsmasq
Pi-hole utiliza su propia versión de dnsmasq integrada en FTL (un fork de dnsmasq optimizado). Para evitar conflictos para la que tengo instalada en Ubuntu. Que, por cierto, luego desinstalaré.
# systemctl stop dnsmasq
# systemctl disable dnsmasq
Reactivo systemd-resolved
Para que haga bind al puerto 53, lo dejo “de fábrica”. Lo había quitado porque cuando tienes dnsmasq y sirves DNS no hace falta.
# e /etc/systemd/resolved.conf
[Resolve]
#DNSStubListener=yes <== Antes lo tenia descomentado y con valor "no"
# systemctl restart systemd-resolved
# netstat -tulpn |grep 53
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 86520/systemd-resol
udp 0 0 127.0.0.53:53 0.0.0.0:* 86520/systemd-resol
udp 0 0 0.0.0.0:161 0.0.0.0:* 1253/snmpd
# resolvectl
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: foreign
Current DNS Server: 192.168.100.1
DNS Servers: 192.168.100.1
DNS Domain: parchis.org
:
Link 6 (vlan100)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Servers: 192.168.100.224
DNS Domain: parchis.org
El estado actual es:
cortafuegix
puede resolver vía elpihole
que tengo activo (.224
) y llega a internet sin problemas.- El resto de la casa está ciega (no hay DNS ni DHCP server)
Instalación
Descargo e instalo Pi-hole 6 con:
curl -sSL https://install.pi-hole.net | bash
Sigo el proceso estándar de instalación. Una vez termina me ofrece conectar con la pantalla de administración en la ip de mi equipo http://192.168.100.1/admin
con contraseña por defecto que me muestra al terminar la instalación y que cambio nada más entrar.
Configuración
La configuración de Pi-Hole 6 se ha cambiado de sitio, ahora queda todo en un único fichero /etc/pihole/pihole.toml
. Se “debe” configurar todo desde el interfaz web, aunque si quieres editarlo no te olvides de parar el servicio con systemctl stop pihole-FTL.service
.
- Dejo aquí una copia de mi fichero /etc/pihole/pihole.toml
/etc/pihole/dnsmasq.conf
se crea automáticamente desde el anterior, no hace falta editarlo.
He configurado Pi-Hole para que use un fichero externo donde tengo mi configuración de estáticas DHCP. El primero es el fichero /etc/dnsmasq.d/100-vlan.conf
, dejo aquí algunas entradas a modo de ejemplo:
$ cat /etc/dnsmasq.d/100-vlan.conf
:
#### Ejemplo para Access Points
#### Nota: como TAG se puede usar cualquier cosa, aquí uso "capwap"
dhcp-option=set:capwap,option:router,192.168.100.1
dhcp-option=set:capwap,option:dns-server,192.168.100.1
dhcp-option=set:capwap,option:netmask,255.255.252.0
dhcp-option=set:capwap,43,192.168.252.238
dhcp-host=set:capwap,12:34:56:78:16:10,ap-paso.parchis.org,192.168.100.220
dhcp-host=set:capwap,12:34:56:78:57:48,ap-buhardilla.parchis.org,192.168.100.221
dhcp-host=set:capwap,12:34:56:78:35:F8,ap-cuartos.parchis.org,192.168.100.222
#### Ejemplo de asignaciones estáticas
dhcp-host=set:vlan100,12:34:56:77:0E:A1,192.168.100.2,panoramix.parchis.org
dhcp-host=set:vlan100,12:34:56:70:49:ED,192.168.100.3,idefix.parchis.org
dhcp-host=set:vlan100,12:34:56:75:0d:20,192.168.100.4,idefix-wifi.parchis.org
dhcp-host=set:vlan100,12:34:56:75:df:41,192.168.100.5,kymera.parchis.org
:
Cambio netplan y desactivo systemd-resolved
Ya no lo necesito, así que lo cambio para que no haga un bind al puerto 53. En principio no hace falta (porque escucha en 127.0.0.53
), pero así evito que cuando cortafuegix
necesite resolver haga consultas dobles a 127.0.0.53:53
y 127.0.0.1:53
.
# cat /etc/systemd/resolved.conf
[Resolve]
DNSStubListener=no
# systemctl restart systemd-resolved
Dejo netplan
para que cortafuegix
se haga consultas a si mismo
# e /etc/netplan/netplan.yaml
:
# Vlan principal
vlan100:
:
nameservers:
addresses:
- 127.0.0.1
:
# netplan apply
Terminar la migración
Una vez que está todo configurado y arrancado, observo que está escuchando en los puertos adecuados y bien configurado:
# resolvectl
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: foreign
Current DNS Server: 192.168.100.1
DNS Servers: 192.168.100.1 127.0.0.1
DNS Domain: parchis.org
:
Link 5 (vlan100)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
DNS Servers: 127.0.0.1
DNS Domain: parchis.org
# netstat -tulpn |grep 53
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 2128/pihole-FTL
tcp6 0 0 :::53 :::* LISTEN 2128/pihole-FTL
udp 0 0 0.0.0.0:53 0.0.0.0:* 2128/pihole-FTL
udp6 0 0 :::53 :::* 2128/pihole-FTL
Las consultas propias se las va a hacer a si mismo, y cualquier otra la derivará a su forwarder.
# nslookup ibm.com
Server: 192.168.100.1
Address: 192.168.100.1#53
Non-authoritative answer:
Name: ibm.com
Address: 104.85.45.187
Name: ibm.com
Address: 2a02:26f0:b80:693::3831
:
Compruebo desde un ordenador de la red que la resolución DNS e inversa son correctas. Como puedes observar no necesito añadir el nombre del dominio, que se autocompleta solo. Comprobado con clientes Windows, Mac, Linux y dispositivos móviles.
luis@kymeraw:~ ❯ nslookup.exe panoramix.parchis.org
Server: pi.hole
Address: 192.168.100.1
Name: panoramix.parchis.org
Address: 192.168.100.2
luis@kymeraw:~ ❯ nslookup.exe 192.168.100.2
Server: pi.hole
Address: 192.168.100.1
Name: panoramix.parchis.org
Address: 192.168.100.2
Desinstalo dnsmasq
Una vez que tengo Pi-Hole haciendo DNS/DHCP ya no necesito el paquete dnsmasq
de Ubuntu. Ademas elimino una versión personalizada que creé para systemd.
# apt remove dnsmasq-logrotate dnsmasq
# apt autoremove -y --purge
# rm /etc/systemd/system/dnsmasq.service
Prueba de concepto
Muy importante, una vez que que todo está funcionando, voy a parar la máquina virtual con el PiHole 5 antiguo y rearrancar el router. No quiero tener sorpresas si ocurre un reboot y no me va DNS/DHCP, que suele significar caos 😂
# reboot -f
Compruebo que funciona todo y ademas puedo acceder a la consola de administración en http://192.168.100.1/admin
Listras blancas y negras
He configurado PiHole para que se suscriba 5 listas negras y 1 lista blanca. La suscripción la actualiza cada semana y en mi caso supone una base de datos de más de 350.000 entradas.
Para entender esto de las listas, dejo algunos enlaces a proyectos interesantes
- StevenBlack - Consolida direcciones de hosts de varias fuentes bien conservadas
- FadeMind extrahosts - Reglas extra para el proyecto de hosts de StevenBlack
- FadeMind whitelists - Coleciones de whitelists.
- Adfilt - Listas de filtros web para innumerables temas diferentes
- oisd - Bloquea dominios no deseados o dañinos. Reduce los anuncios, disminuye el riesgo de malware y mejora la privacidad.
- oisd big - Bloquea anuncios, anuncios de aplicaciones (móviles), phishing, malvertising, malware, spyware, ransomware, cryptojacking, … Telemetría/Analítica/Seguimiento (Cuando no sea necesario para el correcto funcionamiento)
- oisd small - Se centra principalmente en bloquear anuncios
Blocklists
- Entro en
Lists > Subscribed lists
y añado las siguientes listas negras como Blocklist
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://raw.githubusercontent.com/FiltersHeroes/KADhosts/master/KADhosts.txt
https://big.oisd.nl
https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Spam/hosts
https://raw.githubusercontent.com/DandelionSprout/adfilt/master/Alternate%20versions%20Anti-Malware%20List/AntiMalwareAdGuardHome.txt
Allowlists (Whitelists)
-
Entro en
Lists > Subscribed lists
y añado las siguientes lista blanca como Allowlists. Se trata de mi propia lista de sitios permitidos, que he ido sacando desde diferentes fuentes y me permite una navegación sin demasiados problemas.