Varios PiHole sincronizados
Ahora que ya dispone de un PiHole configurado, quiza interesa tener un segundo o tercer PiHole, para ponerlos como DNS1, DNS2, DNS3... el problema es que PiHole utiliza una base de datos SQLite por lo tanto la base de datos está en local y no tienen soporte actualmente para MySQL.
Por lo que si se realiza un cambio en uno de los PiHole, se deberá ir manualmente y modificar los datos en tantos PiHole como se dispongan. Hay un programa creado por un developer que se encarga de realizar dicha sincronización, aunque a mí personalmente no me convence puesto que necesita conectarse por ssh al servidor donde esta el pihole principal, aparte de instalar cierto software que quiza no nos interesa.
También porque si infectan una de las máquinas, podran hacer uso de esa conexión SSH para conectarse a la otra máquina y por lo tanto hacer un salto entre ellas.
Por ello os dejo aquí la solución que se me ha ocurrido, que no es mas que hacer uso de un GIT que será el que tenga la configuración "master" que los otros PiHole replicarán.
Creación de PiHole que borraremos
Puede crear un PiHole del cual una vez haya configurado como desee, obtendrá los siguientes ficheros que posteriormente copiará al repositorio GIT.
- custom.list
- setupVars.conf
custom.list
Es un fichero en el que se guardan los registros DNS locales, en otras palabras es como el fichero hosts de un equipo. Se suele usar para crear los registros que queramos resolver localmente. Por ejemplo, si queremos que al estar dentro de la empresa un dominio se solvente con la IP local, lo añadiremos ahí.
Cree un fichero llamado custom.list y añada los registros que quiera.
10.15.50.6 docs.psc.local
10.15.50.5 puppet.psc.local
10.15.60.10 hv1.psc.local
10.15.60.11 hv2.psc.local
10.15.50.10 dns1.psc.local
10.15.50.11 dns2.psc.local
setupVars.conf
El fichero setupVars.conf es el fichero que tiene la configuración de PiHole, como los servidores upstream (servidores DNS a los que consultará en caso de no conocer el dominio).
INSTALL_WEB_INTERFACE=true
WEBPASSWORD=contiene la password cifrada de la web
PIHOLE_INTERFACE=eth0
QUERY_LOGGING=true
BLOCKING_ENABLED=true
DNSMASQ_LISTENING=single
DNS_FQDN_REQUIRED=false
DNS_BOGUS_PRIV=false
DNSSEC=true
REV_SERVER=false
PIHOLE_DNS_1=9.9.9.11
PIHOLE_DNS_2=149.112.112.11
PIHOLE_DNS_3=1.1.1.1
PIHOLE_DNS_4=1.0.0.1
Creación de repositorio GIT
Para hacerlo, comenzaremos creando un repositorio en Github privado
Active la casilla Readme para que incialice el repositorio.
Guarde los cambios. Si desea poder gestionar o modificar los ficheros desde un notepad, necesitará poder subir los cambios con un cliente Git. Puede usar SourceTree para ello https://www.sourcetreeapp.com/ (disponible para Mac / Windows).
Clone el repositorio a SourceTree introduciendo la URL del repositorio que se ha creado, a continuación dejo un vídeo de como realizarlo https://www.youtube.com/watch?v=5K4gong_lA0.
Acceda a la carpeta local del repositorio (la que se ha clonado en su equipo) y copie los ficheros indicados anteriormente.
- custom.list
- setupVars.conf
A continuación añada un nuevo fichero llamado .gitignore
con el siguiente contenido.
# Extensions
*.db
*.leases
*.sha1
*.domains
*.bak
# Explicit files
dns-servers.conf
pihole-FTL.conf
local.list
versions
logrotate
# Folders
migration_backup/
Este fichero indica cuales son los ficheros que GIT ignorará (no subirá al repositorio y no descargará en los otros clientes). Quedando finalmente el repositorio GIT con los siguientes ficheros.
Si no dispone del fichero LICENSE no se preocupe, no es necesario. Finalmente incluya los ficheros en el commit y realice commit en el repositorio GIT https://confluence.atlassian.com/sourcetreekb/commit-push-and-pull-a-repository-on-sourcetree-785616067.html.
Deploy de SSH Public Keys
Para poder desplegar los cambios en los equipos que serán los finales, necesitamos una clave ssh. Para generarla, desde la consola shell desde donde haya instalado el docker de Pihole, ejecute el siguiente comando (en caso de no disponer de una ya), si dispone de una , omita la parte de generación de la clave.
ssh-keygen -t RSA -b 4096
En la carpeta del usuario de la shell se habrá creado la clave ssh privada (id_rsa
) y publica (id_rsa.pub
). Copie el contenido con el comando
cat ~/.ssh/id_rsa.pub
que tendrá una estructura similar a la siguiente
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC3bqW6xac5v9QhwI3ysnFq4oH7fwOM6KGxG31+B46Ne05efVpIEzMa8Gs3BMh15eO7KYStlDl3L9juWIaDajliyMl/LujJ77f19FQxjTfvFXtjaTFF7xsr4qMV6XS6RSQqjvnXW1o1iY8583k6GN1C7xKciW8yIDkKbkJ9av0XcOWCtjutBkjB7aLqFaJdQxZTiS2Z0xYVm3+iucN/1BgLzJTTJH8ruBDqVlHcAMmrdPjVE06CUiueLPdlsgfIwnh4+ilNwb2AXkwnrU9KwY5zoqMuVCj+TPaZG6XcdVW90mADHeVYn6MozcxYIR3kU/0I63iRfNkkxMCaM8wn3zXLevdqtQngt/ROWY8o25Yw/1iV1UpOKQs0pVkjySrLmdcTLtFV9YhoFCIzYMp9TvxLme0Qf2ZdeYZVAtnVYtH7fkwBbQgbyRCwmY/PFm1YDLcugR8bJ02586Ok0YGTLJQUHuG5eNj/3JG7nZHxqLVK0V5L63GhFOdx0txGQlgVflJNbozeW83pvldhgGy3BNQoLa7ywLM9s5eMPF8j5h3xFuwTiG2F2YZYlzqw/qZd9pq0ZihFIcQaxwy9EsHOxv2lx6JnJ8FQ/fKOgwakd/ZWoR3yDzLn+h2NB+GqLIrJh3TSd4dT1zVK42cUr7Fc5Hax2b/ze/mQhmot/Cphfkr3OQ== root@docker02
Ahora en el repositorio de Github (web) acceda a la opción Settings. En el menú lateral derecho pulse en el apartado Deploy keys.
Pulse en Add Deploy Key e introduzca un nombre y la clave ssh pública que ha copiado.
El checkbox Allow write access solo dejelo marcado para el equipo PiHole que usará como máster (si finalmente añade uno a su infraestructura). Para los Pihole de lectura (los de debajo de la imagen, que son los que recibirán peticiones) dejelo desmarcado (solo lectura) así en caso de que ese equipo fuera comprometido, no podrían subir actualizaciones al repositorio de GIT (cambiar las IP de los dominios para apuntar a páginas malignas).
Cuando haya añadido todas las ssh keys públicas de los equipos que tendrán el sistema PiHole instalado, proceda con la instalación de los PiHole.
Instalación de PiHoles
Tanto el "master" (lectura-escritura) como los de producción (lectura) que aparecen en la imágen siguen el mismo proceso de instalación indicando en Instalar Pi Hole o en caso de que sea en Docker Instalar Pi Hole en docker.
En este caso se ha realizado mediante docker.