Lo que estás buscando se llama túnel inverso. ssh
lo proporciona a través del -R
interruptor:
-R [bind_address:]port:host:hostport
Specifies that the given port on the remote (server) host is to
be forwarded to the given host and port on the local side. This
works by allocating a socket to listen to port on the remote side,
and whenever a connection is made to this port, the connection is
forwarded over the secure channel, and a connection is made to host
port hostport from the local machine.
Como el OP descubrió con su respuesta, la sintaxis es la siguiente:
$ ssh -f -N -R vvv:localhost:22 w.x.y.z
Ejemplo
Tengo 2 computadoras en la red, lappy
y remotey
. Entonces ejecuto el siguiente comando en lappy
:
$ ssh -f -N -R 12345:localhost:22 remotey
Puedo confirmar que está funcionando:
$ ps -eaf|grep "[l]ocalhost:22"
saml 27685 1 0 11:10 ? 00:00:00 ssh -f -N -R 12345:localhost:22 remotey
Ahora, si me dirijo por ssh
separado al sistema remoto remotey
y ejecuto este comando, puedo ver que ahora está aceptando conexiones en el puerto 12345 en la interfaz local del sistema remoto:
$ netstat -an|grep :12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
tcp 0 0 ::1:12345 :::* LISTEN
Probar la conexión
Puede ver que el túnel ssh inverso funciona de la siguiente manera.
iniciar sesión en remotey
[user@lappy ~]$ ssh remotey
probar el puerto de túnel inverso
[user@remotey ~]$ ssh -p 12345 localhost
ahora debería estar de vuelta en lappy
user@localhost's password:
Last login: Thu Aug 1 17:53:54 2013
/usr/bin/xauth: creating new authority file /home/user/.Xauthority
[user@lappy ~]$
¿Puertos en interfaces que no sean localhost ( lo
)?
Es posible que se quede rascándose la cabeza si prueba un comando como este y no parece funcionar, o siempre se vincula a un puerto en la lo
interfaz localhost ( ).
Por ejemplo:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
NOTA: Este comando dice abrir el puerto 12345 @ remotey y hacer un túnel de las conexiones al puerto 22 @ lappy.
Luego en remoto:
remotey$ netstat -an|grep 12345
tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN
Lo que está sucediendo es que sshd
las configuraciones no le permiten hacer esto. De hecho, sin esta función habilitada ( GatewayPorts
), no podrá vincular ningún ssh
puerto de túnel a otra cosa que no sea localhost.
Habilitar GatewayPorts
remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no
Para habilitarlo, edite este archivo /etc/ssh/sshd_config
:
GatewayPorts clientspecified
Y reiniciar sshd
:
remotey$ sudo service sshd restart
Ahora inténtalo de nuevo y deberíamos ver el efecto que buscamos:
lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey
Y vuelva a verificarlo esta vez en forma remota:
remotey$ netstat -anp | grep 12345
tcp 0 0 192.168.1.3:12345 0.0.0.0:* LISTEN 9333/sshd
NOTA: En lo anterior podemos ver que el sshd
proceso ahora está escuchando en la interfaz que tiene la dirección IP 192.168.1.3, para conexiones en el puerto 12345.
Probar la conexión (parte deux)
Ahora con nuestra configuración alterada cuando la probamos esta vez. ¡La diferencia principal es que ya no tenemos que conectarnos a localhost!
iniciar sesión en remotey
[user@lappy ~]$ ssh remotey
probar la conexión inversa
[user@remotey ~]$ ssh -p 12345 remotey
ahora debería estar de vuelta en lappy
root@remotey's password:
Last login: Wed Aug 21 01:49:10 2013 from remotey
[user@lappy ~]$
Referencias