Túneles, canales y puertos con SSH
ssh
(entre otras muchas cosas) también sirve para crear túneles entre máquinas o simplemente redireccionar puertos en un misma máquina.
Redirigir conexiones a esta máquina hacia otra (local forwarding)
La sintaxis es simple:
ssh -g -N -L lport:localhost:rport rhost
Esto crea un túnel de modo que las conexiones al puerto lport de esta máquina ser redirigirán al puerto rport de la máquina rhost a través del túnel.
Significado de los parámetros:
- -g:: Permitir a otros hosts usar este túnel, se consigue lo mismo con la opción
GatewayPorts yes
en el fichero/etc/ssh/ssh_config
o en~/.ssh/config
- -N: No ejecutar ningún comando ni shell, solo crear el túnel
- -L: Crear un túnel a un puerto remoto (puede haber varias opciones -L en el mismo comando)
- lport: Un puerto local libre
- rhost: La máquina remota
- rport: El puerto de la máquina remota al que queremos enviar el tráfico
Esto puede ser útil en muchas situaciones. Por ejemplo, tenemos un servicio en un VPS o VM remota que no es accesible públicamente, pero al que tenemos acceso mediante SSH.
Redirigir conexiones de otra máquina hacia ésta (remote forwarding)
Muy similar:
ssh -N -R sport:localhost:dport rhost
Esto le pide a la máquina rhost
que las conexiones que hagan a su puerto sport
las redirija al puerto dport
de localhost
. Esto es útil por ejemplo para hacer un telnet inverso. Supongamos que queremos conectar desde la máquina server (que tiene una IP pública) a la máquina home que está NATeada y con una dirección privada. Pues hacemos lo siguiente.
En la máquina home:
Esto te pide una clave de la cuenta de usuario en pepe@server porque lo que estás haciendo es solicitar un servicio de redireción al servidor SSH de server. Después de introducir la clave, debes dejar ese proceso corriendo o no se podrá hacer la segunda parte. Un comandillo para ejecutar un lanzador (útil para conectar al ordenador de un familiar novatillo):
bash -c "sshpass -p `ssh-askpass` ssh -N -R 2222:localhost:22 pepe@server"
Y en la máquina server hay que ejecutar:
Esto abre una conexión contra el servidor SSH de home, por lo que el usuario también necesita una cuenta en home.
Redirigir un puerto local a otro
Esto puede resultar útil cuando queremos que un servidor “escuche” en un puerto distinto del estándar sin tener que tocar la configuración del programa servidor concreto ni recurrir a iptables.
Referencias
- Guía de OpenSSH
- Chuleta
- Manage SSH Tunnels with Gnome SSH Tunnel Manager
- Creando túneles TCP/IP (port forwarding) con SSH: Los 8 escenarios posibles usando OpenSSH