En la publicación anterior, completamos la preparación para un acceso seguro a SSH mediante la generación de claves SSH (Key Generation).

Ver publicación anterior: SSH keygen: guía perfecta para principiantes

Ahora es el momento de aprender a conectarse a un servidor remoto utilizando SSH. El comando SSH es más simple de lo que parece, pero conocer algunos principios y opciones útiles te permitirá usarlo de manera mucho más eficiente.


¿Cómo se escribe el comando SSH?

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

ssh [opciones] [nombre_de_usuario]@[dirección_del_host] [comando]

¿Veamos en detalle qué significa cada uno de los elementos?

  1. ssh: Este es el comando que ejecuta el cliente SSH.

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

  3. [nombre_de_usuario]: Este es el nombre de la cuenta de usuario en el servidor remoto al que deseas acceder. Si el nombre de usuario de tu computadora local es el mismo que el del servidor remoto, puedes omitirlo.

  4. [dirección_del_host]: Esta 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, lo ingresas aquí. Después de ejecutar este comando, la sesión SSH se cerrará. Si omites esta parte, podrás iniciar sesión y usar un shell interactivo.

Principios para escribir comandos y consejos fáciles de recordar

El comando SSH presenta una estructura que aclara "¿qué usuario se conectará a qué servidor?".

  • Principio básico: ssh nombre_de_usuario@dirección_del_host

    • Ejemplo: ssh ubuntu@192.168.1.100 (Conexión a la cuenta ubuntu en el servidor 192.168.1.100)
    • Ejemplo: ssh root@mywebserver.com (Conexión 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 a donde está (usuario remoto) en el servidor allí!" Piénsalo así.

    • ssh (quiere conectarse) [nombre_de_usuario]@ (¿quién?) [dirección_del_host] (¿dónde?)
    • Para servidores a los que te conectas frecuentemente, puedes usar el archivo ~/.ssh/config para conectarte cómodamente utilizando alias sin tener que ingresar direcciones largas cada vez. (¡Este tema se abordará con más detalle en la próxima publicación!)

Exploración de opciones útiles de SSH

SSH ofrece varias opciones que configuran su potente funcionalidad para diferentes situaciones. A continuación, te presento algunas de las opciones clave.

Escena en la que un hada SSH presenta opciones

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

Esta opción se utiliza cuando tienes varias claves SSH y deseas usar una clave privada específica para conectarte a un servidor determinado. Aunque, por defecto, se usan ~/.ssh/id_rsa o ~/.ssh/id_ed25519, es útil cuando has creado con otros nombres o manejas varias claves.

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

    Bash

    ``` ssh -i ~/.ssh/id_ed25519_my_server ubuntu@example.com

    Resultado esperado:

    Ingrese la contraseña para la clave '/home/youruser/.ssh/id_ed25519_my_server': # Ingrese la contraseña para conectarse

    ```

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, a menudo el administrador cambia el puerto SSH. En ese caso, debes usar la opción -p para especificar el número de puerto modificado.

  • Uso: ssh -p 2222 your_user@your_server.com (Conexión al puerto 2222)
  • Ejemplo:

    Bash

    ``` ssh -p 2222 myuser@192.168.1.100

    Resultado esperado:

    No se puede establecer la autenticidad del host '192.168.1.100:2222 (...)'

    ¿Estás seguro de que deseas continuar conectando (yes/no/[huella digital])? yes

    Advertencia: '192.168.1.100:2222' (ED25519) se ha añadido permanentemente a la lista de hosts conocidos.

    Último inicio de sesión: lun jun 17 10:00:00 2024 desde your_ip

    myuser@server:~ $

    ```

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

Se utiliza cuando deseas ejecutar aplicaciones GUI (Interfaz Gráfica de Usuario) que están instaladas en el servidor remoto y mostrarlas en la pantalla de tu computadora local. Utiliza el sistema X Window y debe haber un servidor X corriendo en el sistema local (necesitas XQuartz en macOS, PuTTY + VcXsrv en Windows, etc.).

  • Uso: ssh -X your_user@your_server.com
  • Ejemplo:

    ```Bash ssh -X myuser@remote-gui-server.com

    Ejecuta firefox en el servidor remoto (una ventana de firefox aparecerá en la pantalla local)

    myuser@remote-gui-server:~ $ firefox & ```

    (Puede ser incómodo si el rendimiento no es bueno o si hay mucho retraso en la red.)

4. -L <LocalPort>:<RemoteHost>:<RemotePort>: reenvío de puerto local (Local Port Forwarding)

Permite que las conexiones entrantes en un puerto específico (LocalPort) de la computadora local sean redirigidas a un puerto específico (RemotePort) en un servidor remoto (RemoteHost) a través de un túnel SSH. Es útil principalmente para acceder a servicios detrás de un cortafuegos o para que una aplicación desarrollada localmente se conecte a una base de datos remota.

  • Uso: ssh -L 8080:localhost:80 your_user@your_server.com
    • Este comando redirige todas las conexiones entrantes 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 sí mismo).
  • Ejemplo:

    • Cuando solo se puede acceder a través de SSH y no se puede conectar directamente al servidor web remoto (puerto 80):

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

      Después de ejecutar este comando, si accedes a http://localhost:8080 en tu navegador local

      es fundamentalmente lo mismo que conectarse al puerto 80 de my_web_server.com.

      ```

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

      ```Bash 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

      se conectará a db_server.internal en el puerto 3306 a través de my_app_server.com.

      ```

      (La razón para usar 3307 es que ya puede haber un MySQL que utilice el puerto 3306 en local.)

5. -N: mantener el reenvío de puerto sin ejecutar comandos remotos

Se utiliza junto con las opciones -L o -D (Dynamic Port Forwarding, SOCKS proxy), y permite abrir una sesión SSH sin ejecutar un comando de shell en el servidor remoto y mantener simplemente la funcionalidad del reenvío de puerto. Es útil principalmente para mantener túneles de reenvío de puerto en segundo plano.

  • Uso: ssh -N -L 8080:localhost:80 your_user@your_server.com
  • Ejemplo:

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

    Podrás acceder a través del navegador local manteniendo el túnel de reenvío de puerto en segundo plano (&)

    ```

6. -f: poner la sesión SSH en segundo plano

Esta opción envía el proceso del cliente SSH al fondo después de que la conexión ha sido exitosa. Generalmente se usa junto con la opción -N para mantener el túnel de reenvío de puerto en segundo plano.

  • Uso: ssh -f -N -L 8080:localhost:80 your_user@your_server.com
  • Ejemplo:

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

    Al ejecutar este comando, el control del terminal se devuelve inmediatamente y el túnel SSH se ejecutará en segundo plano.

    Puedes verificar los procesos usando el comando ps aux | grep ssh

    ```


Conclusión

En esta publicación, exploramos la estructura básica del comando SSH junto con algunas de las opciones clave que se utilizan con frecuencia. En particular, el uso de -p para especificar puertoy -L para el reenvío de puertos son aspectos que se aplican muy a menudo en el trabajo práctico, así que asegúrate de dominarlos.

En la próxima publicación, veremos cómo gestionar el acceso SSH de manera aún más conveniente utilizando el archivo ~/.ssh/config. Si tienes alguna pregunta, ¡no dudes en dejar un comentario!