Instalación de Red Overlay Nebula

Nebula es una herramienta de red overlay mesh desarrollada por Slack que permite crear redes privadas seguras entre múltiples nodos usando certificados X.509 y firewall basado en grupos. A diferencia de otras soluciones VPN, Nebula no requiere servidor central continuo gracias a sus nodos lighthouse que solo actúan como facilitadores de descubrimiento. Esta guía cubre la instalación completa de Nebula en Linux para conectar servidores VPS y baremetal.

Requisitos Previos

  • Mínimo 2 servidores Linux (uno como lighthouse con IP pública)
  • Ubuntu 20.04+, Debian 11+, CentOS 8+ o Rocky Linux 8+
  • Acceso root o sudo en todos los nodos
  • Puerto UDP 4242 abierto en el firewall del lighthouse
  • Kernel Linux 3.13+ (para soporte TUN/TAP)

Descarga e Instalación de Nebula

Descargar los binarios desde GitHub Releases:

# Descargar la última versión de Nebula (ajustar la versión según corresponda)
NEBULA_VERSION="v1.9.0"
wget https://github.com/slackhq/nebula/releases/download/${NEBULA_VERSION}/nebula-linux-amd64.tar.gz

# Extraer los binarios
tar xzf nebula-linux-amd64.tar.gz

# Mover los binarios al PATH del sistema
sudo mv nebula nebula-cert /usr/local/bin/

# Verificar la instalación
nebula --version
nebula-cert --version

Para arquitectura ARM (Raspberry Pi, servidores ARM):

# Descargar versión ARM64
wget https://github.com/slackhq/nebula/releases/download/${NEBULA_VERSION}/nebula-linux-arm64.tar.gz
tar xzf nebula-linux-arm64.tar.gz
sudo mv nebula nebula-cert /usr/local/bin/

Crear los directorios de configuración:

# Crear directorio de configuración (solo en el servidor que actuará de CA)
sudo mkdir -p /etc/nebula

Configuración de la Autoridad de Certificación

La CA de Nebula es un par de archivos (clave + certificado) que firma todos los certificados de nodos. Guardar estos archivos de forma segura.

# Crear el directorio para la CA (en una máquina segura, no en el lighthouse)
mkdir -p ~/nebula-ca
cd ~/nebula-ca

# Generar la clave y certificado de la CA
nebula-cert ca --name "MiEmpresa Nebula CA"

# Los archivos generados son:
# ca.crt - Certificado público de la CA (distribuir a todos los nodos)
# ca.key - Clave privada de la CA (¡NUNCA distribuir!)
ls -la ca.*

Opciones adicionales para la CA:

# CA con duración personalizada (por defecto 1 año)
nebula-cert ca --name "MiEmpresa Nebula CA" --duration 87600h  # 10 años

# Verificar el certificado de la CA
nebula-cert print --path ca.crt

Generación de Certificados para Nodos

Generar un certificado por cada nodo de la red. La IP asignada determina la dirección del nodo en la red overlay Nebula.

# Planificar el espacio de direcciones (ejemplo: 10.42.0.0/16)
# Lighthouse: 10.42.0.1/16
# Servidor web: 10.42.0.2/16
# Base de datos: 10.42.0.3/16

# Generar certificado para el lighthouse
nebula-cert sign \
  --name "lighthouse01" \
  --ip "10.42.0.1/16" \
  --groups "lighthouse,servidores" \
  --ca-crt ca.crt \
  --ca-key ca.key

# Generar certificado para un servidor web
nebula-cert sign \
  --name "web01" \
  --ip "10.42.0.2/16" \
  --groups "web,servidores" \
  --ca-crt ca.crt \
  --ca-key ca.key

# Generar certificado para un servidor de base de datos
nebula-cert sign \
  --name "db01" \
  --ip "10.42.0.3/16" \
  --groups "database,servidores" \
  --ca-crt ca.crt \
  --ca-key ca.key

# Verificar un certificado generado
nebula-cert print --path web01.crt

Distribuir los archivos a cada nodo:

# Para el lighthouse (copiar vía scp)
scp ca.crt lighthouse01.crt lighthouse01.key usuario@IP-LIGHTHOUSE:/etc/nebula/

# Para el servidor web
scp ca.crt web01.crt web01.key usuario@IP-WEB01:/etc/nebula/

# Asegurar permisos correctos en cada nodo
sudo chmod 600 /etc/nebula/*.key
sudo chmod 644 /etc/nebula/*.crt

Configuración del Lighthouse

El lighthouse es el nodo de descubrimiento con IP pública. Crear su archivo de configuración:

sudo nano /etc/nebula/config.yaml
# Configuración del Lighthouse Nebula
pki:
  ca: /etc/nebula/ca.crt
  cert: /etc/nebula/lighthouse01.crt
  key: /etc/nebula/lighthouse01.key

# Configuración del lighthouse
lighthouse:
  am_lighthouse: true
  interval: 60

# Escuchar en todas las interfaces en el puerto UDP 4242
listen:
  host: 0.0.0.0
  port: 4242

# Interfaz tunnel
tun:
  disabled: false
  dev: nebula1
  drop_local_broadcast: false
  drop_multicast: false
  tx_queue: 500
  mtu: 1300

# Registro de logs
logging:
  level: info
  format: text

# Firewall del lighthouse - permitir solo ICMP y Nebula
firewall:
  conntrack:
    tcp_timeout: 12m
    udp_timeout: 3m
    default_timeout: 10m
  outbound:
    - port: any
      proto: any
      host: any
  inbound:
    - port: any
      proto: icmp
      host: any
    - port: any
      proto: any
      group: servidores

Configuración de Nodos Regulares

Configuración para los nodos que se conectan al lighthouse:

sudo nano /etc/nebula/config.yaml
# Configuración de nodo regular Nebula
pki:
  ca: /etc/nebula/ca.crt
  cert: /etc/nebula/web01.crt
  key: /etc/nebula/web01.key

# Definir el lighthouse (usar IP pública real)
lighthouse:
  am_lighthouse: false
  interval: 60
  hosts:
    - "10.42.0.1"  # IP Nebula del lighthouse

# Mapa estático para el lighthouse (IP pública:puerto)
static_host_map:
  "10.42.0.1": ["IP-PUBLICA-LIGHTHOUSE:4242"]

# Escuchar en un puerto aleatorio (0 = automático)
listen:
  host: 0.0.0.0
  port: 0

# Opciones de tunelado
tun:
  disabled: false
  dev: nebula1
  drop_local_broadcast: false
  drop_multicast: false
  tx_queue: 500
  mtu: 1300

# Punch through NAT
punchy:
  punch: true
  respond: true

# Logging
logging:
  level: info
  format: text

# Reglas de firewall del nodo
firewall:
  conntrack:
    tcp_timeout: 12m
    udp_timeout: 3m
    default_timeout: 10m
  outbound:
    - port: any
      proto: any
      host: any
  inbound:
    - port: any
      proto: icmp
      host: any
    - port: 22
      proto: tcp
      group: servidores
    - port: 80
      proto: tcp
      group: servidores
    - port: 443
      proto: tcp
      group: servidores

Reglas de Firewall en Nebula

El firewall de Nebula opera por grupos y hosts. Los grupos se definen en los certificados:

# Ejemplos de reglas de firewall avanzadas en config.yaml
firewall:
  inbound:
    # Permitir ICMP desde cualquier nodo Nebula
    - port: any
      proto: icmp
      host: any

    # Permitir SSH solo desde el grupo "admin"
    - port: 22
      proto: tcp
      group: admin

    # Permitir acceso web desde cualquier nodo de la red
    - port: 80
      proto: tcp
      cidr: 10.42.0.0/16

    - port: 443
      proto: tcp
      cidr: 10.42.0.0/16

    # Permitir acceso a la base de datos solo desde servidores web
    - port: 5432
      proto: tcp
      group: web

    # Permitir cualquier tráfico desde un nodo específico
    - port: any
      proto: any
      host: "10.42.0.5"

Configuración como Servicio Systemd

Configurar Nebula para que inicie automáticamente:

# Crear el archivo de servicio systemd
sudo tee /etc/systemd/system/nebula.service << 'EOF'
[Unit]
Description=Nebula overlay networking tool
Wants=basic.target network-online.target nss-lookup.target time-sync.target
After=basic.target network.target network-online.target

[Service]
SyslogIdentifier=nebula
StandardOutput=syslog
StandardError=syslog
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/bin/nebula -config /etc/nebula/config.yaml
Restart=always
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target
EOF

# Recargar systemd y habilitar el servicio
sudo systemctl daemon-reload
sudo systemctl enable nebula
sudo systemctl start nebula

# Verificar el estado
sudo systemctl status nebula

Verificar la conectividad entre nodos:

# Ping entre nodos usando las IPs de Nebula
ping 10.42.0.1  # Lighthouse
ping 10.42.0.3  # Base de datos

# Ver la interfaz nebula1
ip addr show nebula1

# Ver rutas de Nebula
ip route | grep nebula

Solución de Problemas

El nodo no conecta con el lighthouse:

# Verificar logs en tiempo real
sudo journalctl -u nebula -f

# Comprobar que el puerto UDP está abierto en el lighthouse
nc -zuv IP-PUBLICA-LIGHTHOUSE 4242

# Verificar el firewall del sistema operativo en el lighthouse
sudo ufw status  # Ubuntu
sudo firewall-cmd --list-all  # CentOS/Rocky

Certificado inválido o expirado:

# Verificar la validez del certificado
nebula-cert print --path /etc/nebula/web01.crt

# Comprobar que la CA coincide
nebula-cert verify --ca /etc/nebula/ca.crt --crt /etc/nebula/web01.crt

Problemas de conectividad entre peers:

# Activar logging detallado temporalmente
# Editar config.yaml: logging.level: debug
sudo systemctl restart nebula
sudo journalctl -u nebula -f | grep -E "handshake|punch|relay"

Rendimiento de la interfaz:

# Verificar el MTU de la interfaz
ip link show nebula1

# Ajustar MTU si hay fragmentación (reducir a 1250 en config.yaml)
# tun.mtu: 1250

Conclusión

Nebula proporciona una solución de red overlay robusta y segura basada en certificados, ideal para conectar múltiples servidores VPS y baremetal en diferentes proveedores y regiones. Su modelo de seguridad basado en grupos y certificados X.509 lo hace especialmente adecuado para entornos donde se requiere control granular del acceso entre servicios.