Gabriel Tello

Cómo Exponer un Servidor Local Detrás de CGNAT Usando WireGuard y un VPS

Fecha de publicación: | 1100 palabras | 6 mins

Si eres como muchos que enfrentan las frustrantes limitaciones del Carrier-Grade NAT (CGNAT), probablemente tengas dificultades para exponer servicios alojados en tu servidor local al Internet. CGNAT hace que sea complicado acceder a tu servidor de forma remota porque no tienes una dirección IP pública. En esta guía, te enseñaré un método para enrutar tráfico a través de un Servidor Privado Virtual (VPS) utilizando WireGuard. Esta solución garantiza una conectividad confiable y segura, incluso detrás de CGNAT.

Descripción general

El objetivo es usar un VPS con una dirección IP pública como punto de relevo para tu tráfico. Utilizaremos WireGuard, una VPN rápida y ligera, para crear un túnel seguro entre el VPS y tu servidor local. Una vez establecido el túnel, configuraremos iptables en el VPS para redirigir el tráfico a tu servidor local. Esta guía está basada en este excelente tutorial pero adaptada para mayor claridad y casos de uso específicos.

Note

Los pasos de esta guía asumen que tanto el VPS como el servidor local están usando Ubuntu (versión 20.04 o posterior) como SO.

Para entender mejor el flujo del tráfico en esta configuración, aquí tienes una representación visual de cómo se establece y mantiene la conexión entre el usuario, el VPS y el servidor local. El VPS actúa como un puente, enrutando el tráfico entre Internet y tu servidor local a través de un túnel de WireGuard:

Diagrama

Qué se necesitará

  1. Un VPS con una IP pública: Asegúrate de que tu proveedor de VPS soporte máquinas virtuales basadas en Kernel (KVM). Recomiendo estos proveedores:
  2. Un servidor local detrás de CGNAT: Puede ser cualquier dispositivo en tu red local. Me gusta usar las mini PCs EliteDesk de HP como esta.
  3. WireGuard instalado tanto en el VPS como en el servidor local.
  4. Conocimientos básicos de comandos de Linux y redes.

Verificar la configuración de red del VPS

Antes de continuar, asegúrate de que tu proveedor de VPS no tenga reglas de firewall o restricciones de red que puedan bloquear el tráfico. Algunos proveedores aplican configuraciones predeterminadas de firewall que podrían impedir conexiones entrantes a la IP pública de tu VPS o interferir con el redireccionamiento de tráfico a través del túnel de WireGuard. Consulta el panel de control de tu VPS o contacta a tu proveedor para confirmar:

  • Reglas de entrada: Asegúrate de que los puertos necesarios (por ejemplo, 55107 para WireGuard y los puertos para HTTP/SSH) estén abiertos.
  • Reglas de salida: Asegúrate de que tu VPS pueda establecer conexiones salientes con tu servidor local a través del túnel de WireGuard.

Sin la configuración adecuada, tu sistema puede no funcionar como se espera. Ajusta estas configuraciones según sea necesario antes de continuar.

Habilitar redirección de IP en el VPS

La redirección de IP permite que el VPS enrute tráfico entre sus interfaces.

  • Verifica si la redirección de IP está habilitada:

    1cat /proc/sys/net/ipv4/ip_forward  

    Si muestra 0, está deshabilitada.

  • Habilita la redirección de IP temporalmente:

    1sudo sysctl -w net.ipv4.ip_forward=1  
  • Haz que la redirección de IP sea persistente tras reinicios:

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

Instalar WireGuard

Instala WireGuard en el VPS y el servidor local:

1sudo apt install wireguard  

Configurar WireGuard

En el VPS y el servidor local, genera claves de WireGuard:

  • Crea el archivo de configuración inicial:

    1umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null  
  • Genera claves privadas y públicas:

    1wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey  
    • wg0.conf: Almacena la clave privada de WireGuard.
    • publickey: Contiene la clave pública para compartir.
  • Anota ambas claves públicas. Se usarán para configurar el túnel entre el VPS y el servidor local.

En el VPS:

Edita /etc/wireguard/wg0.conf:

1[Interface]
2PrivateKey = TU_CLAVE_PRIVADA_DEL_VPS
3ListenPort = 55107
4Address = 192.168.4.1/24
5
6[Peer]
7PublicKey = CLAVE_PUBLICA_DE_TU_SERVIDOR_LOCAL
8AllowedIPs = 192.168.4.2/32

En el servidor local:

Edita /etc/wireguard/wg0.conf:

1[Interface]
2PrivateKey = TU_CLAVE_PRIVADA_DEL_SERVIDOR_LOCAL
3Address = 192.168.4.2/24
4
5[Peer]
6PublicKey = CLAVE_PUBLICA_DEL_VPS
7AllowedIPs = 192.168.4.1/32
8Endpoint = IP_PÚBLICA_DEL_VPS:55107
9PersistentKeepalive = 25

Iniciar WireGuard

Ejecuta estos comandos en el VPS y el servidor local para iniciar WireGuard:

  • Inicia WireGuard:
    1sudo systemctl start wg-quick@wg0
  • Haz que se inicie automáticamente al arrancar el sistema:
    1sudo systemctl enable wg-quick@wg0
  • Verifica la conexión:
    1sudo wg show
    Si la configuración es correcta, deberías ver un handshake entre el VPS y el servidor local.

Redirigir tráfico con iptables

Este paso debe realizarse en el VPS para redirigir el tráfico entrante hacia tu servidor local.

Redirigir tráfico HTTP (puerto 80)

Añade las siguientes reglas de iptables:

1sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.4.2:80
2sudo iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 80 -d 192.168.4.2 -j SNAT --to-source 192.168.4.1
3sudo iptables -A FORWARD -i eth0 -o wg0 -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
4sudo iptables -A FORWARD -i wg0 -o eth0 -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Guarda las reglas con netfilter-persistent para hacerlas persistentes:

1sudo apt install iptables-persistent
2sudo netfilter-persistent save
3sudo netfilter-persistent reload

Redirigir tráfico SSH

Este paso debe realizarse en el VPS para permitir acceso SSH a tu servidor local. La redirección SSH permite conectarte a tu servidor local primero accediendo al VPS, que enruta el tráfico SSH a través del túnel WireGuard.

Configurar la redirección SSH

Añade estas reglas de iptables:

1sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.4.2:22
2sudo iptables -t nat -A POSTROUTING -o wg0 -p tcp --dport 22 -d 192.168.4.2 -j SNAT --to-source 192.168.4.1
3sudo iptables -A FORWARD -i eth0 -o wg0 -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
4sudo iptables -A FORWARD -i wg0 -o eth0 -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Prueba el acceso SSH a tu servidor local a través del VPS:

1ssh -p 2222 <nombre_usuario>@<IP_PÚBLICA_DEL_VPS>

Mantener acceso directo al VPS

Las reglas de redireccionamiento SSH no afectarán tu capacidad para acceder directamente al VPS a través de su puerto predeterminado (22). Si es necesario, explícitamente permite el acceso SSH directo:

1sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Prueba de la configuración

Verifica el tráfico HTTP navegando a la IP pública de tu VPS en un navegador:

1http://<IP_PÚBLICA_DEL_VPS>

Prueba el acceso SSH conectándote al VPS:

1ssh <nombre_usuario>@<IP_PÚBLICA_DEL_VPS>

Conéctate a tu servidor local a través del VPS:

1ssh -p 2222 <nombre_usuario>@<IP_PÚBLICA_DEL_VPS>

Siguiendo esta guía, habrás logrado exponer un servidor local detrás de CGNAT utilizando WireGuard y un VPS. Esta configuración te permite redirigir tráfico de manera segura hacia tu servidor local, incluyendo HTTP y SSH, mientras mantienes acceso directo a tu VPS.

#Linux   #Auto-Hosting   #VPN   #VPS   #Servidor   #Post  

Responder a este post por correo ↪