reenviar solicitudes tcp a través de VPN

reenviar solicitudes tcp a través de VPN

Tengo 3 dispositivos:

  1. Un servidor, conectado a la Red1
  2. Una computadora portátil, conectada a Network2
  3. Una Raspberry Pi, también conectada a Network2

También hay un servidor openVPN en Network1, además de reenvío de puertos para acceder a VPN.

Necesito que Raspi reciba solicitudes TCP (destinadas al servidor) desde la computadora portátil y las envíe a través de la VPN al servidor, luego envíe la respuesta del servidor a la computadora portátil. Sólo se utilizará un puerto, pero también estaría bien si se reenviaran todos los puertos. No se puede instalar ningún software en la computadora portátil. Además, preferiblemente no hay comandos ni nada parecido en el portátil.

Necesito algún tipo de "reenvío de puertos", pero en una VPN

Respuesta1

Utilice literalmente el mismo "reenvío de puertos", es decir, reglas DNAT en el firewall del enrutador (RasPi); Funciona de la misma manera independientemente del tipo de red.

Es decir, agregue DNATreglas de iptables o nftables al firewall de RasPi para cada "reenvío de puerto" que necesite. (No olvide agregar también reglas de "permitir reenvío": son automáticas en la mayoría de los enrutadores, pero no automáticas en iptables o nftables simples).

Su servidor debe tener una ruta de regreso a Network2 a través de su conexión VPN (en OpenVPN eso probablemente significa una irouteconfiguración). Si eso es difícil de configurar, la alternativa es hacer que RasPi también haga SNATo MASQUERADEademás de DNAT. (La opción SNAT/MASQ sería exactamente el mismo tipo de configuración que para "NAT hairpinning" en las LAN).

  • Ejemplo de nftables:

    table inet filter {
        chain forward {
            type filter hook forward priority filter;
    
            ip daddr <ServerIP> accept
        }
    }
    
    table ip nat {
        chain prerouting {
            type nat hook prerouting priority dstnat;
    
            iifname "eth0" ip daddr <RasPiIP> tcp dport 80 \
              dnat to <ServerIP>:80
        }
    
        chain postrouting {
            type nat hook postrouting priority srcnat;
    
            oifname "tun0" masquerade
        }
    }
    
  • Ejemplo para iptables:

    -t filter -I FORWARD -d <ServerIP> -j ACCEPT
    
    -t nat -I PREROUTING -i eth0 -d <RasPiIP> -p tcp --dport 80 \
        -j DNAT --to-destination <ServerIP>:80
    
    -t nat -I POSTROUTING -o tun0 -j MASQUERADE
    

Alternativa: utilice un "proxy inverso" en RasPi. La mayoría de los servidores proxy inversos son para HTTP/HTTPS, pero se puede utilizar cualquier protocolo TCP o TLS. Esto no funcionará con UDP (al menos no fácilmente) y necesita software adicional, pero tiene menos requisitos de enrutamiento.

Para los servicios HTTP/HTTPS, Nginx o Apache httpd serían opciones comunes; ampliamente documentado en otros lugares. (En ambos, la opción se llama "proxy_pass" o "ProxyPass").

información relacionada