Cómo crear tunelización SSH o reenvío de puertos en Linux


El túnel SSH (también conocido como reenvío de puertos SSH) consiste simplemente en enrutar el tráfico de la red local a través de SSH a hosts remotos. Esto implica que todas sus conexiones están protegidas mediante encriptación. Proporciona una forma sencilla de configurar una VPN (red privada virtual) básica, útil para conectarse a redes privadas a través de redes públicas no seguras como Internet.

También puede usarse para exponer servidores locales detrás de NAT y firewalls a Internet a través de túneles seguros, como se implementa en ngrok.

Las sesiones SSH permiten tunelizar conexiones de red de forma predeterminada y hay tres tipos de reenvío de puertos SSH: reenvío de puertos local, remoto y dinámico.

En este artículo, demostraremos cómo configurar rápida y fácilmente los túneles SSH o los diferentes tipos de reenvío de puertos en Linux.

Para el propósito de este artículo, usamos la siguiente configuración:

  1. Host local: 192.168.43.31
  2. Host remoto: Linode CentOS 7 VPS con nombre de host server1.example.com.

Por lo general, puede conectarse de forma segura a un servidor remoto mediante SSH de la siguiente manera. En este ejemplo, configuré el inicio de sesión SSH sin contraseña entre mis hosts locales y remotos, por lo que no solicitó la contraseña de administrador del usuario.

$ ssh [email protected]  

Reenvío de puertos SSH local

Este tipo de reenvío de puertos le permite conectarse desde su computadora local a un servidor remoto. Suponiendo que está detrás de un cortafuegos restrictivo o que un cortafuegos saliente le bloquea el acceso a una aplicación que se ejecuta en el puerto 3000 de su servidor remoto.

Puede reenviar un puerto local (por ejemplo, 8080) que luego puede usar para acceder a la aplicación localmente de la siguiente manera. El indicador -L define el puerto reenviado al host remoto y al puerto remoto.

$ ssh [email protected] -L 8080: server1.example.com:3000

Agregar el indicador -N significa que no ejecutará un comando remoto, no obtendrá un shell en este caso.

$ ssh -N [email protected] -L 8080: server1.example.com:3000

El conmutador -f indica a ssh que se ejecute en segundo plano.

$ ssh -f -N [email protected] -L 8080: server1.example.com:3000

Ahora, en su máquina local, abra un navegador, en lugar de acceder a la aplicación remota usando la dirección server1.example.com:3000, simplemente puede usar localhost: 8080 o 192.168.43.31: 8080 , como se muestra en la captura de pantalla siguiente.

Reenvío de puerto SSH remoto

El reenvío de puerto remoto le permite conectarse desde su máquina remota a la computadora local. De forma predeterminada, SSH no permite el reenvío de puertos remotos. Puede habilitar esto usando la directiva GatewayPorts en su archivo de configuración principal SSHD/etc/ssh/sshd_config en el host remoto.

Abra el archivo para editarlo con su editor de línea de comandos favorito.

$ sudo vim /etc/ssh/sshd_config 

Busque la directiva requerida, descomente y establezca su valor en yes , como se muestra en la captura de pantalla.

GatewayPorts yes

Guarde los cambios y salga. A continuación, debe reiniciar sshd para aplicar el cambio reciente que realizó.

$ sudo systemctl restart sshd
OR
$ sudo service sshd restart 

A continuación, ejecute el siguiente comando para reenviar el puerto 5000 en la máquina remota al puerto 3000 en la máquina local.

$ ssh -f -N [email protected] -R 5000:localhost:3000

Una vez que comprenda este método de tunelización, puede exponer de manera fácil y segura un servidor de desarrollo local, especialmente detrás de NAT y firewalls a Internet a través de túneles seguros. Túneles como Ngrok, pagekite, localtunnel y muchos otros funcionan de manera similar.

Reenvío dinámico de puertos SSH

Este es el tercer tipo de reenvío de puertos. A diferencia del reenvío de puertos locales y remotos que permiten la comunicación con un solo puerto, hace posible una gama completa de comunicaciones TCP a través de una gama de puertos. El reenvío dinámico de puertos configura su máquina como un servidor proxy SOCKS que escucha en el puerto 1080, de forma predeterminada.

Para empezar, SOCKS es un protocolo de Internet que define cómo un cliente puede conectarse a un servidor a través de un servidor proxy (SSH en este caso). Puede habilitar el reenvío de puertos dinámico usando la opción -D.

El siguiente comando iniciará un proxy SOCKS en el puerto 1080 que le permitirá conectarse al host remoto.

$ ssh -f -N -D 1080 [email protected]

A partir de ahora, puede hacer que las aplicaciones en su máquina usen este servidor proxy SSH editando sus configuraciones y configurándolas para usarlo, para conectarse a su servidor remoto. Tenga en cuenta que el proxy SOCKS dejará de funcionar después de cerrar su sesión SSH.

En este artículo, explicamos los distintos tipos de reenvío de puertos de una máquina a otra, para tunelizar el tráfico a través de la conexión SSH segura. Este es uno de los muchos usos de SSH. Puede agregar su voz a esta guía a través del formulario de comentarios a continuación.

Atención: el reenvío de puertos SSH tiene algunas desventajas considerables, se puede abusar de él: se puede usar para eludir la supervisión de la red y los programas de filtrado de tráfico (o firewalls). Los atacantes pueden usarlo para actividades maliciosas. En nuestro próximo artículo, mostraremos cómo deshabilitar el reenvío de puertos locales SSH. ¡Mantente conectado!