Ir al contenido

VPN con Wireguard en Docker: Acceso seguro a servicios internos sin exponer puertos

Rogelio Guerra Riverón
Autor
Rogelio Guerra Riverón
Construyendo mi propia infraestructura web desde cero. Aquí documento cada paso: servidores, redes, contenedores y lo que vaya surgiendo.

Por qué necesitas esto
#

Hace unos meses me enfrenté a un problema común: quería acceder a mis servicios internos (Jellyfin, Home Assistant, etc.) desde fuera de casa, pero no quería exponerlos directamente en internet. Abrir puertos es un riesgo innecesario. La solución fue montar una VPN con Wireguard en Docker. Fue la mejor decisión que tomé para mi infraestructura casera.

Ventajas de Wireguard
#

  • Ligero: consume menos recursos que OpenVPN
  • Rápido: protocolo moderno y eficiente
  • Fácil de configurar: comparado con otras alternativas
  • Seguro: criptografía de última generación
  • Docker-friendly: hay imágenes oficiales excelentes

Preparación
#

Necesitas:

  • Un servidor con Docker instalado
  • El archivo docker-compose.yml
  • Un dominio o IP pública (para conectarte desde fuera)
  • Los clientes Wireguard en tus dispositivos

Instalación paso a paso
#

1. Crear el directorio de configuración
#

mkdir -p ~/wireguard/config
cd ~/wireguard

2. Docker Compose
#

Crea el archivo docker-compose.yml:

version: '3.8'

services:
  wireguard:
    image: linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
      - SERVERURL=tu-dominio-o-ip-publica.com
      - SERVERPORT=51820
      - PEERS=telefono,laptop,tablet
      - PEERDNS=auto
    ports:
      - "51820:51820/udp"
    volumes:
      - ./config:/config
      - /lib/modules:/lib/modules:ro
    networks:
      - mi-red
    restart: unless-stopped

networks:
  mi-red:
    driver: bridge
    ipam:
      config:
        - subnet: 10.0.0.0/24

Reemplaza:

  • tu-dominio-o-ip-publica.com con tu dirección real
  • Los PEERS con los nombres de tus dispositivos
  • La zona horaria según tu ubicación

3. Iniciar el contenedor
#

docker-compose up -d

Los archivos de configuración se generarán automáticamente en ./config. Espera unos segundos y verifica:

ls -la config/peer_*/

4. Obtener los códigos QR
#

Para conectar tus dispositivos:

docker exec wireguard cat /config/peer_telefono/peer_telefono.conf

O directamente los QR:

docker exec wireguard qrencode -t ansiutf8 < /config/peer_telefono/peer_telefono.conf

Escanea con tu cliente Wireguard en cada dispositivo.

Conectar servicios internos
#

Aquí viene lo importante. Quiero acceder a servicios en mi red interna. Para esto, modifico el docker-compose.yml y añado rutas:

environment:
  - ALLOWEDIPS=10.0.0.0/24,192.168.1.0/24

Esto permite que desde la VPN accedas a la red 192.168.1.0/24 (tu red local).

En el servidor, habilita el forwarding:

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Acceso desde clientes
#

Una vez conectado a la VPN, accedes a tus servicios usando sus IPs internas:

  • http://192.168.1.100:8096 para Jellyfin
  • http://192.168.1.50:8123 para Home Assistant
  • Lo que necesites en tu red

Mantenimiento
#

Renovar certificados (cada 6 meses aproximadamente):

docker exec wireguard /app/wireguard-tools/show-peer peer_nombre

Añadir un nuevo dispositivo:

docker-compose down
# Edita PEERS en docker-compose.yml
docker-compose up -d

Notas finales
#

  • Abre solo el puerto 51820/UDP en tu router
  • Usa firewall en el servidor para bloquear acceso innecesario
  • Verifica que el forwarding de IPs está activo
  • Monitoriza el tráfico de la VPN regularmente

Llevo varios meses con esta configuración y es totalmente estable. Accedo a mis servicios desde cualquier parte sin nervios de seguridad. Definitivamente, recomiendo este setup a cualquiera que quiera mantener su infraestructura doméstica privada pero accesible.


Equipamiento recomendado
#

Enlaces de afiliado. Sin coste extra para ti.