Ir atrás

Raspberry-Pi con UbuntuServer-ARM, docker y Pi-hole

luishcr • 22 June, 2022

Portada del artículo
"TnVuY2EgcGFyZXMgZGUgYXByZW5kZXI="

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.

Raspbery Pi Imager

 

  • Seleccionamos el sistema operativo descargado (Ubuntu Server ARM64).

Raspbery Pi Imager select OS

 

  • 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.

Raspbery Pi Imager storage

 

  • 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.

Ir atrás
Ir arriba