En el artículo anterior expliqué como usar un tunel ssh para acceder a un servicio remoto que no es accesible en mi computador, pero sí es accesible desde un servidor al cual puedo ingresar. Ahora aprenderemos a hacer lo opuesto. Vamos a compartir servicios de mi red interna o mi computadora en otra red. Lo más probable es que sea el Internet. Al igual que el artículo anterior, vamos a explicar esta utilidad con ejemplos.
Ejemplo #1: Acceder con ssh a computador con ip privado
Vamos a suponer el siguiente caso práctico. Mi mamá es una usuaria de GNU/Linux y tiene algún problema en su computador. Ella tiene su computadora en la casa y no tiene ip pública ni la menor idea de lo que es un ip. Su hijo tiene algo de experiencia le puede ayudar. Para esto con mucha paciencia le va a decir» mami vaya a accesorios terminal y escribe lo siguiente:
ssh -R *:8080:localhost:22 usuarioremoto@servidorremoto.com
Mi mamá no tiene porque entender este comando, pero ustedes sí. El * quiere decir que vamos a ser accesibles desde cualquier ip que tenga mi servidor remoto. El 8080 es el puerto que utilizaremos en el servidor remoto y localhost:22 quiere decir que vamos a hacer accesible el puerto 22 de mi máquina local. La segunda parte del comando quiere decir a que servidor ingresamos y con que usuario.
En otras palabras mi mamá esta ingresando a mi servidor y publicando el puerto 22 de su computador en el puerto 8080. Obviamente sin tener la menor idea de lo que esta haciendo.
Ahora para yo ingresar al computador de mi mamá simplemente hago ssh al puerto 8080 en el servidor remoto con el usuario local del computador de mi mamá.
ssh -p 8080 usuario@servidorremoto.com
Para que esto funcione necesitamos poder acceder como root al servidor por lo menos una vez y/o ser amigo de una persona que tenga acceso a root. Es necesario modificar el archivo de configuración del servidor ssh: /etc/ssh/sshd_config y añadir la siguiente línea:
GatewayPorts yes
Luego reiniciamos ssh
/etc/init.d/ssh restart
Ahora sí debe funcionar.
Si se fijan bien lo que estamos haciendo hay una falla de seguridad. Si mucha gente puede hacer ssh a mi servidor remoto, entonces podrían estar utilizando varios puertos de mi servidor para fines que desconozco.
La buena noticia, es que sumando los conocimientos adquiridos aquí con el primer ejemplo de túneles ssh podemos obtener el mismo resultado.
Ejemplo #2: Acceder con ssh a computador con ip privado sin necesidad de root en el servidor
Por defecto la siguiente línea no va a funcionar si no editamos el archivo de configuración del ejemplo anterior.
ssh -R *:8080:localhost:22 usuarioremoto@servidorremoto.com
El * quiere decir escuchar en cualquier IP. SSH por seguridad viene configurado para que solo podamos redirigir al ip local de nuestro servidor.
Entonces lo que haremos en este ejemplo es los siguiente. Mi mamá redirecciona su puerto local de ssh (22) al 8080 de mi servidor. Luego yo redirecciono el puerto 8080 de mi servidor al 9090 de mi máquina local. Para termina hago ssh en mi máquina local
Manos a la obra. Mi mamá debería escribir lo siguiente:
ssh -R 8080:localhost:22 mama@servidorremoto.com
En este caso ya no usamos el * ni un ip porque se asume que estamos accediendo a localhost.
Ahora yo desde mi computadora voy a redirigir el puerto 8080 del servidor remoto (accesible solamente desde el mismo) al puerto 9090 en mi máquina personal.
ssh -L 9090:localhost:8080 rafael@servidorremoto.com
Luego en otro terminal en mi computador hago ssh al puerto 9090 de localhost con el usuario del computador de mi mamá.
ssh -p 9090 usuariomama@locahost
Un poco más complicado que el anterior, pero mucho más accesible y seguro.
Conclusión
Este ejemplo talvez no todos los tengan, pero podría ser una forma muy útil de tener soporte. Por ejemplo Juan es un administrador novato que da soporte y tiene problemas. Requiere la ayuda de Pedro que esta en otra localidad. Bajo este mismo principio Pedro podría dar soporte a Juan.
También es importante notar que en este caso estamos redirigiendo solo el puerto de ssh, pero podría ser cualquier puerto. Por ejemplo, estoy trabajando en una aplicación web de manera local en mi computadora. Podría redirigir ese puerto para que sea visible desde la web.
Hola,
Muchas gracias por dedicar tiempo en la realización de estas entradas, me ha funcionado perfectamente todo lo que has explicado y han servido para mi aprendizaje sobre SSH.
Bueno, pues nada, solamente queria expresarte mi agradecimiento y esperando que publiques mas articulos interesantes.
Un Saludo