Conexión SSH: Cómo realizar el acceso a un servidor
Por FelipePublicado en:
La administración remota de servidores es una necesidad constante en toda organización que gestione infraestructura tecnológica. Ya sea un entorno de desarrollo, pruebas o producción, resulta imprescindible contar con mecanismos que permitan ejecutar operaciones en servidores remotos de forma eficiente, segura y confiable. En este contexto, el protocolo SSH (Secure Shell) se ha convertido en el pilar de la administración de sistemas a través de terminal, dado que proporciona una vía cifrada para el acceso remoto, la ejecución de comandos, la transferencia de archivos y otras funciones críticas.
SSH es utilizado por desarrolladores, administradores de sistemas, personal de soporte, ingenieros DevOps y operadores de infraestructura para múltiples propósitos: gestionar instancias en la nube, mantener servidores físicos o virtuales, automatizar procesos con scripts, monitorear recursos, configurar servicios, entre otros. Comprender el funcionamiento de SSH, dominar su configuración y aplicar buenas prácticas de seguridad es esencial en cualquier entorno técnico actual.
SSH: ¿Qué es y para qué sirve?

SSH es un protocolo de comunicación segura que opera en el nivel de aplicación y se ejecuta sobre una capa de transporte cifrada, típicamente TCP. Fue diseñado como reemplazo directo de protocolos inseguros como Telnet, FTP y rsh, los cuales transmitían contraseñas y datos en texto plano, exponiendo la infraestructura a riesgos severos.
SSH se diferencia porque ofrece:
-
Autenticación segura de usuarios, ya sea mediante contraseña o claves criptográficas.
-
Cifrado simétrico de la sesión para proteger la confidencialidad.
-
Integridad de los datos mediante algoritmos hash.
-
Ejecución remota de comandos y shell interactiva.
-
Reenvío de puertos locales y remotos (tunneling).
-
Capacidad de montar sistemas de archivos remotos vía SFTP o SCP.
-
Capacidad de encapsular otros protocolos para reforzar su seguridad.
Una sesión SSH inicia con un proceso de negociación criptográfica entre cliente y servidor, donde se intercambian claves públicas, se establece un canal cifrado y luego se verifica la identidad del usuario mediante uno de los métodos de autenticación habilitados.
Requisitos para establecer una conexión SSH

Antes de iniciar cualquier conexión SSH es necesario validar los siguientes aspectos, tanto en el equipo cliente como en el servidor de destino:
1. Presencia de un servidor SSH
El equipo al que se quiere acceder debe tener instalado y en ejecución el servidor SSH. En la mayoría de distribuciones Linux modernas (Ubuntu, Debian, CentOS, AlmaLinux, Fedora, etc.), este servicio se llama sshd. Puede instalarse con los siguientes comandos:
Debian/Ubuntu:
RHEL/CentOS/AlmaLinux:
2. Puerto abierto en el firewall
SSH escucha por defecto en el puerto TCP 22. Si el servidor tiene reglas de firewall activas (como ufw, firewalld o iptables), este puerto debe estar permitido:
O bien, en firewalld:
3. IP pública o nombre de dominio resoluble
El servidor debe contar con una dirección IP válida y accesible desde el cliente, o bien un nombre de dominio correctamente resuelto por DNS. Este dato se utiliza para identificar el destino en el comando de conexión.
4. Usuario habilitado
Es necesario conocer el nombre de usuario válido en el sistema remoto. Esto puede ser root o cualquier otro usuario con permisos suficientes. En ambientes profesionales se desactiva el acceso por root y se trabaja con usuarios comunes que luego elevan privilegios mediante sudo.
Clientes SSH: desde qué sistemas operativos puedo conectarme

SSH es multiplataforma. Todos los sistemas operativos modernos permiten establecer sesiones SSH, aunque con distintas herramientas.
Linux y macOS
Ambos sistemas operativos cuentan con el comando ssh integrado en su terminal. El acceso se realiza con:
Por ejemplo:
Si el puerto ha sido modificado:
Windows
Desde Windows 10 en adelante, PowerShell incorpora el cliente SSH por defecto. También existen herramientas como:
-
PuTTY: cliente SSH gráfico muy utilizado.
-
MobaXterm: cliente SSH avanzado con múltiples funciones.
-
Termius: multiplataforma, con sincronización de perfiles y llaves.
-
VS Code Remote SSH: extensión para desarrollo remoto desde Visual Studio Code.
Para establecer conexión desde PowerShell:
Con PuTTY:
-
Abre PuTTY.
-
Especifica la IP o dominio y el puerto.
-
Selecciona el tipo de conexión como SSH.
-
Guarda el perfil si se desea.
-
Haz clic en Open y autentícate.
Métodos de autenticación SSH

SSH permite validar la identidad del usuario de forma segura mediante dos mecanismos principales:
Autenticación por contraseña
Al establecer la conexión, el servidor solicita una contraseña al usuario. Este método es funcional pero poco seguro, ya que:
-
Es vulnerable a ataques de fuerza bruta.
-
Requiere ingreso manual, dificultando la automatización.
-
Si el servidor permite acceso al usuario root con contraseña, el riesgo es mayor.
Se recomienda deshabilitar esta opción una vez configurado el acceso con llaves.
Autenticación con llaves públicas
Más segura y escalable. El cliente genera un par de llaves criptográficas (pública y privada). La pública se copia al servidor, y la privada queda almacenada en el cliente. El servidor permite acceso solo si el cliente presenta una clave privada que coincide con alguna clave pública autorizada.
Cómo generar un par de claves
El sistema generará dos archivos:
~/.ssh/id_rsa(clave privada)
~/.ssh/id_rsa.pub(clave pública)
Cómo copiar la clave pública al servidor
Automáticamente:
O manualmente:
Luego, podrás conectarte sin ingresar contraseña (salvo que protejas la clave privada con passphrase, algo muy recomendable).
Archivo de configuración local: ~/.ssh/config
Permite simplificar conexiones frecuentes:
Con esta configuración puedes conectarte simplemente con:
También se puede usar para establecer túneles, reenviar claves, restringir comandos y configurar ProxyJump o bastion hosts.
Seguridad en servidores SSH
A medida que un servidor se expone a Internet, aumenta el riesgo de intentos de intrusión. Para proteger un servidor SSH es recomendable:
-
Cambiar el puerto por defecto para evitar bots automatizados.
-
Deshabilitar el acceso como root: usar
PermitRootLogin no. -
Deshabilitar la autenticación por contraseña si se usan llaves.
-
Usar firewall para limitar el acceso SSH solo desde IPs autorizadas.
-
Instalar Fail2Ban para detectar intentos fallidos de conexión y bloquear IPs maliciosas.
-
Auditar los accesos revisando el archivo de logs
/var/log/auth.logo/var/log/secure. -
Rotar periódicamente las claves privadas si se sospecha de filtración.
-
Evitar llaves sin passphrase o protegerlas con un agente SSH.
Automatización de tareas remotas con SSH
SSH es ampliamente utilizado para ejecutar tareas remotas de forma automatizada, lo que permite:
-
Ejecutar comandos a distancia:
-
Ejecutar scripts remotos:
-
Transferir archivos con
scp: -
Sincronizar directorios con
rsync:
Túneles SSH y reenvío de puertos
SSH permite crear túneles seguros entre cliente y servidor, lo cual es útil para acceder a servicios restringidos:
Túnel local (acceder a una base de datos interna):
Túnel remoto (acceder a una web local desde el servidor):
Túnel dinámico (proxy SOCKS):
Luego puedes configurar tu navegador para navegar por ese proxy, ocultando tu IP.
Solución de problemas comunes
| Error | Causa probable | Solución |
|---|---|---|
Permission denied |
Usuario incorrecto, clave mal configurada, permisos inválidos | Verificar authorized_keys y permisos de .ssh |
Connection refused |
SSH no instalado o puerto incorrecto | Verificar que sshd esté corriendo |
No route to host |
IP inalcanzable, firewall bloquea la conexión | Probar con ping o traceroute |
Host key verification failed |
Clave del servidor cambió | Borrar línea correspondiente en ~/.ssh/known_hosts |
Conceptos fundamentales para automatizar tareas con SSH
La automatización de tareas remotas sobre SSH parte de tres condiciones básicas que deben cumplirse:
1. Acceso sin contraseña mediante llaves públicas
Una vez que el servidor destino tiene configurada una clave pública del cliente en su archivo ~/.ssh/authorized_keys, es posible ejecutar comandos sin necesidad de ingresar una contraseña manualmente.
Esto permite que scripts automatizados —ya sea desde otro servidor o desde una computadora de administración— puedan conectarse al servidor remoto sin intervención humana.
2. Disponibilidad del servicio SSH en el servidor
Debe estar activo y escuchando en un puerto abierto. Si se cambia el puerto por defecto (22) por razones de seguridad, esta información debe estar incluida en los scripts que realizan la conexión.
3. Scripts con comandos remotos estructurados
Toda la lógica de automatización puede residir en scripts de Bash, Python, PHP, Perl o cualquier lenguaje capaz de invocar procesos del sistema. Estos scripts deben diseñarse para manejar errores, validar resultados y registrar sus acciones.
Ejecución de comandos remotos por SSH desde un script
Forma básica:
Ejemplo:
Este comando retorna el resultado del uso de disco del servidor remoto.
Ejecución de múltiples comandos encadenados:
Ejemplo:
Esto actualiza los paquetes y reinicia Apache en un solo paso.
Captura del resultado en el cliente:
Puedes utilizar esta técnica para tomar decisiones en tiempo real en función de lo que devuelve el servidor.
Automatización de ejecución de scripts remotos
Existen dos formas de ejecutar scripts ubicados en el cliente sobre el servidor remoto:
1. Ejecutar un script remoto ya presente en el servidor
Este método requiere que el script haya sido copiado previamente.
2. Enviar un script temporal desde el cliente y ejecutarlo
Este comando toma el contenido del archivo local y lo ejecuta como entrada estándar (stdin) en el servidor.
Este método es ideal para tareas puntuales y evita dejar archivos residuales en el servidor remoto.
Automatización de transferencias de archivos con SCP y Rsync
Automatizar tareas muchas veces implica subir archivos al servidor, respaldar información remota o sincronizar contenido entre nodos.
Subir un archivo con scp:
Descargar archivos:
Sincronizar carpetas con rsync:
El flag --delete elimina archivos en el destino que ya no existen en origen, útil para sincronizaciones completas.
Uso de cronjobs para programar tareas automáticas
Una vez que se tiene acceso sin contraseña, cualquier script puede ser agendado para su ejecución periódica mediante cron.
Abrir el cron del usuario:
Programar una ejecución cada día a las 02:00 AM:
Este cron puede invocar SSH directamente si lo que se desea es automatizar procesos en otros servidores:
Seguridad en automatizaciones con SSH
Aunque SSH ofrece cifrado y autenticación segura, la automatización sin control puede generar problemas de seguridad. A continuación, algunas recomendaciones para proteger los entornos automatizados:
Usar usuarios limitados
Nunca utilizar root si no es necesario. Crear un usuario dedicado para tareas automáticas con acceso restringido y llaves específicas.
Limitar comandos mediante authorized_keys
Es posible restringir las acciones que puede ejecutar una llave específica desde el archivo ~/.ssh/authorized_keys:
Esto garantiza que esa llave solo podrá ejecutar ese script.
Usar ssh-agent para llaves con passphrase
Si la clave privada tiene passphrase, ssh-agent permite almacenarla en memoria y usarla durante la sesión del script:
Esto es útil cuando se lanzan scripts desde Jenkins, GitLab CI o cronjobs en estaciones locales.
Rotación de claves
Establecer una política para renovar claves SSH periódicamente, especialmente si se automatizan tareas críticas.
Casos de uso reales
1. Mantenimiento de servidores nocturno
Un script ejecutado desde una máquina de administración puede realizar lo siguiente en 10 servidores distintos cada noche:
-
Vaciar logs antiguos.
-
Reiniciar servicios que consumen mucha RAM.
-
Verificar si existen procesos colgados.
-
Enviar por correo un informe consolidado de ejecución.
2. Sincronización de contenido web entre servidores de staging y producción
Cada vez que el equipo de desarrollo sube cambios al repositorio, se ejecuta un script que:
-
Valida los cambios en staging.
-
Si los tests pasan, hace un
rsyncal servidor de producción. -
Reinicia el servicio de PHP-FPM para aplicar cambios.
3. Backup automatizado y replicación fuera del sitio
Un cronjob en un servidor remoto:
-
Comprime la base de datos MySQL.
-
La sube a otro servidor mediante
scp. -
Elimina respaldos antiguos con más de 7 días.
Alternativas y herramientas complementarias
Aunque SSH es el estándar, existen otras herramientas que lo utilizan o lo extienden:
Ansible
Permite orquestar tareas en múltiples servidores simultáneamente, usando SSH como medio de transporte. Se puede definir una inventory con IPs y usuarios, y luego aplicar “playbooks” YAML que ejecutan acciones idempotentes.
Git + SSH
Ideal para despliegue automatizado. Puedes configurar hooks post-push que ejecuten acciones vía SSH una vez se actualiza un repositorio.
Autossh
Reinicia automáticamente conexiones SSH caídas, útil para túneles persistentes entre servidores.


