¿Cómo crear túneles SSH o reenvío de puertos en Linux?

SSH es una utilidad de cliente estándar de shell seguro para Linux. Se utiliza para establecer conexiones seguras a servidores ssh remotos (o incluso locales). Pero algunos programas no están diseñados lo suficientemente flexibles para ser procesados ​​por ssh de manera trivial: el programa puede funcionar solo con conexiones locales o algunas direcciones de red relacionadas pueden ser difíciles de definir en código. Es por eso que SSH contiene varias opciones para redirigir el tráfico seguro para que coincida con casos de uso como ese. Vayamos de caso en caso para ver cómo funciona.
 

Puerto de reenvío en localhost

Primer caso: tenemos una aplicación codificada para conectarse al servidor localhost con un puerto específico. Nuestro objetivo es utilizar un servidor remoto con otro puerto en su lugar. Otro punto aquí es: transmitir datos de forma segura (encriptada). El código para la prueba localhost del lado del cliente y del servidor siguió a continuación.

Resumen de redirección local:
 

esquema de redirección

En este esquema, el servidor se ejecuta en el host remoto en el puerto 9000. Pero nuestra aplicación cliente lo espera solo en el puerto 5000 del host local. Esperemos que sea un código integrado en la aplicación. 

Puerto de reenvío en el cuerpo del script localhost:

#!/usr/bin/env bash
nc -l 9000 &
PID0=$!
ssh alexey@localhost -L 5000:localhost:9000 sleep 4 &
PID1=$!
sleep 1
echo done | nc -N localhost 5000
sleep 1
kill -9 $PID0 $PID1 2> /dev/null

 Puerto de reenvío en la consola de ejecución del script localhost:

área del cuerpo del script en el rectángulo amarillo, la salida sigue al lado del rectángulo

En la primera string creamos un servidor TCP en el puerto 9000 en segundo plano (observe que el comando termina con el símbolo ‘&’). A continuación, almacenamos el PID (identidad del proceso) del servidor en la variable local PID0 . Luego, ejecutamos una sesión ssh en nuestro propio host con opciones que redirigen las conexiones entrantes del puerto local 5000 al host remoto 9000 .  Sintaxis de la opción -L : -L <puerto de host local>:<host remoto>:<puerto de host remoto para redirigir las conexiones desde el puerto de host local > . Ejecutamos una sesión con el comando «dormir 4» en segundo plano para activar la redirección durante 4 segundos y luego finalizamos la sesión. A continuación, almacenamos el PIDde la sesión ssh a la variable PID1 . En la siguiente línea, dormimos durante 1 segundo para asegurarnos de que el servidor se inicia y la sesión ssh comenzó. En la siguiente línea, enviamos el texto «hecho» al puerto 5000 usando el comando nc y cerramos la sesión con -N. A continuación, dormimos durante 1 segundo para procesar la redirección del tráfico a través de un túnel seguro y «terminar» en la salida. Luego siguió la eliminación de cordura del servidor de ejecución y la sesión de túnel ssh. Como puede ver, es posible usar cualquier <servidor remoto> contra <localhost> en este script, para poder trabajar con el servidor remoto de manera segura. Incluso si la aplicación del cliente no está diseñada para funcionar con ella.

Puerto de reenvío en el host remoto

En el caso de que los servidores remotos no tengan una dirección «blanca» y funcionen a través de NAT (traducción de direcciones de red), aún necesitamos tener un túnel seguro. Pero los destinos remotos en este caso no se pueden detectar. En su lugar, es posible organizar una conexión segura a un host central conocido. Y redirija los puertos en el host central para que estos clientes se conecten a través de NAT. La diferencia es hacer que el puerto 5000 en el host remoto esté disponible para redirigir al puerto local 9000 en nuestro host. 
 

esquema de redirección

Puerto de reenvío en el cuerpo del script del host remoto:

#!/usr/bin/env bash
nc -l 9000 &
PID0=$!
ssh alexey@localhost -L 5000:localhost:9000 sleep 4 &
PID1=$!
sleep 1
echo done | nc -N localhost 5000
sleep 1
kill -9 $PID0 $PID1 2> /dev/null

Puerto de reenvío en la consola de ejecución del script del host remoto:

área del cuerpo del script en el rectángulo amarillo, la salida sigue al lado del rectángulo

Todas las acciones en el script son iguales al caso anterior. Pero el significado de la redirección es diferente. Redirigimos el puerto de host remoto 5000 al puerto de host local 9000 y creamos un túnel seguro para pasar las conexiones del puerto de host remoto 5000 al puerto de host local 9000. Eso hace que esté disponible para funcionar de manera segura incluso con hosts a través de NAT.

Tunelización de interfaz SSH
 

descripción de interconexiones de aplicaciones seguras

Otra opción para usar ssh es exponer la dirección IP del par conectado de forma segura mediante la tunelización de las interfaces usando at ssh. Exponemos la dirección IP sobre la interfaz tun en localhost para trabajar con el servidor en el host remoto. El siguiente ejemplo descubrirá los detalles.

Script de tunelización de la interfaz Ssh:

#!/usr/bin/env bash
(ssh -tt root@192.168.144.207 -w 2:2 << EOF
ifconfig tun2 10.1.1.1/24 pointopoint 10.1.1.2 up
nc -l 10.1.1.1 9000
EOF
) 2>/dev/null | grep ok &
PID=$!
sleep 1
ifconfig tun2 10.1.1.2/24 pointopoint 10.1.1.1 up
echo ok | nc -N 10.1.1.1 9000

Consola de ejecución de secuencias de comandos de tunelización de la interfaz Ssh:

área del cuerpo del script en el rectángulo amarillo, la salida sigue al lado del rectángulo

En la primera string, creamos una conexión ssh al host remoto. Es muy importante ser root al ejecutar el script: creará interfaces de tunelización virtual ( tun) en el sistema. Sólo root capaz de hacerlo legal. La opción -w tiene la siguiente sintaxis: -w <índice de interfaz tun en host local , índice de interfaz tun en puerto remoto> . Estas interfaces particulares se asignan entre sí de manera segura: la sesión llega a la interfaz tun del host local en el puerto y se redirige de forma segura a la interfaz tun asignada del host remoto en el mismo puerto. En la siguiente string, usamos la utilidad ifconfig para configurar algunas direcciones internas para tun-s remotos y encenderlo. Segunda dirección ( pointopoint) apunta a la IP del mismo nivel que se usará en la tunelización. En la siguiente string, iniciamos el servidor nc TCP en el puerto 9000 . Preste atención a la dirección IP del servidor: coincide con la dirección de la interfaz tun correspondiente. En la siguiente string, ignoramos los errores y seleccionamos solo Aceptar que contiene el mensaje, si corresponde. El resto de las strings de secuencias de comandos se utilizan en el lado local. Dormimos durante 1 segundo para estar seguros de que el túnel está completo. A continuación, configuramos direcciones IP para nuestro sintonizador local.interfaz para hacer coincidir los parámetros de la dirección IP del par (la primera y la segunda dirección coinciden en el par y el host local). El mismo comando activamos la interfaz. El siguiente comando inicia el cliente tcp que establece una conexión con la interfaz tun local en un puerto específico y envía un mensaje de «ok». Como podemos recordar, el servidor comenzó en otro host en el mismo puerto. Última string en el script: matamos ssh con túnel y servidor. Si tiene varios servidores en la misma dirección, este enfoque puede ser útil porque debe configurarse solo una vez para varios puertos. 

Publicación traducida automáticamente

Artículo escrito por chashchegorov y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *