En la publicación anterior, preparamos todo lo necesario para un acceso seguro a SSH a través de la generación de claves SSH.

Ver la publicación anterior: SSH keygen: Guía completa para principiantes

Ahora es el momento de aprender a conectarse a un servidor remoto usando SSH. El comando SSH es más simple de lo que parece, pero conocer algunos principios y opciones útiles puede hacer que su uso sea mucho más eficiente.


¿Cómo escribir un comando SSH?

El formato básico del comando SSH es el siguiente:

ssh [opciones] [nombredeusuario]@[direccióndelhost] [comando]

¿Veamos con más detalle qué significa cada uno de los elementos?

  1. ssh: El comando para ejecutar el cliente SSH.

  2. [opciones]: Aquí se pueden especificar varias opciones que controlan el método de conexión SSH. Por ejemplo, puedes usar un archivo de clave específico o configurar el reenvío de puertos. (Esto se aborda con más detalle más adelante).

  3. [nombredeusuario]: Es el nombre de la cuenta de usuario del servidor remoto al que deseas conectarte. Si el nombre de usuario de tu computadora local y el del servidor remoto son iguales, se puede omitir.

  4. [direccióndelhost]: Es la dirección IP o el nombre de dominio del servidor remoto al que deseas conectarte.

  5. [comando] (opcional): Si hay un comando que deseas ejecutar inmediatamente en el servidor remoto después de conectarte a SSH, lo ingresas aquí. Luego de ejecutar este comando, la sesión SSH se cerrará. Si omites esta parte, podrás iniciar sesión en el servidor y utilizar una shell interactiva.

Principios para escribir comandos y trucos fáciles de recordar

Los comandos SSH tienen una estructura que aclara “¿qué usuario se conectará a qué servidor?”.

  • Principio básico: ssh nombredeusuario@direccióndelhost

    • Ejemplo: ssh ubuntu@192.168.1.100 (conectando a la cuenta ubuntu en el servidor 192.168.1.100)
    • Ejemplo: ssh root@mywebserver.com (conectando a la cuenta root en el servidor https://www.google.com/search?q=mywebserver.com)
    • Consejo fácil de recordar:

    • “¡Yo (usuario local) quiero entrar como quien está allá (usuario remoto)!” Piénsalo así.

    • ssh (yo quiero conectarme) [nombredeusuario]@ (como quién) [direccióndelhost] (dónde)
    • Si te conectas a un servidor frecuentemente, puedes usar el archivo ~/.ssh/config para facilitar el acceso sin tener que escribir la dirección cada vez, utilizando alias. (Este punto será tratado con más detalle en la próxima publicación!)

Explorando opciones útiles de SSH

SSH tiene varias opciones que ofrecen potentes funcionalidades adaptadas a diversas situaciones. Aquí te presento algunas de las opciones clave.

Escena donde un hada SSH guía sobre opciones

1. -i <IdentityFile>: Especificar un archivo de clave privada específico

Cuando tienes varias claves SSH y deseas utilizar una clave privada específica para conectarte a un servidor determinado, usas esta opción. Por defecto, se utilizan ~/.ssh/id_rsa o ~/.ssh/id_ed25519, pero es útil cuando has creado claves con otros nombres o cuando gestionas múltiples claves.

  • Uso: ssh -i ~/.ssh/my_custom_key ubuntu@my_server.com
  • Ejemplo:

ssh -i ~/.ssh/id_ed25519_my_server ubuntu@example.com
    Introduce la frase de paso para la clave '/home/tuusuario/.ssh/id_ed25519_my_server': 

2. -p <Port>: Especificar el puerto SSH del servidor remoto

La mayoría de los servidores SSH utilizan por defecto el puerto 22. Sin embargo, por razones de seguridad, los administradores a menudo cambian el puerto SSH. En este caso, deberás usar la opción -p para especificar el número de puerto modificado.

  • Uso: ssh -p 2222 tu_usuario@tu_servidor.com (conectando al puerto 2222)
  • Ejemplo:

    ssh -p 2222 myuser@192.168.1.100
    	La autenticidad del host '192.168.1.100:2222 (...)' no puede establecerse.
    	¿Estás seguro de que deseas continuar conectándote (yes1/no/[huella digital])? yes
    	Advertencia: se ha añadido '192.168.1.100:2222' (ED25519) permanentemente a la lista de hosts conocidos.
    	Último inicio de sesión: Lun Jun 17 10:00:00 2024 desde tu_ip
    	myuser@server:~ $

     

3. -X: Activar el reenvío de X11 (ejecutar programas gráficos)

Se utiliza cuando el servidor remoto tiene instaladas aplicaciones GUI (interfaz gráfica de usuario) y deseas usarlas en la pantalla de tu computadora local. Utiliza el sistema X Window, y debe haber un servidor X en tu sistema local (macOS utiliza XQuartz, Windows necesita PuTTY + VcXsrv, etc.).

  • Uso: ssh -X tu_usuario@tu_servidor.com
  • Ejemplo:

        ssh -X myuser@remote-gui-server.com
        myuser@remote-gui-server:~ $ firefox &

    Ejecuta Firefox en el servidor remoto (aparece la ventana de Firefox en la pantalla local).
    Si el rendimiento es deficiente o hay un alto retraso de red, puede ser inconveniente.

4. -L <LocalPort>:<RemoteHost>:<RemotePort>: Redirección de puertos locales (Local Port Forwarding)

Esta opción permite redirigir conexiones que llegan a un puerto específico (LocalPort) de la computadora local a un puerto específico (RemotePort) de un servidor remoto (RemoteHost) a través de un túnel SSH. Es útil, principalmente, para acceder a servicios detrás de un firewall o para que una aplicación desarrollada localmente acceda a una base de datos remota.

  • Uso: ssh -L 8080:localhost:80 tu_usuario@tu_servidor.com
    • Este comando redirige todas las conexiones al puerto 8080 de la computadora local a través de your_server.com al puerto 80 interno (localhost:80 significa your_server.com en este caso).
  • Ejemplo:

    • Cuando no puedes acceder directamente al servidor web (puerto 80) del servidor remoto y solo puedes hacerlo a través de SSH:

       ssh -L 8080:localhost:80 myuser@my_web_server.com

        Después de ejecutar este comando, si accedes desde el navegador local a http://localhost:8080,
        realmente estarás conectándote al puerto 80 de my_web_server.com.

    • Si my_db_app necesita conectarse al puerto MySQL 3306 de db_server.internal, pero este solo es accesible desde my_app_server.com:

      ssh -L 3307:db_server.internal:3306 myuser@my_app_server.com

            Después de ejecutar este comando, si my_db_app se conecta a localhost:3307,
            accederá al puerto 3306 de db_server.internal a través de my_app_server.com.

      • (Se utiliza el 3307 porque es posible que ya haya un MySQL utilizando el puerto 3306 localmente).

5. -N: Mantener solo el reenvío de puertos sin ejecutar comandos remotos

Esta opción, utilizada con -L o -D (reenvío de puerto dinámico, proxy SOCKS), permite abrir una sesión SSH sin ejecutar comandos de shell en el servidor remoto, manteniendo solo la funcionalidad de reenvío de puertos. Es útil para mantener el túnel de reenvío de puertos en segundo plano.

  • Uso: ssh -N -L 8080:localhost:80 tu_usuario@tu_servidor.com
  • Ejemplo:

    ssh -N -L 8080:localhost:80 myuser@my_web_server.com &

        Manteniendo el túnel de reenvío de puertos en segundo plano (&) y accesible desde el navegador local

6. -f: Cambiar la sesión SSH a segundo plano

Es una opción que envía el proceso del cliente SSH a segundo plano después de que la conexión de SSH ha tenido éxito. Se utiliza principalmente junto con la opción -N para mantener el túnel de reenvío de puertos en segundo plano.

  • Uso: ssh -f -N -L 8080:localhost:80 tu_usuario@tu_servidor.com
  • Ejemplo:

    ssh -f -N -L 8080:localhost:80 myuser@my_web_server.com

        Este comando devolverá inmediatamente el control del terminal, y el túnel SSH se ejecutará en segundo plano.
        Puedes verificar los procesos utilizando el comando ps aux | grep ssh


Para concluir

En esta publicación, hemos revisado la estructura básica de los comandos SSH y algunas de las opciones clave que se utilizan con frecuencia. Especialmente, la especificación de puertos con -p y el reenvío de puertos con -L son herramientas que se utilizan muy a menudo en la práctica, por lo que te recomendaría que las aprendas.

En la próxima publicación, aprenderemos a gestionar aún más fácilmente las conexiones SSH utilizando el archivo ~/.ssh/config. ¡Si tienes preguntas, no dudes en dejarlas en los comentarios!