¿Cómo enrutar direcciones específicas a través de un túnel?

14

Hay ciertos sitios web / servicios a los que solo puedo acceder desde la subred en la que se encuentra mi servidor (piense en el escenario típico de la intranet). ¿Hay alguna manera de enrutar de forma transparente el tráfico que va a estas direcciones a través de un túnel SSH?

Considere la siguiente configuración:

Mi computadora portátil está conectada a la red doméstica. No puede acceder a los servicios en ips X e Y directamente. Tengo un túnel SSH a un servidor que está en una subred que realmente puede acceder a estos servicios.

¿Puedo encapsular automáticamente todo el tráfico en las subredes de X e Y para pasar por este túnel, sin tener que ejecutar toda la solución VPN que enviaría todo mi tráfico a través del servidor? En otras palabras: todo el tráfico que va a cualquier otra subred debe ir directamente desde la computadora portátil, sin pasar por el servidor (usando el túnel).

Ruben Vermeersch
fuente

Respuestas:

6

Puede especificar la interfaz a través de la cual enrutar el tráfico en la tabla de enrutamiento:

sudo route add <host.com> -interface <ppp0>

Donde host.com es el nombre de host o ip al que desea acceder a través de la interfaz, y ppp0 es el identificador de enlace para su vpn que se muestra con el ifconfigcomando.

Sam Coles
fuente
2
Nota: al menos en ubuntu -interfaceno es una opción, por routelo que la sugerencia anterior da un error de uso. Además, ¿cómo resultará esto en el enrutamiento a través del túnel ssh como pregunta el OP?
arielf
3

Las versiones recientes de OpenSSH admiten dispositivos de red tun / tap para un verdadero soporte de VPN. Consulte https://help.ubuntu.com/community/SSH_VPN para obtener documentación básica (obviamente destinada a Ubuntu, pero el principio básico se aplica en otros lugares).

durin42
fuente
Tenga en cuenta que esto requiere privilegios de root tanto en la computadora portátil como en el host de la puerta de enlace.
Riccardo Murri
1

Descargo de responsabilidad: en realidad no he probado lo que voy a describir, y de hecho puede estar completamente equivocado, pero su pregunta es tan intrigante que no puedo resistir la tentación de redactar una respuesta. :-) Además, la configuración aquí depende de algunas iptablesfuncionalidades que pueden existir solo en Linux.

Suponiendo que desea conectarse desde su computadora portátil a un puerto específico P1 en el servidor X1, al puerto P2 en el servidor X2, etc., voy a describir cómo enrutar el tráfico TCP a estos pares específicos de servidor + puerto a través de un túnel SSH. Nota: las direcciones IP X1, X2, etc. son las direcciones IP del servidor tal como se ven desde el host de la puerta de enlace (en el que se encuentra SSH).

  1. Seleccione algunos puertos locales no utilizados L1 (por ejemplo, 10000), L2 (por ejemplo, 10001), etc. Los puertos L1, L2, ..., deben ser todos distintos y su número debe ser igual al número de servidores distintos (Xn, Pn) + pares de puertos.

  2. Se usa iptablespara redirigir paquetes dirigidos a Xn: Pn a localhost: Ln

    iptables -t nat -A OUTPUT -p tcp -d X1 --dport P1 -j DNAT --a destino localhost: L1 iptables -t nat -A OUTPUT -p tcp -d X2 --dport P2 -j DNAT - localhost de destino: L2

  3. Ahora SSH a la puerta de enlace, utilizando la -Lopción para hacer un túnel del tráfico desde localhost: Ln a (Xn, Pn):

    ssh gateway.server -L localhost: L1: X1: P1 -L localhost: L2: X2: P2 ...

Ejemplo:

# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80

Advertencias:

  • solo funciona para TCP, si es que funciona ...

  • si desea acceder a más de un servidor, probablemente sea menos trabajo configurar una VPN

  • aún podría ser más fácil usar la -Dopción SSH para simular un proxy SOCKS y hacer un túnel de todo su tráfico a través de eso.

Riccardo Murri
fuente
En realidad funciona! (Por desgracia, no se ajusta a mi situación específica, donde quiero para enrutar el tráfico que se origina en una máquina virtual, no de localhost.)
pvgoran
1

subredes de X e Y para atravesar este túnel, sin tener que ejecutar toda la solución VPN que enviaría todo mi tráfico a través del servidor?

Lo que quieres es la definición de una VPN.

Una VPN no debería

enviar todo [su] tráfico a través del servidor?

Si es así, no está configurado correctamente.

Se supone que cualquier máquina a la que intente acceder a través de un túnel o VPN, por definición, no es accesible a través de Internet. Por lo tanto, solo la dirección necesaria, no enrutable de Internet debe ser enrutada por la VPN.

Si tiene una situación más complicada, como solo la máquina X e Y y nada más. Su personal de TI puede ponerlos en una subred por usted. Luego, en su computadora cliente, solo dirija esa subred por la VPN.

Stephen Jazdzewski
fuente
0

¿Puedo encapsular automáticamente todo el tráfico en las subredes de X e Y para pasar por este túnel, sin tener que ejecutar toda la solución VPN que enviaría todo mi tráfico a través del servidor?

Esto es un poco extraño a primera vista porque eso es lo que una VPN hará por ti. SSH tiende a ser un asunto de punto a punto, la idea es que conecte un puerto en su máquina local al puerto de una máquina remota en otro lugar; Realmente no fue diseñado para el tipo de tráfico que imagina.

En otras palabras: todo el tráfico que va a cualquier otra subred debe ir directamente desde la computadora portátil, sin pasar por el servidor (usando el túnel).

Una vez más, una VPN se encargaría de eso.

Si le preocupa una solución "pesada" para obtener un tráfico VPN seguro (es decir, no desea simularlo porque sería demasiado complicado), debería considerar OpenVPN , que hará exactamente lo que está describiendo. No solo encapsularía todo el tráfico, sino que se puede hacer de manera que solo el tráfico destinado a esas subredes haga el viaje a través de la tubería VPN. Te advertiré que aún necesitarás editar un archivo de texto en las máquinas locales y remotas, pero es bastante fácil de ejecutar.

Para sus propósitos, debido a que no desea que la parte en el medio (un servidor) vea su tráfico, debe configurar la VPN para conectarse directamente desde su máquina a la máquina remota. Cualquier paquete enrutado se cifrará antes de abandonar su computadora portátil, por lo que tendrá una cobertura de 100% de extremo a extremo.

Avery Payne
fuente
0

Como han dicho otros, si debe "encapsular todo el tráfico a las subredes", entonces probablemente quiera usar VPN.

Sin embargo, para acceder a unos pocos servicios, es posible que desee utilizar la función de reenvío de puerto local de SSH, que es realmente simple. Por ejemplo, si ingresa (desde su computadora portátil):

ssh -N -L 3333:localhost:2222 jump_box

luego conectarse a localhost:2222, será como conectarse a localhost:2222desde jump_box. Puede usar múltiples opciones -L a la vez, y puede conectarse a servicios en otros hosts si ssd_config on lo jump_boxpermite.

Puede usar autosshcon systemdo similares para mantener los túneles en funcionamiento.

Jeff
fuente