Usar la IP estática de un VPS alquilado para acceder a mi servidor local ha sido toda una aventura ya que sabía que podía hacerse pero no encontraba información suficiente o actualizada en Internet. Por eso, ahora que lo he conseguido, te comparto un pequeño tutorial paso a paso, pero antes, te cuento cómo empezó la odisea…
Historia
Hace poco me compré un mini PC «refurbished» en Amazon para montar un servidor de películas y series y así poder ver contenidos en los ratos muertos cuando estoy de viaje o fuera de casa. La primera intención era montarlo en una Raspberry Pi pero ya tenía un servidor DNS montado con PiHole y una VPN con PiVPN y me daba pereza reconfigurar todos los dispositivos de casa otra vez.
Pensé en comprar una segunda Raspberry con un hat para memorias NVMe ya que tampoco quería achicharrar la tarjeta SD en 2 días pero, valorando alternativas, al final me decidí a comprar un mini PC porque con el precio actual de un kit que incluya Raspberry Pi 5 + carcasa + cargador tienes un mini pc de segunda mano con procesador Ryzen 5 o Intel I5, con 8Gb de ram y disco NVMe de 256 Gb.
Los mini pc son algo más grandes y consumen más energía pero el rendimiento está a años luz del de una Raspberry Pi.
En Amazon encontré un mini pc de segunda mano, concretamente el modelo HP EliteDesk 800 G3 DM/Core i5 6500T@2,5GHz con 8 GB de RAM, memoria NVMe de 256 GB y Tarjeta gráfica Intel HD.

Primeros pasos
Lo primero que hice con el mini pc fue formatearlo y reinstalar Windows porque no me fiaba del pre instalado. También le agregué un módulo extra de 8 Gb de RAM (16 en total) y le instalé Jellyfin para crear mi servidor de películas.
Cómo el procesador solo rondaba el 15-20% viendo una peli en streaming, vi que todavía le podía dar más caña, así que le monte 3 servidores de Counter-Strike 2 de 32 slots cada uno, abrí los puertos en el router y al segundo día de estar accesibles, ya había gente dentro jugando.
Primeros problemas
En casa tengo fibra de O2, la marca Hacendado de Movistar. A diferencia de la empresa madre, O2 (de momento) no ofrece a sus clientes el servicio de IP estática y funciona solo con IPs dinámicas que cambian aleatoriamente o cada vez que se reinicia el router.
Esto causaba que, al cambiar de IP, aparecieran duplicados en los listados de servidores de Counter-Strike que daban error si alguien intentaba entrar.

La mayoría de estos listados como CS2Browser.com funcionan con IPs así que el uso de nombres de host dinámicos como NOIP, DuckDNS o DynDNS quedaba descartado. una vez más, me puse a buscar alternativas y me encontré en un subforo de Reddit un chico que comentaba que había usado la IP estática de un VPS redireccionando los puertos a su servidor local.
Un VPS «guarro» de 2 vCores, 4GB de RAM, Linux (Debian) instalado, IP española y tráfico ilimitado sale por unos 4€ al mes así que por probar no perdía nada.
Ahora si, empezamos el tutorial!
Usar la IP estática de un VPS para servidor local
Una vez tenemos acceso el servidor VPS, nos conectamos por SSH y actualizamos los paquetes con estos comandos:
sudo apt update sudo apt upgrade
Seguidamente habilitamos el IP Forwarding en nuestro servidor VPS editando el archivo de configuración de sysctl:
sudo nano /etc/sysctl.conf
Buscamos la siguiente línea y la descomentamos quitando el símbolo # de delante (o la añadimos si no existe):
net.ipv4.ip_forward=1
Y aplicamos los cambios con este otro comando:
sudo sysctl -p
Ahora vamos a usar iptables para redireccionar el tráfico TCP/UDP desde nuestro VPS a la IP externa de nuestro router:
Instalamos iptables si no lo tenemos instalado ya:
sudo apt-get install iptables
Configuramos iptables para redireccionar el tráfico TCP del puerto 27015 del VPS al puerto 27015 de nuestro servidor local:
sudo iptables -t nat -A PREROUTING -p tcp --dport 27015 -j DNAT --to-destination IPDELSERVIDORLOCAL:27015
Configuramos iptables para redireccionar el tráfico UDP del puerto 27015 del VPS al puerto 27015 de nuestro servidor local:
sudo iptables -t nat -A PREROUTING -p udp --dport 27015 -j DNAT --to-destination IPDELSERVIDORLOCAL:27015
⚠️ Recuerda cambiar IPDELSERVIDORLOCAL por la IP externa de tu servidor local.
Finalizamos el redireccionamiento con:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
Y listo!, ahora el servidor VPS redirecciona las conexiones de su puerto 27015 al puerto 27015 de nuestro servidor local, recuerda abrir el puerto 27015 en el router para TCP y UDP.
Script para actualizar la IP dinámica
Cómo ya he comentado antes, mi ISP cambia la IP de mi servidor local cada vez que se reinicia el router. Para evitar tener que entrar en el VPS y cambiar la IP de iptables cada vez que esta cambia, he escrito un script que se ejecuta cada 5 minutos gracias a una tarea cron y automatiza todo el proceso.
Para evitar tener que editar la IP en el script, también he creado un DNS dinámico en NO-IP: miserverlocal.ddns.net
Lo primero que haremos será crear un archivo llamado ip.txt con nano, lo podemos dejar vacío o poenr una IP de ejemplo como 123.123.123.123:
nano ip.txt
Luego crearemos un archivo llamado updateIP.sh con nano:
nano updateIP.sh
Dentro copiamos esto:
#!/bin/bash
# Archivo para guardar la IP previa
IP_FILE="/root/ip.txt"
# Dominio a resolver
DOMAIN="miserverlocal.ddns.net"
# Obtener la IP actual del dominio y eliminar cualquier espacio o salto de línea
CURRENT_IP=$(dig +short $DOMAIN | tr -d ' \n')
# Verificar que se obtuvo una IP válida
if [ -n "$CURRENT_IP" ]; then
# Leer la última IP guardada (si existe) y eliminar cualquier espacio o salto de línea
if [ -f "$IP_FILE" ]; then
LAST_IP=$(cat $IP_FILE | tr -d ' \n')
else
LAST_IP=""
fi
# Comparar la IP actual con la última IP
if [ "$CURRENT_IP" != "$LAST_IP" ]; then
# Si la IP ha cambiado, actualizar las reglas de iptables
# Eliminar reglas existentes para evitar duplicados
sudo iptables -t nat -D PREROUTING -p tcp --dport 27015 -j DNAT --to-destination $LAST_IP:27015 2>/dev/null
sudo iptables -t nat -D PREROUTING -p udp --dport 27015 -j DNAT --to-destination $LAST_IP:27015 2>/dev/null
# Añadir la nueva regla
sudo iptables -t nat -A PREROUTING -p tcp --dport 27015 -j DNAT --to-destination $CURRENT_IP:27015
sudo iptables -t nat -A PREROUTING -p udp --dport 27015 -j DNAT --to-destination $CURRENT_IP:27015
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
# Guardar la nueva IP en el archivo
echo $CURRENT_IP > $IP_FILE
echo "Redireccionamiento actualizado a $CURRENT_IP"
else
echo "La IP no ha cambiado, no se realizaron modificaciones."
fi
else
echo "No se pudo resolver la IP de $DOMAIN"
fi
Guardamos el script y lo hacemos ejecutable con este comando:
chmod +x updateIP.sh
Para configurar una tarea cron, abrimos la lista:
crontab -e
Y añadimos esta linea para que se ejecute el script cada 5 minutos y actualice iptables si la IP ha cambiado.:
*/5 * * * * sh /root/updateIP.sh
También podemos añadir esta linea para que se ejecute al reiniciar el servidor VPS:
@reboot sh /root/updateIP.sh
Guardamos los datos y listo!, ya tenemos el script preparado y la tarea cron en marcha.
Ahora podemos lanzar el script y dejar todo funcionando con:
sh /root/updateIP.sh
Resumen
Ahora, cuando un cliente se conecta a la IP estática del VPS, este hace IP forwarding mediante iptables y le pasa la conexión a la IP de mi servidor local en el puerto indicado, mientras tanto, un script que se ejecuta cada 5 minutos actualiza la IP de mi servidor local en iptables si esta cambia.

Observaciones
Puedes ver la lista de iptables con el comando:
iptables -t nat --list -v
Espero que este pequeño tutorial te sirva de ayuda y ya sabes, si te ha gustado, deja un comentario más abajo o compártelo en redes sociales.
Un saludo!