Cacharreando con la Raspberry


En la entrada anterior expliqué cómo había creado una red local propia dentro de la red compartida de mi edificio. Para seguir con esta infraestructura doméstica me he comprado un MINISFORUM UM870 Slim, con el que planeo cacharrear y ejecutar varios servicios: un nodo de Bitcoin, un modelo local de Qwen y un servidor multimedia con Jellyfin. Pero como ya mencioné en la anterior entrada, tenía inutilizada una Raspberry Pi 5 que he querido reaprovechar. Antes la usaba como nodo de Bitcoin, pero en la última ocasión tardó más de un mes en descargarse la blockchain entera, mostrando así sus límites. Así que he decidido asignarle una función más modesta, pero también más adecuada: actuar como servidor de red. De momento ejecutará Pi-hole y Unbound, dos servicios poco exigentes que pueden permanecer encendidos de forma permanente, y también me servirá como punto de acceso remoto a la red mediante Tailscale.

Raspberry Pi

Instalación del sistema operativo

Para instalar el sistema operativo utilicé Raspberry Pi Imager. Mi intención inicial era usar una tarjeta microSD de 64 GB, pero no conseguí que funcionase correctamente, así que terminé utilizando otra de 32 GB; a priori no hay problema ya que para los servicios que voy a instalar es más que suficiente. Instalé Raspberry Pi OS Lite de 64 bits, sin entorno gráfico, ya que la Raspberry se administrará mediante SSH.

Como apunte, mencionar que la configuración de SSH realizada desde Raspberry Pi Imager no funcionó como esperaba, algo que ya me había pasado en la anterior instalación del SO, por lo que tuve que activarlo manualmente, creando un archivo vacío ssh en la partición de arranque de la tarjeta:

touch /ruta/a/bootfs/ssh

También es necesario crear manualmente un usuario. Para ello generé una contraseña cifrada:

openssl contraseña -6

El comando devuelve una cadena que comienza normalmente por $6$. Después creé, en la misma partición, un archivo llamado userconf con el usuario y la contraseña cifrada:

usuario:contraseña_cifrada

Una vez hecho esto ya es posible conectarse mediante ssh.

Reserva de una dirección IP

En el primer arranque, el router asigna automáticamente a la Raspberry una dirección mediante DHCP, el sistema utilizado por el router para repartir automáticamente direcciones IP entre los dispositivos conectados. Pero esta dirección puede cambiar tras un reinicio del router, una desconexión prolongada o la renovación de la concesión DHCP. En un teléfono o un ordenador portátil me da igual, pero aquí si importa porque necesito que el resto de los dispositivos sepan siempre donde encontrar a la Raspberry (pasará lo mismo con el MiniPC) Así que entré en el router y creé una reserva DHCP; de este modo, la Raspberry sigue solicitando automáticamente su configuración de red, pero el router le entrega siempre la misma dirección. Para crear la reserva es necesario utilizar la dirección MAC de la interfaz Ethernet de la Raspberry.

Elegí la dirección .2 porque está fuera del rango DHCP dinámico, que está entre .100 y .200, y porque la .1 ya pertenece al router:

192.168.0.1   Router
192.168.0.2   Raspberry Pi

Después de reiniciar la conexión comprobé con éxito que podía acceder mediante la nueva dirección:

ssh pablo@192.168.0.2

Acceso sin contraseña y endurecimiento de SSH

Tras ejecutar el anterior comando tuve que introducir la contraseña, algo que quiero evitar en futuras ocasiones, así que copié mi clave pública a la Raspberry:

ssh-copy-id pablo@192.168.0.2

Una vez comprobado que el acceso mediante clave pública funcionaba correctamente, desactivé la autenticación mediante contraseña. Accedí a la Raspberry y en el archivo /etc/ssh/sshd_config dejé estas tres opciones; tras guardarlo, reinicié el servicio.

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

Un color para cada máquina

Cuando se administran varios equipos desde una misma terminal es fácil olvidar en cuál de ellos se está trabajando. Para distinguirlos modifiqué el prompt de la Raspberry. En mi ordenador local está por defecto todo en verde, tanto el nombre de usuario como el nombre del equipo. Aquí dejé el nombre del usuario en verde y asigné al equipo un tono magenta claro recordando así al nombre de la máquina. Para el MiniPC haré lo mismo pero con otro color, y aquí también crearé distintos usuarios para las distintas funciones (Bitcoin, LLM, Jellyfin) y otorgaré un color distinto a cada usuario (el usuario bitcoin será obviamente de color naranja, etc)

La configuración se guarda en ~/.bashrc.

Pi-hole

Con una dirección estable ya podía instalar Pi-hole, el servicio principal de la Raspberry.

Pi-hole funciona como servidor DNS para toda la red local. Cuando un dispositivo intenta acceder a un dominio, la consulta pasa primero por la Raspberry. Si el dominio aparece en una lista de publicidad o seguimiento, Pi-hole impide su resolución. La principal ventaja es que el bloqueo se aplica a toda la red, sin tener que instalar extensiones en cada navegador o dispositivo.

La instalación se realiza mediante el script oficial:

curl -sSL https://install.pi-hole.net | bash

Una vez instalado, configuré el router para que anunciase la Raspberry como servidor DNS de la red.

Unbound

Pi-hole decide qué dominios bloquear, pero necesita otro servidor para resolver los que sí están permitidos. Por defecto en Pi-Hole usaba los DNS de Google y también da la opción automática de usar los de Cloudflare u OpenDNS, pero también es posible usar Unbound en la misma Raspberry.

Unbound es un resolutor DNS recursivo. En lugar de depender de un resolutor público como Google (8.8.8.8), Cloudflare (1.1.1.1) o cualquier otro proveedor, busca por sí mismo la respuesta recorriendo los distintos niveles del sistema DNS.

Se puede instalar Unbound desde los repositorios de Debian:

sudo apt install unbound

Configuré Unbound para escuchar en el puerto 5335 y, desde el panel de Pi-hole, desactivé los servidores DNS externos que venían seleccionados por defecto. En su lugar, añadí 127.0.0.1#5335 como servidor DNS personalizado, de modo que Pi-hole enviase a Unbound todas las consultas que no hubiera bloqueado. Ambos servicios quedan configurados para arrancar automáticamente con el sistema.

Tailscale

La dirección 192.168.0.2 solo es accesible desde dentro de mi red local. Para poder administrar la Raspberry cuando estoy fuera instalé Tailscale, que crea una red privada entre varios dispositivos utilizando WireGuard. Gracias a ello puedo conectarme a la Raspberry sin abrir el puerto de SSH en el router ni exponerla directamente a Internet.

# Instalación de tailscale
curl -fsSL https://tailscale.com/install.sh | sh

# Inicio de conexión
sudo tailscale up

El comando muestra un enlace para autenticar el dispositivo. También instalé Tailscale en mi ordenador e inicié sesión con la misma cuenta. Una vez conectados ambos equipos a la misma red de Tailscale, pude acceder a la Raspberry mediante SSH utilizando la dirección que Tailscale le había asignado:

ssh pablo@IP_DE_TAILSCALE

Dentro de casa puedo utilizar la dirección local 192.168.0.2; fuera de ella utilizo la dirección de Tailscale. También configuré la Raspberry como subnet router, lo que permite usarla como puerta de entrada a mi red local y acceder desde fuera a otros dispositivos que no tengan Tailscale instalado. Para ello anuncié la red 192.168.0.0/24 desde la Raspberry y autoricé la ruta desde el panel de administración de Tailscale.

Nombres para los dispositivos de la red

Para no tener que recordar la dirección IP de cada dispositivo, también asigné nombres DNS locales desde el panel de Pi-hole. La red queda organizada así:

192.168.0.1   router.home.arpa
192.168.0.2   raspberry.home.arpa
192.168.0.3   minipc.home.arpa 

De este modo puedo acceder a cada equipo utilizando su nombre en lugar de su dirección IP. La dirección del MiniPC queda reservada para cuando termine de incorporarlo a la red, lo que detallaré en el siguiente artículo.