SSH (Secure SHell) es un protocolo que nos sirve para acceder de forma segura a equipos remotos, básicamente como lo hace Telnet, pero usando algoritmos de cifrado que nos ayudan a mantener nuestra conexión segura, sobre todo si queremos acceder a equipos que desempeñan alguna función importante dentro de una organización.
Generalmente, para acceder debemos proporcionar nuestro usuario y la dirección del equipo, para que el servidor SSH nos solicite la contraseña de acceso:
ssh usuario@equiporemoto
Desde que el cliente inicia la primera conexión entre el equipo remoto y nosotros, la información ya está viajando de forma segura, evitando que alguien pueda obtener nuestras credenciales de acceso a dicho equipo, sin embargo SSH es un protocolo muy adaptable y que nos ofrece muchas posibilidades.
SCP
La primera de ellas es poder transferir archivos entre el cliente y equipo remoto, sin necesidad de montar un servidor FTP o NFS, simplemente usando SCP (Secure CoPy) que implementan la mayoría de servidores SSH:
scp archivo.tar.gz usuario@equiporemoto:/home/usuario
scp usuario@equiporemoto:/var/log/messages messages.txt
SSH Tunneling
Esta característica es muy útil, ya que nos permite enviar y recibir información que no necesariamente sean comandos shell entre el cliente y el equipo remoto, por ejemplo la navegación común y corriente. Si no adivinan que utilidad puede tener esto piensen en lo siguiente: necesitan acceder a una página, pero el lugar donde están tiene implementado un firewall que bloquea precisamente dicha página, por lo tanto, podemos hacer ‘tunneling’ con un equipo remoto que no tenga dichos bloqueos y pasar la navegación en dicha página por nuestra sesión SSH:
ssh -D 8888 usuario@equiporemoto
Una vez conectados, nuestro cliente SSH ‘escucha’ en el puerto 8888 como un servidor proxy, para que podamos configurar nuestro navegador y toda el tráfico sea transmitido a través de la sesión SSH
Otro ejemplo que se me ocurre, es cuando por alguna restricción geográfica, no podamos acceder a algún servicio web desde donde estamos, al hacer el túnel, dicho servicio web detecta como origen la IP de nuestro servidor remoto, no nuestra IP de cliente. Esto equivale de alguna manera a las VPNs (Virtual Private Network)
Reverse SSH
Si por alguna razón necesitamos acceder a un equipo que se encuentra detrás de un firewall y este no nos permite redireccionar el tráfico SSH hacia él, podemos hacer un ‘reverse SSH’, de tal forma que ese equipo se conecte a otro servidor SSH, al cual nosotros podamos también conectarnos, para poder así acceder al equipo detrás del firewall. Un ejemplo que me viene a la mente, es cuando queremos ayudar a un amigo que no tiene ni idea de como configurar una redirección en su módem, pero necesitamos acceder a su equipo de manera remota:
Amigo —> Módem —> Servidor SSH <— Nosotros
Los pasos a seguir son relativamente muy sencillos:
Amigo
ssh -R 9999:localhost:22 usuario@servidorssh
Nosotros
ssh usuario@servidorssh
Una vez dentro del servidor SSH, podremos conectarnos con el equipo de nuestro amigo usando
ssh amigo@localhost -p 9999
Como podrán observar, toda la magia radica en el parámetro -R, que le indica al servidor intermedio que en el puerto 9999 está escuchando el equipo de nuestro amigo ahora como servidor.
Estas solo son algunas posibilidades que SSH nos ofrece pero los invito a que experimenten con algunas más, por ejemplo; podemos hacer scripts desatendidos usando llaves RSA, redireccionar sesiones X (modo gráfico) a nuestro entorno gráfico, solo por mencionar algunas.
Excelente artículo,, estoy ansioso por llegar a mi hogar y ponerme a practicarlos.
Muchas gracias! De hecho es mi primer artículo en el blog y es muy agradable leer estos comentarios. Saludos!
Ayer justamente preguntaba algo sobre este tema, y es lo siguiente.
¿Hay alguna forma de poder hacer scp de toda una carpeta pero tomando en cuenta la fecha de los archivos? O sea, yo tengo una carpeta con muchos archivos que ya descargué hace un tiempo, me interesa descargar solamente lo que se haya subido a esa carpeta a partir de cierta fecha.
Saludos y muchas gracias por adelantado.
Lo puedes hacer con RSYNC sobre SSH. 😉
rsync es la tapa del frasco!!! 😀
Te recomiendo pruebes unison, es ESPECTACULAR, esta disponible en las repos (debian y ubuntu al menos)
http://www.cis.upenn.edu/~bcpierce/unison/
Lo utilizo para hacer backups diarios de mi note a otro equipo, ademas de tener sincronizados directorios en distintos equipos.
Es muy facil de utilizar
Espero te sea util!
Exitos
Eduardo
Eso parece más una tarea como para rsync, pero desconozco si hay un parámetro para hacer eso específicamente, si no tal vez habría que manejarlo desde un script
A mi lo que se me ocurre, es hacer un ls ordenado por fecha, y de ahí copiar los que necesitas con un scp simple, por que el scp no tiene tantas funciones como bien comentan, tiene el rsync.
Doy fe de que el reverse ssh anda de lujo, lo he usado entre mi pc y otra que estaba a mas de 700Km de distancia y cero problemas.
Gracias por estos artículos, son de mucho valor.
Para que salado! Jaja no sabia que ssh tenía tantas posibilidades, ya quiero aprender a montar un servidor ssh y ponerme a experimentar con sus capacidades, solo una cosa, podrías explicar que hace cada parámetro?
Según el propio man de ssh, el -D sirve para especificar un ‘dynamic application forwarder’ de manera local, que como expliqué en el artículo, sirve para pasar el tráfico por un túnel dentro de la misma sesión SSH. El -R especifica el puerto remoto que será redirigido hacia nuestro equipo local mediante un ‘forwarding’. Y finalmente el -p especifica a que puerto debe conectarse el cliente, cuando no usa el puerto estándar: 22
Que bueno que toca este tema, tengo una duda acerca de las llaves ssh, se pueden generar mas de una llave para distintos servicios?, ojala hicieran un post sobre administrar las llaves ssh, se que en google hay la respuesta., pero ojala ustedes hablaran sobre eso,
Saludos!
Cuando usas autenticaión mediante llaves SSL, puedes exportar la misma (la de tu equipo) a diferentes servicios y de igual manera, si tu equipo es el servidor, puedes incorporar diferentes llaves de diferentes equipos. No sé si respondí tu pregunta, pero eso entendí. Saludos
Creo recordar que había una forma mediante ssh que permitía ejecutar una aplicación en remoto y verla en nuestro ordenador como si fuese una aplicación en local.
Por ejemplo, podríamos ejecutar el firefox, lo vemos y controlamos en nuestro ordenador local pero el proceso se ejecuta en el ordenador remoto.
Especialmente util en ordenadores con pocos recursos pero por desgracia no controlo el tema y no sé cómo configurar los ordenadores para hacer eso.
¿Alguien sabe algo del tema?
Para algo como eso convendría usar VNC y puedes hacer un túnel con SSH.
@Staff para mi no convendria usar VNC.. con VNC si no estoy mal te traes todo el escritorio..
@Luis, lo que haces se hace simplemente añadiendo el parametro «-X» al ssh (tenes que permitir forwarding de X en tu server)
http://i.imgur.com/NCpfzBL.jpg
@x11tete11x
Considerando lo que Luis menciono, pensé en ofrecerle otra alternativa, ya que:
1. «Especialmente útil en ordenadores con pocos recursos…»
-En el caso de una sola aplicación quizás no consuma tantos recursos pero pretender abrir 10 ventanas con x forwarding sigue haciendo trabajar mas al sistema que tener una sola instancia de VNC, ya que VNC no «se trae todo el escritorio»
-Al cerrar el programa en el cliente se termina igual en el servidor (Que alguien me corrija si me equivoco), mientras que con VNC puede, por ejemplo, dejar toda la noche bajando un torrent y por la mañana volver a loguearse y todo seguiría justo como había dejado.
-VNC es un protocolo agnóstico al sistema, puede acceder desde un cliente en Win, Andorid, Mac OSX, etc. y usar sus programas de GNU/Linux, sin tener que instalar nada mas que el mismo cliente de VNC.
Y 2. «…por desgracia no controlo el tema y no sé cómo configurar los ordenadores para hacer eso.»
Es mucho mas fácil (Y sin riesgo a escribir algo mal y reiniciar sin escritorio) instalar VNC y configurar el túnel SSH (Se hace con GUI) que ir a mover los archivos de configuración de las X.
Gracias a ambos por vuestros comentarios.
Llevo tiempo usando SSH junto a SHFS para acceder a cotenido remoto de mi pequeño servidor pero nunca he podido ejecutar aplicaciones remotas en entorno gráfico.
Probaré ambas opciones a ver qué tal. Lo que yo comentaba en un principio parece más sencillo ya que segun x11tete11x, sólo hay que añadir un parámetro.
Luego veré si encuentro una forma sencilla de configurar VNC ya que soy un poco manazas, soy usuario de Arch así que seguramente en la wiki habrá información, otra cosa es que yo me entere. Jejeje
Un saludo.
Se puede hacer pasándole el parámetro -X a la sesión, pero tienes que tener configurado tu servidor X para que acepte conexiones de un equipo de la red, creo que eso se configura con la utilidad xhost. Como menciona Staff, también es muy buena opción el VNC
Es X11 forwarding, aquí en este mismo sitio hay un post sobre eso:
https://blog.desdelinux.net/x11-forwarding-a-traves-de-ssh/
Gracias por la info amigos.
Lo dicho, porbaré hacerlo usando ambas opciones a ver cual me va mejor.
Saludos!