Etiqueta: Casa

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

    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