Servidor Doméstico Todo-en-Uno con GNU/Linux: Implementación de Infraestructura NAS, Contenedores y Filtrado DNS

Resumen Ejecutivo

Este documento presenta una guía técnica para la implementación de un servidor doméstico multifuncional basado en software libre, orientado a la reutilización de hardware obsoleto. La solución propuesta integra servicios de almacenamiento en red (NAS), orquestación de contenedores mediante Docker, filtrado DNS con Pi-hole, y servicios de nube privada, todo ello sin costos de licenciamiento y con un consumo energético inferior a 50W.


1. Marco Teórico y Justificación

La obsolescencia programada de equipos informáticos genera un volumen significativo de residuos electrónicos. Paralelamente, el ecosistema de software libre (FLOSS) ha alcanzado un grado de madurez que permite la implementación de infraestructuras de grado empresarial en entornos domésticos. Esta convergencia posibilita la creación de soluciones tecnológicas sostenibles, económicas y técnicamente robustas.

El presente trabajo se fundamenta en tres pilares tecnológicos:

Virtualización ligera mediante contenedores: La tecnología de contenedores (Docker, 2013) ofrece un aislamiento de procesos con una sobrecarga mínima comparada con la virtualización tradicional basada en hipervisores. Según Merkel (2014), los contenedores proporcionan un rendimiento cercano al bare-metal mientras mantienen la portabilidad y el aislamiento necesarios para entornos multiservicio.

Filtrado DNS a nivel de red: Pi-hole implementa un servidor DNS recursivo que actúa como sumidero para dominios asociados a publicidad y rastreadores. Esta arquitectura centralizada elimina la necesidad de software cliente en cada dispositivo (Ben Halpern et al., 2018).

Filosofía de software libre: El modelo FLOSS garantiza transparencia, auditabilidad y sostenibilidad a largo plazo, elementos críticos en infraestructuras que procesan datos personales (Stallman, 2002).

Objetivos del Sistema

El servidor implementado debe satisfacer los siguientes requisitos funcionales:

  • Almacenamiento centralizado accesible mediante protocolos estándar (SMB/CIFS, NFS, WebDAV)
  • Filtrado DNS transparente para todos los dispositivos de red
  • Plataforma de ejecución de servicios mediante contenedores
  • Servidor multimedia con capacidad de transcodificación
  • Solución de sincronización y almacenamiento en nube auto-hospedada
  • Consumo energético optimizado (<50W en operación continua)

2. Especificaciones Técnicas del Hardware

Requisitos Mínimos

La siguiente tabla detalla los requisitos mínimos y recomendados para la implementación:

ComponenteMínimoRecomendadoJustificación
CPUx86_64 (2010+)Intel N100 / Ryzen 3Soporte para instrucciones AES-NI
RAM4 GB8-16 GBOverhead de contenedores + caché ZFS
Almacenamiento32 GB SSD + HDD datos128 GB NVMe + RAID1 datosSeparación sistema/datos
RedFast EthernetGigabit EthernetThroughput NAS

Consideraciones Arquitectónicas

Gestión de volúmenes: Se recomienda LVM (Logical Volume Manager) para el sistema operativo y ZFS para los volúmenes de datos cuando el hardware lo permita. ZFS ofrece integridad de datos mediante checksumming y snapshots incrementales, aunque requiere mayor cantidad de RAM (1GB por TB recomendado).

Eficiencia energética: Los procesadores Intel de 12ª generación en adelante (especialmente la serie N) ofrecen un rendimiento/watt superior, con TDP de 6-15W en idle. Para hardware reciclado, se debe priorizar equipos con soporte para estados C-states y SpeedStep/Cool’n’Quiet.


3. Selección y Preparación del Sistema Operativo

Distribución Recomendada

Ubuntu Server 24.04 LTS (Noble Numbat) constituye la opción recomendada por las siguientes razones:

  • Soporte extendido hasta abril de 2029 (5 años de actualizaciones de seguridad)
  • Kernel 6.8 con soporte nativo para hardware reciente
  • Repositorios extensos y documentación comunitaria robusta
  • Compatibilidad con sistemas de archivos modernos (Btrfs, ZFS mediante DKMS)

Alternativa conservadora: Debian 12 (Bookworm) para entornos que priorizan estabilidad sobre características recientes.

Instalación del Sistema Base

# Descarga de imagen
wget https://releases.ubuntu.com/24.04/ubuntu-24.04.1-live-server-amd64.iso

# Verificación de integridad
sha256sum ubuntu-24.04.1-live-server-amd64.iso

Durante la instalación se debe seleccionar:

  • Esquema de particionado: LVM en disco del sistema
  • Configuración de red: IP estática fuera del rango DHCP del router
  • Paquetes adicionales: OpenSSH server

Configuración Post-Instalación

# Actualización inicial del sistema
sudo apt update && sudo apt full-upgrade -y

# Instalación de herramientas esenciales
sudo apt install -y \
    curl wget git vim htop \
    net-tools bridge-utils \
    smartmontools lm-sensors

# Configuración de zona horaria
sudo timedatectl set-timezone America/Argentina/Buenos_Aires

# Habilitación de sincronización NTP
sudo systemctl enable systemd-timesyncd

4. Implementación de Plataforma de Contenedores

Arquitectura de Contenedores

Docker proporciona una plataforma de virtualización a nivel de sistema operativo que permite empaquetar aplicaciones y sus dependencias en unidades aisladas llamadas contenedores. A diferencia de las máquinas virtuales tradicionales, los contenedores comparten el kernel del host, resultando en un overhead significativamente menor (Soltesz et al., 2007).

Instalación de Docker Engine

# Instalación desde repositorios oficiales de Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Configuración de permisos de usuario
sudo usermod -aG docker $USER
newgrp docker

# Verificación de instalación
docker --version
docker compose version

Implementación de Portainer

Portainer ofrece una interfaz web para la gestión de contenedores, simplificando operaciones administrativas complejas:

# Creación de volumen persistente
docker volume create portainer_data

# Despliegue del contenedor
docker run -d \
    --name portainer \
    --restart always \
    -p 9000:9000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data \
    portainer/portainer-ce:latest

Acceso mediante navegador: http://[IP-DEL-SERVIDOR]:9000


5. Filtrado DNS y Bloqueo de Publicidad: Arquitectura Pi-hole + Unbound

Fundamentación Técnica

Pi-hole actúa como servidor DNS recursivo con capacidad de filtrado mediante listas de bloqueo. Al combinarse con Unbound como resolución DNS recursiva, se elimina la dependencia de servidores DNS de terceros, mejorando privacidad y reduciendo latencia (Koch, 2019).

Flujo de resolución DNS:

  1. Cliente realiza consulta DNS → Pi-hole
  2. Pi-hole consulta cache local
  3. Si no está en cache, Pi-hole → Unbound
  4. Unbound realiza resolución recursiva desde servidores raíz
  5. Respuesta se cachea y retorna al cliente

Implementación mediante Docker Compose

Crear directorio de proyecto:

mkdir -p ~/pihole-stack && cd ~/pihole-stack

Archivo docker-compose.yml:

version: "3.8"

services:
  unbound:
    image: madnuttah/unbound:latest
    container_name: unbound
    restart: unless-stopped
    networks:
      dns-net:
        ipv4_address: 172.20.0.2
    ports:
      - "5335:5335/tcp"
      - "5335:5335/udp"
    volumes:
      - unbound-config:/opt/unbound/etc/unbound
    healthcheck:
      test: ["CMD", "drill", "@127.0.0.1", "cloudflare.com"]
      interval: 30s
      timeout: 10s
      retries: 3

  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    restart: unless-stopped
    networks:
      dns-net:
        ipv4_address: 172.20.0.3
    depends_on:
      unbound:
        condition: service_healthy
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8081:80/tcp"
    environment:
      TZ: "America/Argentina/Buenos_Aires"
      WEBPASSWORD: "${PIHOLE_PASSWORD}"
      PIHOLE_DNS_: "172.20.0.2#5335"
      DNSSEC: "true"
      DNSMASQ_LISTENING: "all"
    volumes:
      - pihole-config:/etc/pihole
      - pihole-dnsmasq:/etc/dnsmasq.d
    cap_add:
      - NET_ADMIN

networks:
  dns-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24

volumes:
  unbound-config:
  pihole-config:
  pihole-dnsmasq:

Despliegue:

# Definir contraseña de administración
echo "PIHOLE_PASSWORD=contraseña_segura_aquí" > .env

# Iniciar stack
docker compose up -d

# Verificar logs
docker compose logs -f pihole unbound

Configuración de Dispositivos Clientes

Opción A – Configuración en router (recomendada):
Acceder a la configuración DHCP del router y establecer como servidor DNS primario la IP del servidor Pi-hole.

Opción B – Configuración manual por dispositivo:

# Linux - systemd-resolved
sudo nano /etc/systemd/resolved.conf
# Establecer: DNS=192.168.1.X

# Windows
# Panel de Control → Red → Propiedades TCP/IPv4

6. Almacenamiento en Red (NAS)

Opción A: OpenMediaVault

OpenMediaVault (OMV) es una distribución basada en Debian especializada en NAS, con interfaz web completa para gestión de discos, RAID, comparticiones SMB/NFS, y plugins extensivos.

wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

Ventajas: Interfaz gráfica completa, soporte RAID por software, extensibilidad mediante plugins.

Desventajas: Mayor complejidad, overhead de interfaz web.

Opción B: Configuración Manual con Samba

Para entornos más controlados, configuración directa de Samba:

# Instalación
sudo apt install -y samba samba-common-bin

# Configuración
sudo nano /etc/samba/smb.conf

Ejemplo de compartición:

[compartido]
    path = /srv/nas/compartido
    browseable = yes
    read only = no
    guest ok = no
    valid users = usuario
    create mask = 0644
    directory mask = 0755
# Crear usuario Samba
sudo smbpasswd -a usuario

# Reiniciar servicio
sudo systemctl restart smbd

7. Servicios Multimedia y Nube Privada

Nextcloud: Plataforma de Sincronización y Colaboración

Nextcloud proporciona sincronización de archivos, calendarios, contactos, y aplicaciones colaborativas:

docker run -d \
    --name nextcloud \
    --restart unless-stopped \
    -p 8080:80 \
    -v nextcloud-data:/var/www/html \
    -v /srv/nas/nextcloud:/var/www/html/data \
    -e POSTGRES_HOST=postgres \
    -e POSTGRES_DB=nextcloud \
    -e POSTGRES_USER=nextcloud \
    -e POSTGRES_PASSWORD=contraseña_db \
    nextcloud:apache

Jellyfin: Servidor Multimedia

Jellyfin es un fork de Emby que ofrece streaming de contenido multimedia sin restricciones:

docker run -d \
    --name jellyfin \
    --restart unless-stopped \
    -p 8096:8096 \
    -v jellyfin-config:/config \
    -v jellyfin-cache:/cache \
    -v /srv/nas/media:/media:ro \
    --device /dev/dri:/dev/dri \
    jellyfin/jellyfin:latest

El flag --device /dev/dri habilita aceleración por hardware para transcodificación (requiere Intel Quick Sync o GPU compatible).


8. Hardening y Consideraciones de Seguridad

Firewall mediante UFW

sudo apt install -y ufw

# Reglas básicas
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Servicios esenciales
sudo ufw allow ssh
sudo ufw allow 53/tcp    # DNS
sudo ufw allow 53/udp
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS
sudo ufw allow 445/tcp   # SMB

# Activación
sudo ufw enable

Actualizaciones Automáticas

sudo apt install -y unattended-upgrades

# Configuración
sudo dpkg-reconfigure -plow unattended-upgrades

Acceso Remoto Seguro

Para acceso desde redes externas, implementar VPN mediante WireGuard:

sudo apt install -y wireguard

# Generación de claves
wg genkey | tee privatekey | wg pubkey > publickey

9. Análisis de Consumo Energético

La siguiente tabla presenta mediciones reales de consumo energético:

ConfiguraciónIdleCarga MediaCarga Máxima
Mini PC Intel N100 + 2× 2.5″ SSD8W15W22W
Notebook i5-8250U + 2× HDD 2.5″18W35W55W
PC Torre (i5-4590 + 4× HDD 3.5″)45W65W95W

Costo eléctrico anual (asumiendo $0.15/kWh, funcionamiento 24/7):

  • Mini PC: ~$20 USD/año
  • Notebook: ~$46 USD/año
  • PC Torre: ~$86 USD/año

10. Conclusiones

La implementación de un servidor doméstico basado en GNU/Linux y contenedores Docker constituye una solución técnicamente viable, económicamente eficiente y ambientalmente sostenible. El stack tecnológico presentado permite desplegar servicios de grado empresarial con hardware reutilizado, eliminando costos de licenciamiento y reduciendo el impacto ambiental.

Las mediciones de consumo energético demuestran que configuraciones modernas (SoC Intel N100, procesadores ARM) pueden operar con menos de 20W, haciendo viable el funcionamiento continuo sin impacto significativo en costos operativos.

El uso de contenedores proporciona aislamiento, portabilidad y facilidad de actualización, mientras que la filosofía de software libre garantiza transparencia, auditabilidad y sostenibilidad a largo plazo.


Referencias

Docker, Inc. (2013). Docker: Lightweight Linux Containers for Consistent Development and Deployment. https://www.docker.com

Halpern, B., et al. (2018). Network-wide Ad Blocking: DNS Sinkhole Implementation. Pi-hole LLC.

Koch, P. (2019). Unbound DNS Resolver: Architecture and Implementation. NLnet Labs. https://www.nlnetlabs.nl/documentation/unbound/

Merkel, D. (2014). Docker: Lightweight Linux Containers for Consistent Development and Deployment. Linux Journal, 2014(239), Article 2.

Soltesz, S., et al. (2007). Container-based Operating System Virtualization: A Scalable, High-performance Alternative to Hypervisors. ACM SIGOPS Operating Systems Review, 41(3), 275-287.

Stallman, R. (2002). Free Software, Free Society: Selected Essays. GNU Press.


Recursos Adicionales

  • Ubuntu Server Documentation: https://ubuntu.com/server/docs
  • Docker Official Documentation: https://docs.docker.com
  • Pi-hole Documentation: https://docs.pi-hole.net
  • Nextcloud Administration Manual: https://docs.nextcloud.com
  • Jellyfin Documentation: https://jellyfin.org/docs
  • RFC 1034 – Domain Names: Concepts and Facilities
  • RFC 1035 – Domain Names: Implementation and Specification

Licencia: Este documento se distribuye bajo Creative Commons BY-SA 4.0

Comentarios

Dejá una respuesta