Raspberry-Pi con UbuntuServer-ARM, docker y Pi-hole
luishcr • 22 June, 2022
Descripción.
La Raspberry-Pi es como un mini ordenador preparado para utilizarse en diversos campos como la domótica, róbotica, IoT, desarrollo de software y con la que podemos crear proyectos interesantes como por ejemplo los presentes en la página oficial de Raspberry Pi .
En esta ocasión, configuraremos este dispositivo para que funcione como un bloquedor de anuncios o bloqueador de rastreadores en toda nuestra red local (ordenadores, teléfonos, tablets, SmartTVs), y asÃ, obtener una mayor privacidad y seguridad de nuestros datos con Pi-Hole
Como requisitos, simplemente necesitamos una Raspberry Pi 3 o 4, con al menos 2 GB de RAM para instalar Ubuntu Server 22.04 LTS en una MicroSD (+8 GB), con ayuda del programa Raspberry Pi Imager
Instalación de Ubuntu Server, conexión remota y actualización del firmware.
Resumen del procedimiento:
- Instalamos y abrimos Raspberry Pi Imager.
- Seleccionamos el sistema operativo descargado (Ubuntu Server ARM64).
- Seleccionamos la tarjeta MicroSD conectada al lector de tarjetas del PC, le damos a "WRITE" y cuando termine la instalación, la insertamos en la ranura de la Raspi.
- Encendemos y conectamos la Raspberry-Pi al router, modem o punto de acceso, mediante cable ethernet y averiguamos su dirección IP local asignada por DHCP desde la consola PowerShell o WSL, con el siguiente comando:
# PowerShell
arp -a | findstr "b8-27-eb dc-a6-32 e4-5f-01"
# WSL
arp -na | grep -i "b8:27:eb\|dc:a6:32\|e4:5f:01"
- Conexión remota por protocolo SSH con la dirección IP obtenida. La primera vez, nos pedirá la contraseña por defecto "ubuntu" y nos forzará a cambiarla:
ssh ubuntu@192.168.1.x
- Si queremos cambiamos nombre del host ubuntu por raspi, por ejemplo:
sudo su
echo "raspi" > /etc/hostname
reboot
- Creamos llave ssh para conexión remota sin contraseña. Abrimos otra consola PowerShell o WSL y escribimos:
ssh-keygen -t rsa -b 4096
- Copiamos el contenido de la llave pública generada en ~/.ssh/id_rsa.pub, podemos cambiarle el nombre a uno más amigable, como por ejemplo: ssh_key_raspi_server.pub.
cd ~/.ssh
cat ./ssh_key_raspi_server.pub
[ctrl + c]
- Pegamos el contenido de la llave ssh pública generada de la máquina windows o linux en la raspberry-pi (consola previamente conectada por ssh).
cd ~/.ssh/
nano ./authorized_keys
[ctrl + v]
- Método alternativo, comando "scp" para copiar y pegar archivos entre máquina y servidor por ssh.
scp -r ~/.ssh/ssh_key_raspi_server.pub ubuntu@192.168.1.x:/home/ubuntu/.ssh/authorized_keys
- Actualización de paquetes, como buena práctica:
sudo apt update
sudo apt upgrade
- Raspberry Pi 4 Boot EEPROM, actualización manual opcional para modelos Pi 4, 400, Compute Module 4, que mejoran el rendimiento y arreglan bugs. Información detallada en la documentación y repositorio de github .
sudo rpi-eeprom-update -a
sudo reboot
Instalación de Docker.
- Seguiremos las instrucciones correspondientes de la documentación de docker engine para ubuntu arm64. Instalaremos el repositorio Docker, el cual nos permite disponer de actualizaciones automáticas de seguridad, al actualizar Ubuntu:
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Instalación de docker engine y docker compose:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Añadimos el usuario al grupo docker para disponer de los permisos necesarios.
sudo usermod -aG docker $USER
- Comprobamos que funciona Docker Engine:
docker run hello-world
// Hello from Docker!
// This message shows that your installation appears to be working correctly
- Instalamos docker compose, que nos permite definir y ejecutar varios contenedores a la vez.
sudo apt-get update
sudo apt-get install docker-compose-plugin
- Podemos crear aliases para comandos comunes de docker compose y asà escribir menos.
echo "alias dcup='docker-compose -f ~/docker-compose.yml up -d'
alias dcdown='docker-compose -f ~/docker-compose.yml stop'
alias dcpull='docker-compose -f ~/docker-compose.yml pull'
alias dclogs='docker-compose -f ~/docker-compose.yml logs -tf --tail="50" '
alias dtail='docker logs -tf --tail="50" "$@"'" > ~/.bash_aliases
Creación del fichero docker-compose.yml y puesta en marcha del servicio Pi-Hole.
- Creamos el fichero docker-compose.yml en el directorio ~/home/ubuntu por ejemplo.
touch ~/docker-compose.yml
- Dentro de docker-compose.yml, añadimos la imagen de pi-hole según el repositorio de docker-pi-hole .
version: "3"
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
# For DHCP it is recommended to remove these ports and instead add: network_mode: "host"
ports:
- "53:53/tcp"
- "53:53/udp"
- "80:80/tcp"
environment:
TZ: 'Europe/Madrid'
WEBPASSWORD: 'aqui_PASSWORD_para_el_panel_web_admin'
# Volumes store your data between container upgrades
volumes:
- './etc/pihole:/etc/pihole'
- './etc/dnsmasq.d:/etc/dnsmasq.d'
restart: unless-stopped
- Una vez guardado nuestro fichero de configuración, podemos levantar el contenedor con el alias del comando "docker compose up".
dcup
Deshabilitar el servicio systemd-resolved DNSStubListener del servidor ubuntu.
- En Ubuntu y otras distribuciones que utilizan systemd, systemd-resolved es el servicio de resolución de nombres predeterminado y se ejecuta automáticamente al iniciar el sistema. Sin embargo, si se decide utilizar otro servicio de resolución de nombres como Pi-hole, es recomendable deshabilitarlo para evitar conflictos. El servicio systemd-resolved DNSStubListener es un componente de ubuntu que se encarga de escuchar las solicitudes de DNS y redirigirlas a los diferentes proveedores de resolución de nombres configurados. Este servicio actúa como un "proxy" de DNS que intercepta las solicitudes de DNS y las redirige a los proveedores de resolución de nombres configurados para su procesamiento.
sudo lsof -i :53
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 22695 systemd-resolve 13u IPv4 51921 0t0 UDP localhost:domain
systemd-r 22695 systemd-resolve 14u IPv4 51922 0t0 TCP localhost:domain (LISTEN)
- También podemos comprobarlo con el comando "nslookup", que es una herramienta de resolución de nombres que te permite obtener información sobre nombres de dominio y servidores DNS. Es útil para solucionar problemas de configuración de DNS, verificar la configuración de DNS y resolver problemas de resolución de nombres.
nslookup luishcr.com
ubuntu@raspi:~$ nslookup luishcr.com
Server: 127.0.0.53
Address: 127.0.0.53#53
- Para deshabilitar el servicio abrimos su fichero de configuración, cambiamos la lÃnea "#DNSStubListener=" a "DNSStubListener=no" y guardamos.
sudo -e /etc/systemd/resolved.conf
- Borramos el siguiente fichero.
sudo rm /etc/resolv.conf
- Creamos un enlace simbólico.
sudo ln -s /var/run/systemd/resolve/resolv.conf /etc/resolv.conf
- Reiniciamos el servicio.
sudo service systemd-resolved restart
- Comprobamos resolución de DNS.
ubuntu@raspi:~$ nslookup luishcr.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Configurar router y entrar al panel administrativo de Pi-Hole.
- Finalmente, sólo nos queda entrar al router (http://192.168.1.1) o su correspondiente puerta de enlace y configurar el servidor DNS, que por defecto es el del ISP contratado y lo cambiamos por la ip de la Raspberry-Pi. Existen routers que no dejan modificar los servidores DNS, por lo que en este caso debemos configurar manualmente cada dispositivo para que use Pi-Hole como servidor de DNS.
- Para entrar al panel de administración de pi-hole, entramos a http://dirección-ip-raspi/admin y nos logueamos con la contraseña que habÃamos puesto en el campo "WEBPASSWORD" del fichero docker-compose.yml. Desde aquà podemos añadir listas blancas o listas negras para bloquear todo tipo de dominios sospechosos, NSFW, telemetrÃa, etc... o también podemos usar expresiones regulares.
Referencias.
- Como instalar Ubuntu Server en Raspberry Pi.
- Raspberry Pi Documentation Ubuntu Server en Raspberry Pi.
- Documentación de Docker Engine. y Docker Compose.
- Documentación de Pi-hole.
- Colección Big Blocklist para Pi-hole.