Pi-hole
Introducción
Pi-hole es un proyecto todo en uno: DNS, DHCP, bloqueador de DNS, monitor de DNS y todo en una bonita y simple web. ¿Qué más podríamos pedir? Que sea gratis, ¡lo es! Estos proyectos hacen que la vida sea algo mejor (aceptan donaciones, por cierto).
En ambos nodos desplegaremos Pi-hole como DNS y uno de ellos tendrá el DHCP donde indicaremos que envíe las 2 IP como DNS, así si uno de ellos falla, los DNS seguirán funcionando por el otro y deberemos activar el DHCP en el otro nodo.
Si reiniciamos el nodo con DHCP por mantenimiento, no será necesario activar el DHCP del otro nodo, únicamente será necesario si estará más de 24h no disponible o si nuevos dispositivos se van a añadir justo en ese momento.
Instalación (Pi-hole 2)
Esta sección documenta la instalación original sobre Raspbian con lighttpd integrado. Se mantiene como referencia histórica.
Ejecutamos el instalador y este nos mostrará un asistente.
sudo curl -sSL https://install.pi-hole.net | bash
La instalación nos avisará de que necesitamos IP estática, ya que es un servidor, ya lo hemos configurado así que seguimos adelante. En caso de que pregunte qué tarjeta de red utilizar, será eth0.
Debemos elegir qué tipo de DNS externa queremos utilizar para resolver los nombres en Internet, en mi caso utilizo las de OpenDNS.
Pi-hole se conecta a un proyecto para descargarse la lista de DNS con spam, lo mantenemos activo.
Únicamente estamos utilizando IPv4, pero podemos dejar activa la resolución para este y IPv6 por si en un futuro hiciera falta.
Nuevamente nos mostrará la IP y avisará de que, si esta proviene de DHCP, podríamos tener problemas ya que la convertirá a estática. No es el caso, así que seguimos.
Para gestionar Pi-hole, nos da la opción de instalar una consola UI, que vamos a necesitar más adelante, así nos hará la vida más sencilla y la reutilizaremos para otras cosas. Este requiere instalar lighttpd.
Finalmente preguntará si queremos registrar las consultas y el nivel de estas, es posible cambiarlas en cualquier momento, así que no es preocupante. Aun así, debemos tener cuidado según donde estemos registrando y a qué nivel, en una empresa podría no ser legal registrar todo.
A partir de aquí, el instalador hará su magia, ¡así de fácil! Al terminar podremos acceder mediante su IP o por resolución de nombres si nuestra PC está usando la Raspberry como DNS:
Al terminar, nos indicará la contraseña de administración, si la perdemos se puede cambiar con pihole -a -p.
SSL
Aunque sea un servicio interno, me gusta que todo funcione por HTTPS, así que habrá que generar unas claves de acceso.
Primero deberemos generar los ficheros, escribí una guía aquí, después copiamos el key y crt a /etc/lighttpd.
Lighttpd es el servidor web que utiliza Pi-hole, y este utiliza ficheros pem, así que unificamos ambos.
cat file.key file.crt > file.pem
sudo mv file.pem /etc/lighttpd
Ahora habrá que reconfigurar el servicio.
sudo vi /etc/lighttpd/external.conf
Esto habilitará el SSL, obligando la redirección del 80 al 443. Recordar actualizar el nombre del host y añadirlo como DNS, el certificado únicamente será válido usando ese nombre, no por IP.
server.modules += ( "mod_openssl" )
$HTTP["host"] == "serverName.domain.intranet" {
# Ensure the Pi-hole Block Page knows that this is not a blocked domain
setenv.add-environment = ("fqdn" => "true")
# Enable the SSL engine with a LE cert, only for this specific host
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/file.pem"
ssl.honor-cipher-order = "enable"
ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
}
# Redirect HTTP to HTTPS
$HTTP["scheme"] == "http" {
$HTTP["host"] =~ ".*" {
url.redirect = (".*" => "https://%0$0")
}
}
}
Finalmente reiniciamos para aplicar los cambios.
sudo service lighttpd restart
Instalación (Pi-hole 3)
La versión 3 incorpora una API y un servidor HTTP propio, así que tiene ligeros cambios respecto a la anterior.
Desde Ubuntu, requiere añadir el sudo para bash.
curl -sSL https://install.pi-hole.net | sudo bash
Comprobar periódicamente si existe una nueva versión en la web oficial. La instalación siempre descargará la última versión disponible.
La instalación sigue el mismo asistente. Al preguntar por las DNS externas, elegimos Quad9 (filtered, ECS, DNSSEC).
Estas DNS externas únicamente se usan para resolver nombres de Internet. Los nombres internos de la red se resuelven directamente desde Pi-hole.
Tras la instalación, cambiar la contraseña:
sudo pihole setpassword
SSL
Pi-hole 3 tiene su propio servidor web en los puertos 80 y 443.
Cambiar el nombre de dominio según el utilizado en los certificados.
sudo pihole-FTL --config webserver.domain rasp1.intranet.domain.cat
Seguir el proceso de Certbot para obtener los certificados y dejar el servicio de renovación automático.
Configuración
Desde la UI podemos ver un resumen del estado, este únicamente muestra los clientes, cantidad de peticiones y bloqueadas, para ver y configurar todo se requiere hacer login.
Pi-hole permite bloquear DNS a nivel de rangos de IP, dominios, etc, pero aquí únicamente me centraré en crear nuevas DNS y configurar el DHCP, para cualquier otra configuración, utilizar la documentación.
DNS
En Local DNS tenemos 2 opciones:
- DNS Records: Permite definir un nombre a una IP.
- CNAME Records: Permite definir otro nombre a uno existente, esto es buena idea por ejemplo para definir un DNS que apunte a un servicio, y crear nuevos nombres hacia ese para cada servicio que publica, si un día cambia la IP, únicamente habrá que ajustarlo en el DNS original.
Configurarlos no tiene misterio alguno, en ambos casos debemos indicar el nuevo nombre (si está repetido nos mostrará un error por duplicado) y la IP o el nombre al que debe redireccionar.
DHCP
PiHole no está pensado para utilizar una DNS secundaria, aunque se puede modificar. Si nuestro router tiene las mismas capacidades que PiHole, quizás sea conveniente utilizarlo.
Para poder utilizar el DNS, necesitaremos que el DHCP indique que la IP de ambas Raspberrys son el DNS al que preguntar, debido a que los routers que "regalan" las compañías suelen tener esto bloqueado, Pi-hole tiene un servidor DHCP propio, este además permite asignar IP fijas a un dispositivo según su MAC, lo que es muy práctico para tener mejor control de toda la red.
Antes de nada, hay que recordar que solo puede existir un DHCP, así que antes de activar este, habría que desconectar el del router, y únicamente una Raspberry lo debe tener activo.
Debemos rellenar los siguientes datos:
- Activar DHCP server enabled.
- Indicar el rango de IPs que se reserva para el DHCP.
- La IP del router, que normalmente es 192.168.1.1.
- El Pi-Hole domain name es el dominio de nuestra intranet, en todos estos ejemplos utilizo domain.intranet, donde domain se debería cambiar por el nombre que tendrá la red. Estos dominios permiten hacer búsquedas DNS sin añadir el dominio, por ejemplo, si tenemos
router.domain.intranet, podríamos hacer un ping aroutery funcionaría (aunque depende del sistema operativo). - Por defecto, cada 24h los dispositivos deben renovar la IP, no es aconsejable asignarlo a infinito ni a tiempos mayores a 1 semana.
Una vez lo tengamos activo, deberemos esperar a que caduque la IP de cada dispositivo y pregunte por una nueva IP, momento en que responderá Pi-hole, este además irá mostrando la información de las IPs asignadas, así que, si no tenemos la MAC de un dispositivo, la podremos ver aquí y aprovechar para cambiarlo a una IP estática.
En un formato óptimo, todos los dispositivos de una red deberían tener una IP estática asignada desde el DHCP, dejando el rango de IPs dinámicas para dispositivos externos (típico móvil o tablet de un familiar).
Las IPs estáticas no deberían estar en el mismo rango que el rango que hemos configurado para el DHCP.
Verificación de DNS
Tras configurar Pi-hole, es recomendable confirmar que tanto el servidor como otros en la red pueden utilizar las DNS publicadas.
Desde el propio servidor:
nslookup google.com 127.0.0.1
nslookup router.domain.intranet 127.0.0.1
Desde otro servidor en la red:
nslookup google.com 192.168.1.5
nslookup router.domain.intranet 192.168.1.5
Ambos deberían resolver correctamente. Si el primero falla, revisar que Pi-hole está arrancado. Si el segundo falla, comprobar que no hay un firewall bloqueando el puerto 53.
También se puede verificar que el servidor está usando correctamente Pi-hole como DNS con:
dig google.com
En la sección SERVER debería aparecer 127.0.0.1 o la IP del servidor.
Resolución DNS interna
Después de varios días utilizando Pi-hole, algunas veces me ha pasado que este ha dejado de utilizarse a si mismo.
En estos casos lo más efectivo es reajustarlo en la configuración de red.
Para Raspbian, modificar:
static domain_name_servers=127.0.0.1
Para Ubuntu, confirmar que en la configuración de red la IP propia aparece como primer DNS:
nameservers:
addresses: [192.168.1.5, 192.168.1.6]
Después de reiniciar, volverá a funcionar.
sudo reboot
Copias de seguridad
Siguiendo el sistema definido en Ubuntu, se configuran las copias de seguridad para Pi-hole.
Pi-hole dispone de un comando propio para exportar toda su configuración, así que el script de copia de seguridad es específico en vez de reutilizar el genérico.
cd /opt/scripts
sudo wget https://gitlab.com/ReiIzumi/scripts-backup/-/raw/master/backup_pihole.sh
sudo chmod 744 backup_pihole.sh
Recordar actualizar el PIHOLE_PASSWORD con la contraseña de PiHole para poder utilizar su API.
Ejecutar una primera vez para confirmar que todo funciona.
sudo /opt/scripts/backup_pihole.sh
Cron
Añadir la copia de seguridad al cron.
sudo crontab -e
Este ejemplo ejecuta la copia de seguridad cada día a las 3 de la mañana.
00 3 * * * /opt/scripts/backup_pihole.sh
Nagios
Si se siguieron los pasos de Nagios, añadir la monitorización de la copia de seguridad en el fichero del servidor correspondiente.
define service {
use local-service
host_name raspberry1
service_description Backup PiHole
check_command check_nrpe_bkp!PiHole 03:00:00 5 10
servicegroups Backup
max_check_attempts 1
}
Sincronización
Pi-hole no dispone de un sistema para sincronizar ambos nodos, así que se deberán replicar los cambios en ambos nodos o importar y exportar, dependerá de qué sea más rápido. Este último se encuentra Settings > Teleporter.
La importación nos permite elegir qué debemos importar, pero en condiciones normales, podremos importar todo. De la sección de Settings, únicamente importa la lista de DHCP estáticos, pero no su configuración, así que no iniciará este servicio.
Después de hacer una importación, el servicio parece no conseguir reiniciar y las opciones para ello en la UI no me han funcionado, requiriendo reiniciar a mano con el comando pihole restartdns.
Actualización
La UI nos mostrará si hay actualizaciones, pero se puede comprobar por comandos para automatizarlo en otro proceso:
pihole -v
La actualización no requiere ningún cambio, únicamente lanzar el proceso.
sudo pihole -up