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


Túnel SSH (también conocido como reenvío de puerto SSH) es simplemente 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 cifrado. Proporciona una forma fácil de configurar una VPN básica ( Red privada virtual ), útil para conectarse a redes privadas a través de redes públicas no seguras como Internet.

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

Las sesiones de SSH permiten la conexión de redes de túneles por defecto y existen tres tipos de reenvío de puertos SSH: local , remoto y dinámico reenvío de puertos.

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

Para los fines de este artículo, estamos utilizando la siguiente configuración:

  1. Local Host: 192.168.43.31
  2. Remote Host: Linode CentOS 7 VPS with hostname server1.example.com.

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

$ ssh [email protected]  

Reenvío de puerto 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 firewall restrictivo, o bloqueado por un firewall saliente, 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

Si agrega el indicador -N significa que no ejecute un comando remoto, en este caso no obtendrá un shell.

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

El interruptor -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 utilizando 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 a continuación.

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 remoto. Puede habilitar esto usando la directiva GatewayPorts en su archivo de configuración principal de 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, descoméntela 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 entienda este método de tunelización, puede exponer de forma 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 forma similar.

Redireccionamiento dinámico de puertos SSH

Este es el tercer tipo de reenvío de puertos. A diferencia del reenvío de puerto local y remoto , que permite la comunicación con un solo puerto, hace posible, una gama completa de comunicaciones TCP a través de un rango 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 dinámico de puertos utilizando 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]

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

En este artículo, explicamos los distintos tipos de reenvío de puertos de una máquina a otra, para canalizar el tráfico a través de la conexión segura SSH. 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.