Túneles, canales y puertos con SSH

networking

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:remotehost:rport remotehost

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

Redirigir conexiones de otra máquina hacia ésta (remote forwarding)

Muy similar:

ssh -N -R sport:localhost:dport remotehost

Esto le pide a la máquina remotehost 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 un dirección privada. Pues hacemos lo siguiente.

En la máquina home:

$ ssh -N -R 2222:localhost:22 pepe@server

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:

$ ssh -p 2222 pepe@localhost

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