Cómo montar tu propio VPS como reverse proxy con WireGuard para evitar los bloqueos de Cloudflare

Diagrama de arquitectura VPS con WireGuard como reverse proxy
10 min. Lectura
0 Vistas
0 Valoración

El problema

Cada fin de semana, LaLiga y la justicia española obligan a los ISP a bloquear rangos de IP de Cloudflare por temas de piratería. Aunque no tengas nada que ver con esto, si usas Cloudflare Tunnel para acceder a tus servicios domésticos (domótica, webs en desarrollo, servidor Proxmox, etc.), lo sufres igualmente.

Resultado: No puedes acceder a tus propios servicios legítimos durante los partidos de fútbol.

La solución

Montar tu propia infraestructura con:

  • VPS con IP limpia (Hetzner, 4-5€/mes)
  • Túnel WireGuard cifrado entre el VPS y tu casa
  • Nginx Proxy Manager como reverse proxy
  • Control total, sin depender de terceros

Arquitectura final

Internet → VPS Hetzner (IP_DEL_VPS)
    ↓
Nginx Proxy Manager (SSL automático)
    ↓
Túnel WireGuard cifrado (10.100.0.0/24)
    ↓
CT WireGuard en Proxmox (192.168.1.X)
    ↓
Tu red local → Todos tus servicios

Requisitos previos

  • Dominio propio, por ejemplo ejemplo.site
  • Servidor Proxmox en casa
  • Conocimientos básicos de terminal SSH
  • ~20€ de prepago inicial para Hetzner (se convierte en saldo)

PASO 1: Generar clave SSH para Hetzner

En tu ordenador principal (en mi caso Arch Linux):

# Generar clave específica para Hetzner
ssh-keygen -t ed25519 -f ~/.ssh/id_hetzner -C "jaume@hetzner-vps"

# Dejar passphrase vacío o añadir una contraseña

# Mostrar la clave pública
cat ~/.ssh/id_hetzner.pub

Copiar TODA la línea que empieza por ssh-ed25519 AAAA... y termina en jaume@hetzner-vps.


PASO 2: Contratar VPS en Hetzner

2.1. Crear cuenta en Hetzner

Ve a: https://www.hetzner.com/cloud

2.2. Configuración del servidor

Seleccionar:

  • Location: Nuremberg o Helsinki
  • Image: Ubuntu 24.04
  • Type: Shared vCPU → CX23 (2 vCPU, 4GB RAM, 40GB SSD)
  • Precio: 4,22€/mes + IVA ≈ 5,11€/mes
  • SSH Keys: Pegar la clave pública generada en el Paso 1
  • Backups: NO (no necesario)
  • Name: vps-casa o similar

2.3. Prepago inicial

Hetzner requiere un prepago de 20€ que se convierte en saldo de cuenta. Con el CX23 a ~5€/mes, dura casi 4 meses.

Nota: Es una medida anti-fraude estándar en proveedores europeos.

2.4. Obtener IP del VPS

Una vez creado, Hetzner te asigna una IP pública. Anótala (en nuestro ejemplo: IP_DEL_VPS).


PASO 3: Primera conexión al VPS

ssh -i ~/.ssh/id_hetzner root@IP_DEL_VPS

La primera vez preguntará si confías en el host, escribe yes.

Deberías ver:

Welcome to Ubuntu 24.04.3 LTS
root@vps-casa:~#

PASO 4: Actualizar el sistema

apt update && apt upgrade -y

Tardará unos minutos. Si al final te avisa de "Pending kernel upgrade", reinicia:

reboot

Espera 30-60 segundos y vuelve a conectar:

ssh -i ~/.ssh/id_hetzner root@IP_DEL_VPS

PASO 5: Instalar Docker y Docker Compose

# Instalar dependencias
apt install -y ca-certificates curl gnupg lsb-release

# Añadir repositorio oficial de Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

# Instalar Docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Verificar instalación
docker --version

Debería mostrar: Docker version 29.1.2 o similar.


PASO 6: Instalar WireGuard en el VPS

# Instalar WireGuard
apt install -y wireguard

# Crear directorio para claves
mkdir -p /etc/wireguard

# Generar claves del VPS
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key

# Mostrar las claves
echo "Clave privada VPS:"
cat /etc/wireguard/server_private.key
echo ""
echo "Clave pública VPS:"
cat /etc/wireguard/server_public.key

Guardar ambas claves en un lugar seguro.


PASO 7: Configurar WireGuard en el VPS

nano /etc/wireguard/wg0.conf

Pegar esta configuración (sustituyendo TU_CLAVE_PRIVADA_VPS):

[Interface]
Address = 10.100.0.1/24
ListenPort = 51820
PrivateKey = TU_CLAVE_PRIVADA_VPS

# Habilitar forwarding
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0

[Peer]
# Proxmox en casa
PublicKey = CLAVE_PUBLICA_PROXMOX
AllowedIPs = 10.100.0.2/32, 192.168.1.0/24
PersistentKeepalive = 25

Nota: Dejar CLAVE_PUBLICA_PROXMOX así de momento, la generaremos en el siguiente paso.

Guardar: Ctrl+O, Enter, Ctrl+X


PASO 8: Crear CT WireGuard en Proxmox

Opción recomendada: Script de Proxmox Community

Desde el shell de Proxmox (host):

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/wireguard.sh)"

Durante la instalación:

  • CT ID: 102 (por defecto)
  • OS: Debian 13
  • 4GB disco, 1 CPU, 512MB RAM
  • WGDashboard: N (no necesario para un túnel fijo)

El script configura automáticamente TUN/TAP y todos los requisitos.

Asignar IP estática al CT

Desde la interfaz web de Proxmox:

  1. CT 102 → Network
  2. Doble clic en eth0
  3. Cambiar de DHCP a Static
  4. IPv4/CIDR: 192.168.1.X/24 (ajustar según tu red)
  5. Gateway: 192.168.1.1 (tu router)
  6. OK y aplicar configuración

PASO 9: Generar claves WireGuard en el CT

# Entrar al CT
pct enter 102

# Generar claves
wg genkey | tee /etc/wireguard/client_private.key | wg pubkey > /etc/wireguard/client_public.key

# Mostrar las claves
echo "Clave privada CT:"
cat /etc/wireguard/client_private.key
echo ""
echo "Clave pública CT:"
cat /etc/wireguard/client_public.key

Guardar ambas claves.


PASO 10: Configurar WireGuard en el CT

Dentro del CT:

nano /etc/wireguard/wg0.conf

Pegar:

[Interface]
Address = 10.100.0.2/24
PrivateKey = TU_CLAVE_PRIVADA_CT

[Peer]
# VPS Hetzner
PublicKey = CLAVE_PUBLICA_VPS
Endpoint = IP_DEL_VPS:51820
AllowedIPs = 10.100.0.1/32
PersistentKeepalive = 25

Sustituir:

  • TU_CLAVE_PRIVADA_CT → Clave privada del CT
  • CLAVE_PUBLICA_VPS → Clave pública del VPS

Guardar y salir del CT:

exit

PASO 11: Actualizar configuración del VPS

Volver a la terminal del VPS y actualizar la clave pública del CT:

nano /etc/wireguard/wg0.conf

Sustituir:

PublicKey = CLAVE_PUBLICA_PROXMOX

Por:

PublicKey = LA_CLAVE_PUBLICA_REAL_DEL_CT

Guardar.


PASO 12: Configurar firewall del VPS

# Instalar UFW
apt install -y ufw

# Permitir SSH (¡IMPORTANTE!)
ufw allow 22/tcp

# Permitir WireGuard
ufw allow 51820/udp

# Permitir HTTP y HTTPS
ufw allow 80/tcp
ufw allow 443/tcp

# Activar firewall
ufw enable

Confirmar con y.


PASO 13: Arrancar túnel WireGuard

En el VPS:

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
wg show

En el CT (Proxmox):

pct enter 102
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
wg show

Deberías ver:

interface: wg0
  peer: [clave pública del otro extremo]
    latest handshake: X seconds ago
    transfer: XXX B received, XXX B sent

Verificar conectividad

Desde el CT, hacer ping al VPS:

ping -c 4 10.100.0.1

Debería responder con ~60ms de latencia.


PASO 14: Configurar routing en el CT

Para que el VPS pueda alcanzar tu red local a través del túnel:

# Dentro del CT
pct enter 102

# Habilitar IP forwarding
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# Añadir regla NAT
iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -o eth0 -j MASQUERADE

# Guardar reglas
apt install -y iptables-persistent
netfilter-persistent save

exit

PASO 15: Configurar ruta estática en el router

Esto es CRÍTICO para que las respuestas vuelvan correctamente.

En tu router (en mi caso: Router Smart WiFi 6 de Telefónica):

  1. Acceder a http://192.168.1.1
  2. Usuario: admin, contraseña: (la del router)
  3. Buscar: Red LocalEnrutamiento estático (o RoutingStatic Routes)
  4. Añadir ruta:
Campo Valor
Red de destino 10.100.0.0
Máscara de subred 255.255.255.0
Puerta de enlace 192.168.1.X
Interfaz LAN
  1. Guardar

Esto hace que toda tu red local sepa cómo responder al VPS.


PASO 16: Instalar Nginx Proxy Manager

En el VPS:

mkdir -p /opt/nginx-proxy-manager
cd /opt/nginx-proxy-manager
nano docker-compose.yml

Pegar:

version: "3.8"
services:
  app:
    image: "jc21/nginx-proxy-manager:latest"
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "81:81" # Panel de administración
    environment:
      DB_SQLITE_FILE: "/data/database.sqlite"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Guardar y arrancar:

docker compose up -d

Esperar 30 segundos y acceder: http://IP_DEL_VPS:81

Credenciales por defecto:

  • Email: admin@example.com
  • Password: changeme

Al entrar, te pedirá cambiar el email y contraseña.


PASO 17: Instalar Fail2ban (protección)

apt install -y fail2ban

# Crear configuración
nano /etc/fail2ban/jail.local

Pegar:

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
banaction = ufw

[sshd]
enabled = true
port = 22
logpath = /var/log/auth.log

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log

[nginx-noscript]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

[nginx-badbots]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

Arrancar:

systemctl enable fail2ban
systemctl start fail2ban
systemctl status fail2ban

Ver IPs baneadas:

fail2ban-client status sshd

PASO 18: Configurar Proxy Hosts

En Nginx Proxy Manager (http://IP_DEL_VPS:81):

Para cada subdominio que quieras exponer:

Proxy Hosts → Add Proxy Host

Ejemplo: Home Assistant

Details:

  • Domain Names: hass.ejemplo.site
  • Scheme: http
  • Forward Hostname/IP: 192.168.1.X
  • Forward Port: 8123
  • Cache Assets: NO marcar
  • Block Common Exploits: SÍ marcar
  • Websockets Support: SÍ marcar

SSL: Dejar en "None" por ahora

Save

Configuraciones recomendadas por tipo de servicio:

Webs estáticas (web1, web2, web3):

  • Cache Assets: ✅
  • Block Common Exploits: ✅
  • Websockets: ❌

Apps dinámicas (Home Assistant, Zigbee2MQTT, Homepage):

  • Cache Assets: ❌
  • Block Common Exploits: ✅
  • Websockets: ✅

Proxmox / PBS (HTTPS backends):

  • Scheme: https://
  • Cache Assets: ❌
  • Block Common Exploits: ✅
  • Websockets: ✅
  • Advanced → Custom Nginx Configuration:
proxy_ssl_verify off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

phpMyAdmin / Piwigo:

  • Cache Assets: ❌
  • Block Common Exploits: ✅
  • Websockets: ❌

PASO 19: Migración DNS

19.1. Exportar configuración actual de Cloudflare

Antes de cambiar nada, exporta tus registros DNS actuales:

Opción A: Capturas de pantalla del panel de Cloudflare

Opción B: Exportación via API (si tienes muchos registros)

19.2. Cambiar nameservers en GoDaddy

  1. Acceder a: https://dcc.godaddy.com/domains
  2. Seleccionar ejemplo.site
  3. Buscar sección "Nameservers"
  4. Cambiar de Custom (Cloudflare) a Use GoDaddy nameservers

Los nameservers de GoDaddy son:

ns15.domaincontrol.com
ns16.domaincontrol.com

19.3. Configurar registros DNS en GoDaddy

En Manage DNS del dominio:

Eliminar:

  • ❌ A Record "Parked"
  • ❌ CNAME "www"
  • ❌ CNAME "_domainconnect"
  • ❌ TXT "_dmarc" (a menos que uses email)

Mantener:

  • ✅ NS Records (ns15/ns16.domaincontrol.com)
  • ✅ SOA Record (auto-generado)

Añadir estos DOS registros:

Type Name Value TTL
A @ IP_DEL_VPS 600
A * IP_DEL_VPS 600

Explicación:

  • @ → El dominio principal apunta al VPS
  • *Wildcard: TODOS los subdominios apuntan al VPS

Guardar cambios.

19.4. Verificar propagación DNS

Esto puede tardar 10-30 minutos (máximo 48h, pero normalmente es rápido).

Verificar consultando directamente a GoDaddy:

dig @ns15.domaincontrol.com ejemplo.site +short

Debería devolver: IP_DEL_VPS

Verificar propagación global:

dig @8.8.8.8 ejemplo.site +short
dig @8.8.8.8 web1.ejemplo.site +short

Cuando devuelvan IP_DEL_VPS, ya está propagado.

Limpiar caché DNS local:

Tu ordenador puede tener caché antigua. Prueba en modo incógnito del navegador o edita temporalmente /etc/hosts:

sudo nano /etc/hosts

Añadir:

IP_DEL_VPS web1.ejemplo.site
IP_DEL_VPS hass.ejemplo.site
# ... (resto de subdominios)

Esto fuerza la resolución mientras propaga el DNS globalmente.


PASO 20: Activar SSL (Let's Encrypt)

Una vez el DNS esté propagado (consultando a @8.8.8.8 devuelve tu IP), activa SSL.

Para CADA Proxy Host:

  1. Proxy Hosts → Click en los 3 puntosEdit
  2. Pestaña SSL
  3. Configuración:
    • SSL Certificate: Request a New SSL Certificate
    • ✅ Force SSL
    • ✅ HTTP/2 Support
    • ✅ HSTS Enabled
  4. Save

Nginx Proxy Manager pedirá el certificado automáticamente a Let's Encrypt.

Verificar HTTPS

Abre el navegador en modo incógnito:

https://web1.ejemplo.site

Debería cargar con candado verde 🔒

Repite para todos tus subdominios.


PASO 21: Limpieza final

Quitar /etc/hosts temporal

sudo nano /etc/hosts

Eliminar las líneas que añadiste temporalmente.

Limpiar caché DNS local

Si usas AdGuard Home o Pi-hole:

ssh root@192.168.1.X
systemctl restart AdGuardHome
# o
pihole restartdns

Resultado final

¡Felicidades! Ya tienes tu propia infraestructura funcionando:

VPS con IP limpia (sin bloqueos)
Túnel WireGuard cifrado
Nginx Proxy Manager con SSL automático
Fail2ban protegiendo contra ataques
DNS apuntando a tu VPS
HTTPS funcionando en todos los subdominios

Ventajas conseguidas:

  • Adiós bloqueos de LaLiga
  • Control total de tu infraestructura
  • SSL/HTTPS automático
  • Protección básica contra ataques
  • Independencia de Cloudflare

Mantenimiento básico

Verificar estado del túnel

# En el VPS
wg show

# En el CT
pct enter 102
wg show

Ver logs de Fail2ban

fail2ban-client status
journalctl -u fail2ban -f

Actualizar Nginx Proxy Manager

cd /opt/nginx-proxy-manager
docker compose pull
docker compose up -d

Añadir nuevo subdominio

  1. Crear registro DNS en GoDaddy (si no usas wildcard)
  2. Crear Proxy Host en Nginx Proxy Manager
  3. Activar SSL

Costes mensuales

  • VPS Hetzner CX23: ~5,11€/mes
  • Dominio: Ya lo tenías (variable según registrar)
  • Total: ~5€/mes

A cambio de:

  • Infraestructura propia
  • Sin bloqueos
  • Control total
  • Aprendizaje valioso

Próximos artículos

Esta guía es el primero de una serie sobre infraestructura self-hosted:

  1. VPS como reverse proxy con WireGuard (este artículo)
  2. 🔜 Monitorización con Uptime Kuma self-hosted
  3. 🔜 Backup del VPS remoto a Proxmox Backup Server

Notas finales

Este tutorial está basado en mi experiencia real migrando de Cloudflare Tunnel a infraestructura propia. Los bloqueos de LaLiga cada fin de semana me impedían acceder a mi domótica, webs en desarrollo y servidor Proxmox.

Ahora tengo control total, pago 5€/mes por tranquilidad, y de paso he aprendido un montón sobre redes, túneles VPN y reverse proxies.

¿Vale la pena? Para mí, absolutamente sí.


Recursos adicionales


¿Te ha sido útil?

Ayúdame a mejorar con tu puntuación y comentarios.

0.0 (0 votos)
Jaume Ferré

Jaume Ferré

Soy un entusiasta de las nuevas tecnologías, apasionado por explorar su potencial innovador. Colecciono CDs en formato físico y disfruto creando mezclas musicales. Además, la fotografía es otra de mis pasiones, capturando momentos y expresiones con cada disparo. ¡Gracias por leerme!

💬 Comentarios

Los comentarios están gestionados por GitHub Discussions. Necesitas una cuenta de GitHub para participar. ¡Es gratis y rápido!