Introducción
El túnel SSH o el reenvío de puertos SSH es un método para crear una conexión SSH cifrada entre un cliente y una máquina servidor a través de la cual se pueden reenviar los puertos de servicio.
El reenvío SSH es útil para transportar datos de red de servicios que utilizan un protocolo no cifrado, como VNC o FTP, acceden a contenido restringido geográficamente o evitan los cortafuegos intermedios. Básicamente, puede reenviar cualquier puerto TCP y tráfico de túnel a través de una conexión SSH segura.
Hay tres tipos de reenvío de puertos SSH:
- Reenvío de puerto local (local). - Reenvía una conexión desde el host del cliente al host del servidor SSH y luego al puerto del host de destino.
- Reenvío de puerto remoto (remoto). - Reenvía un puerto desde el host del servidor al host del cliente y luego al puerto del host de destino.
- Reenvío de puertos dinámico (dinámico). - Cree un servidor proxy SOCKS que permita la comunicación a través de una variedad de puertos.
En este artículo, hablaremos sobre cómo configurar túneles SSH encriptados locales, remotos y dinámicos.
Reenvío de puertos locales
El reenvío de puerto local le permite reenviar un puerto en la computadora local (cliente ssh) a un puerto en la computadora remota (servidor ssh), que luego se reenvía a un puerto en la computadora de destino.
En este tipo de reenvío, el cliente SSH escucha en un puerto determinado y canaliza cualquier conexión a ese puerto en el puerto especificado en el servidor SSH remoto, que luego se conecta a un puerto en la computadora de destino. La máquina de destino puede ser el servidor SSH remoto o cualquier otra máquina.
El reenvío de puerto local se utiliza principalmente para conectarse a un servicio remoto en una red interna, como una base de datos o un servidor VNC.
En Linux, macOS y otros sistemas Unix para crear un reenvío de puertos local, use la -L
para el cliente ssh
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
Las opciones utilizadas son las siguientes:
[LOCAL_IP:]LOCAL_PORT
: la dirección IP y el número de puerto de la máquina local. CuandoLOCAL_IP
, el cliente ssh se conecta a localhost.DESTINATION:DESTINATION_PORT
: la IP o el nombre de host y el puerto de la máquina de destino.[USER@]SERVER_IP
: el usuario SSH remoto y la dirección IP del servidor.
Cualquier número de puerto superior a 1024
se puede utilizar como LOCAL_PORT
. Los puertos con un número inferior a 1024
son puertos privilegiados y solo pueden ser utilizados por root. Si el servidor SSH está escuchando en un puerto diferente al 22 (predeterminado), use la opción -p [PORT_NUMBER]
El servidor SSH debe poder resolver el nombre de host de destino.
Supongamos que tiene un servidor de base de datos MySQL ejecutándose en la db001.host
en una red interna (privada), en el puerto 3306 al que se puede acceder desde la pub001.host
y desea conectarse utilizando el mysql
al servidor de la base de datos. Para hacer esto, puede reenviar la conexión de esta manera:
ssh -L 3336:db001.host:3306 [email protected]
Una vez que se ejecuta el comando, se le pedirá que ingrese la contraseña del usuario SSH remoto. Después de ingresar, iniciará sesión en el servidor remoto y se establecerá el túnel SSH. Se recomienda que configure la autenticación basada en claves SSH y se conecte al servidor sin ingresar una contraseña.
Ahora, si apunta al cliente de la base de datos de la máquina local 127.0.0.1:3336
, la conexión se reenviará al servidor MySQL db001.host:3306
través de la máquina pub001.host
que actuará como servidor intermedio.
Se pueden reenviar múltiples puertos a múltiples destinos en un solo comando ssh. Por ejemplo, tiene otro servidor de base de datos MySQL ejecutándose en la db002.host
y desea conectarse a ambos servidores desde su cliente local que habría ejecutado:
ssh -L 3336:db001.host:3306 3337:db002.host:3306 [email protected]
Para conectarnos al segundo servidor usaremos 127.0.0.1:3337
.
Cuando el host de destino es igual al servidor SSH en lugar de especificar la IP del host de host o el nombre de host de destino, puede utilizar localhost
.
Suponga que necesita conectarse a una máquina remota a través de VNC que se ejecuta en el mismo servidor y no es accesible desde el exterior. El comando que usaría es:
ssh -L 5901:127.0.0.1:5901 -N -f [email protected]
La -f
le dice al ssh
que se ejecute en segundo plano y -N
no ejecute un comando remoto. Estamos usando localhost
porque VNC y el servidor SSH se ejecutan en el mismo host.
Si tiene problemas para configurar el túnel, verifique la configuración del servidor SSH remoto y asegúrese de que AllowTcpForwarding
no esté establecido en no
. De forma predeterminada, se permite el reenvío.
Reenvío de puerto remoto
El reenvío de puerto remoto es lo opuesto al reenvío de puerto local. Le permite reenviar un puerto en la computadora remota (servidor ssh) a un puerto en la computadora local (cliente ssh), que luego se reenvía a un puerto en la computadora de destino.
En este tipo de reenvío, el servidor SSH escucha en un puerto determinado y canaliza cualquier conexión a ese puerto en el puerto especificado en el cliente SSH local, que luego se conecta a un puerto en la computadora de destino. La máquina de destino puede ser la máquina local o cualquier otra máquina.
En Linux, macOS y otros sistemas Unix, use la -R
con el ssh
para crear el reenvío de puertos:
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
Las opciones utilizadas son las siguientes:
[REMOTE:]REMOTE_PORT
: la dirección IP y el número de puerto en el servidor SSH remoto. ElREMOTE
indica que el servidor SSH remoto se conectará a todas las interfaces.DESTINATION:DESTINATION_PORT
: la IP o el nombre de host y el puerto de la máquina de destino.[USER@]SERVER_IP
: el usuario SSH remoto y la dirección IP del servidor.
El reenvío de puertos locales se utiliza principalmente para dar acceso a un servicio interno a alguien desde fuera.
Supongamos que está desarrollando una aplicación web en su computadora local y desea mostrar una vista previa a sus compañeros desarrolladores. No tiene una IP pública, por lo que el otro desarrollador no puede acceder a la aplicación a través de Internet.
Si tiene acceso a un servidor SSH remoto, puede configurar el reenvío de puerto remoto de la siguiente manera:
ssh -L 8080:127.0.0.1:3000 -N -f [email protected]
El comando anterior hará que el servidor ssh escuche en el puerto 8080
y canalice todo el tráfico desde este puerto a su computadora local en el puerto 3000
.
Ahora sus compañeros desarrolladores pueden escribir the_ssh_server_ip:8080
en su navegador y obtener una vista previa de su aplicación.
Si tiene problemas para configurar el reenvío de puertos remotos, asegúrese de que GatewayPorts
esté establecido en yes
en la configuración del servidor SSH remoto.
Reenvío dinámico de puertos
El reenvío dinámico de puertos le permite crear un socket en la computadora local (cliente ssh) que actúa como un servidor proxy SOCKS. Cuando un cliente se conecta a este puerto, la conexión se reenvía a la máquina remota (servidor ssh), que luego se reenvía a un puerto dinámico en la máquina de destino.
De esta forma, todas las aplicaciones que utilizan el proxy SOCKS se conectarán al servidor SSH y el servidor reenviará todo el tráfico a su destino real.
En Linux, macOS y otros sistemas Unix para crear un reenvío de puertos dinámico (SOCKS), pase la opción -D
al cliente ssh
ssh -R [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER
Las opciones utilizadas son las siguientes:
[LOCAL_IP:]LOCAL_PORT
: la dirección IP y el número de puerto de la máquina local. CuandoLOCAL_IP
, el cliente ssh se conecta a localhost.[USER@]SERVER_IP
: el usuario SSH remoto y la dirección IP del servidor.
Un ejemplo típico de reenvío de puertos dinámico es el túnel del tráfico del navegador web a través de un servidor SSH.
El siguiente comando creará un túnel SOCKS en el puerto 9090
:
ssh -D 9090 -N -f [email protected]
Una vez que se establece el túnel, puede configurar la aplicación para usarlo.
El reenvío de puertos debe configurarse por separado para cada aplicación cuyo tráfico desee tunelizar.
Configurar el túnel SSH en Windows
Los usuarios de Windows pueden crear túneles SSH utilizando el cliente PuTTY SSH. Puede descargar PuTTY aquí.
Inicie Putty e ingrese la dirección IP del servidor SSH en el campo Host name (or IP address)
.
En el Connection
, expanda SSH
y seleccione Tunnels
. Marque el Local
para configurar local, Remote
para remoto y Dynamic
para reenvío de puertos dinámico.
- Si configura el reenvío local, ingrese el puerto de reenvío local en el
Source Port
e ingrese el host y la IP de destino en elDestination
, por ejemplo,localhost:5901
. - Para el reenvío de puerto remoto, ingrese el puerto de reenvío del servidor SSH remoto en el
Source Port
y en elDestination
ingrese el host de destino y la IP, por ejemplo,localhost:3000
. - Si configura el reenvío dinámico, ingrese solo el puerto local SOCKS en el campo
Source Port
Haga clic en el botón Add
Regrese a la Session
para guardar su configuración para que no tenga que ingresarla cada vez. Ingrese el nombre de la sesión en el Saved Session
y haga clic en el botón Save
Seleccione la sesión guardada e inicie sesión en el servidor remoto haciendo clic en el botón Open
Aparecerá una nueva ventana solicitando su nombre de usuario y contraseña. Después de ingresar su nombre de usuario y contraseña, iniciará sesión en el servidor e iniciará el túnel SSH.
La configuración de la autenticación de clave pública le permitirá conectarse a su servidor sin ingresar una contraseña.
Conclusión
Le mostramos cómo configurar túneles SSH y reenviar el tráfico a través de una conexión SSH segura.