SSH en Linux: guía completa de acceso remoto seguro

📅 Actualizado en febrero 2026 ✍️ Ángel López 📊 Nivel: Avanzado ⏱️ 15 min de lectura

SSH (Secure Shell) es la herramienta fundamental para administrar servidores Linux de forma remota. Cada vez que un administrador de sistemas se conecta a un servidor, cada vez que un desarrollador despliega código en producción, cada vez que un servicio de cloud transfiere datos entre máquinas: SSH está detrás. Esta guía te enseña a dominarlo desde la conexión básica hasta la configuración profesional de seguridad.

🔐 ¿Qué es SSH?

SSH (Secure Shell) es un protocolo de red criptográfico que permite comunicarse con un ordenador remoto de forma segura a través de una red no segura. Fue creado en 1995 por Tatu Ylönen, un investigador finlandés, como respuesta a un ataque de sniffing de contraseñas en la red de su universidad.

SSH reemplazó a protocolos inseguros como Telnet, rlogin y rsh, que transmitían todo en texto plano, incluyendo contraseñas. Con SSH, toda la comunicación viaja cifrada con algoritmos como AES-256, ChaCha20 o Ed25519, haciendo imposible que un atacante intercepte la información.

CaracterísticaSSHTelnet
CifradoAES-256, ChaCha20Ninguno (texto plano)
AutenticaciónContraseña, clave pública, certificadosSolo contraseña (en plano)
Puerto por defecto2223
Transferencia de archivosSí (scp, sftp)No
TúnelesSí (port forwarding)No
EstadoEstándar de la industriaObsoleto, inseguro

SSH funciona con un modelo cliente-servidor. El servidor SSH (normalmente sshd, el demonio de OpenSSH) escucha en un puerto (22 por defecto) esperando conexiones. El cliente SSH (el comando ssh) inicia la conexión, verifica la identidad del servidor, negocia el cifrado y establece un canal seguro.

📦 Instalar y activar el servidor SSH

La mayoría de distribuciones Linux incluyen el cliente SSH instalado por defecto. Sin embargo, el servidor (necesario para recibir conexiones) debe instalarse explícitamente.

terminal — Instalar OpenSSH Server
# Ubuntu / Debian / Linux Mint sudo apt update sudo apt install openssh-server -y # Fedora / RHEL / CentOS sudo dnf install openssh-server -y # Arch Linux sudo pacman -S openssh # Verificar que el servicio está activo sudo systemctl status sshd # Activar para que inicie con el sistema sudo systemctl enable sshd sudo systemctl start sshd # Comprobar que escucha en el puerto 22 ss -tlnp | grep ":22"
💡 ¿Cliente o servidor?
Si solo necesitas conectarte a otros equipos, basta con el cliente SSH (ya instalado). Si necesitas que otros se conecten a tu equipo, necesitas instalar el servidor (openssh-server). Un servidor de producción siempre necesita el servidor SSH.

🔌 Conexión básica

Conectarse a un servidor por SSH es tan simple como ejecutar un comando. Solo necesitas la dirección IP (o nombre de dominio) y un usuario con acceso al sistema.

terminal — Conexión SSH básica
# Conexión básica ssh usuario@192.168.1.100 # Conexión con nombre de dominio ssh admin@miservidor.com # Especificar un puerto diferente ssh -p 2222 usuario@192.168.1.100 # Ejecutar un comando remoto sin abrir sesión interactiva ssh usuario@192.168.1.100 "df -h && free -m" # Conexión con modo verbose (útil para depurar) ssh -v usuario@192.168.1.100

La primera vez que te conectas a un servidor, SSH te mostrará la huella digital (fingerprint) del servidor y te pedirá confirmar. Esto es una medida de seguridad para verificar que te estás conectando al servidor correcto y no a un impostor (ataque man-in-the-middle). Una vez aceptada, la huella se guarda en ~/.ssh/known_hosts.

⚠️ Alerta de cambio de huella
Si al conectarte recibes un aviso «WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED», puede significar que el servidor se ha reinstalado (legítimo) o que alguien está interceptando la conexión (ataque). No ignores este mensaje sin verificar primero.

🔑 Autenticación por clave pública

La autenticación por clave pública es el método más seguro y recomendado para acceder por SSH. En lugar de enviar una contraseña (que podría adivinarse por fuerza bruta), demuestras tu identidad con un par de claves criptográficas: una clave privada (que guardar en tu máquina y nunca compartes) y una clave pública (que copias al servidor).

terminal — Generar y configurar claves SSH
# Paso 1: Generar el par de claves (Ed25519, el más moderno y seguro) ssh-keygen -t ed25519 -C "ana@ciberaula.com" # Te pedirá: # - Ubicación: pulsa Enter para aceptar ~/.ssh/id_ed25519 # - Passphrase: contraseña para proteger la clave (RECOMENDADO) # Paso 2: Copiar la clave pública al servidor ssh-copy-id usuario@192.168.1.100 # Esto copia ~/.ssh/id_ed25519.pub al archivo # ~/.ssh/authorized_keys del servidor # Paso 3: Conectarse (ya no pide contraseña del servidor) ssh usuario@192.168.1.100 # Verificar las claves existentes ls -la ~/.ssh/ # id_ed25519 → Clave privada (NUNCA compartir) # id_ed25519.pub → Clave pública (copiar a servidores)
AlgoritmoSeguridadCompatibilidadRecomendación
ed25519ExcelenteOpenSSH 6.5+Recomendado para instalaciones nuevas
rsa (4096 bits)Muy buenaUniversalUsar si necesitas compatibilidad con sistemas antiguos
ecdsaBuenaOpenSSH 5.7+Aceptable, pero ed25519 es preferible
dsaDébilObsoletoNunca usar (desactivado en OpenSSH 7.0+)
✅ Buena práctica: usa passphrase + ssh-agent
Protege siempre tu clave privada con una passphrase (contraseña). Para no tener que escribirla en cada conexión, usa ssh-agent: ejecuta eval "$(ssh-agent -s)" y luego ssh-add. El agente recordará la clave durante tu sesión.

⚙️ Configuración del servidor (sshd_config)

El archivo /etc/ssh/sshd_config controla el comportamiento del servidor SSH. Modificar este archivo es esencial para reforzar la seguridad de cualquier servidor expuesto a Internet.

/etc/ssh/sshd_config — Configuración recomendada
# Puerto (cambiar del 22 por defecto reduce ataques automatizados) Port 2222 # Desactivar login como root PermitRootLogin no # Solo permitir autenticación por clave pública PasswordAuthentication no PubkeyAuthentication yes # Limitar usuarios que pueden conectarse AllowUsers ana deploy # Limitar intentos de autenticación MaxAuthTries 3 # Timeout de sesión inactiva (300 segundos = 5 min) ClientAliveInterval 300 ClientAliveCountMax 2 # Desactivar X11 forwarding si no lo necesitas X11Forwarding no # Protocolo (siempre v2) Protocol 2 # Algoritmos seguros KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
terminal — Aplicar cambios
# Verificar que la configuración es correcta ANTES de reiniciar sudo sshd -t # Si no hay errores, reiniciar el servicio sudo systemctl restart sshd # ⚠️ IMPORTANTE: mantén tu sesión actual abierta # y abre OTRA terminal para probar la nueva config. # Si algo falla, puedes corregirlo desde la sesión actual.
⚠️ Nunca te desconectes sin probar
Después de modificar sshd_config, siempre abre una segunda sesión SSH para verificar que puedes conectarte con la nueva configuración. Si cierras tu única sesión y la configuración tiene un error, perderás el acceso al servidor.

📁 Transferencia de archivos: scp y sftp

SSH no solo sirve para ejecutar comandos remotos: también permite transferir archivos de forma segura. Las dos herramientas principales son scp (copia simple) y sftp (sesión interactiva).

scp — Copiar archivos por SSH
# Copiar archivo local al servidor scp informe.pdf usuario@192.168.1.100:/home/usuario/ # Copiar archivo del servidor a local scp usuario@192.168.1.100:/var/log/syslog ./logs/ # Copiar directorio completo (-r = recursivo) scp -r ./proyecto/ usuario@192.168.1.100:/var/www/html/ # Con puerto personalizado scp -P 2222 archivo.txt usuario@servidor:/tmp/ # Copiar entre dos servidores remotos scp usuario@server1:/datos/backup.tar.gz usuario@server2:/backups/
sftp — Sesión interactiva
# Iniciar sesión sftp sftp usuario@192.168.1.100 # Comandos dentro de sftp: sftp> ls # Listar directorio remoto sftp> lls # Listar directorio local sftp> cd /var/www # Cambiar directorio remoto sftp> lcd ~/proyecto # Cambiar directorio local sftp> get config.php # Descargar archivo sftp> put index.html # Subir archivo sftp> mkdir backups # Crear directorio remoto sftp> rm viejo.txt # Eliminar archivo remoto sftp> exit # Cerrar sesión

🚇 Túneles SSH

Los túneles SSH permiten redirigir tráfico de red a través de una conexión cifrada. Son increíblemente útiles para acceder a servicios internos de un servidor, sortear firewalls o cifrar conexiones inseguras.

terminal — Túneles SSH
# TÚNEL LOCAL: acceder a un servicio remoto como si fuera local # Ejemplo: acceder a la base de datos MySQL del servidor (puerto 3306) # a través de localhost:3307 ssh -L 3307:localhost:3306 usuario@servidor # Ahora puedes conectarte a MySQL en localhost:3307 mysql -h 127.0.0.1 -P 3307 -u root -p # TÚNEL LOCAL: acceder a un panel web interno # El panel está en 10.0.0.5:8080 (solo accesible desde el servidor) ssh -L 8080:10.0.0.5:8080 usuario@servidor # Abrir http://localhost:8080 en tu navegador # TÚNEL DINÁMICO: proxy SOCKS para cifrar toda tu navegación ssh -D 9090 usuario@servidor # Configura tu navegador para usar proxy SOCKS en localhost:9090 # TÚNEL REMOTO: exponer un servicio local al servidor # Tu app local (puerto 3000) será accesible en el servidor (puerto 8080) ssh -R 8080:localhost:3000 usuario@servidor # Ejecutar túnel en segundo plano sin sesión interactiva ssh -fN -L 3307:localhost:3306 usuario@servidor
Tipo de túnelFlagDirecciónCaso de uso típico
Local-LLocal → RemotoAcceder a bases de datos o paneles internos del servidor
Remoto-RRemoto → LocalExponer una app de desarrollo para que la vean otros
Dinámico-DProxy SOCKSCifrar navegación web, sortear restricciones de red

🛡️ Seguridad avanzada: fail2ban y hardening

Un servidor SSH expuesto a Internet recibirá miles de intentos de acceso por fuerza bruta cada día. fail2ban es la herramienta estándar para detectar estos ataques y bloquear automáticamente las IPs atacantes.

terminal — Instalar y configurar fail2ban
# Instalar fail2ban sudo apt install fail2ban -y # Crear configuración local (nunca editar jail.conf directamente) sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local
/etc/fail2ban/jail.local — Configuración SSH
[sshd] enabled = true port = 2222 # Tu puerto SSH (cambiar si no es 22) filter = sshd logpath = /var/log/auth.log maxretry = 3 # Bloquear tras 3 intentos fallidos bantime = 3600 # Bloqueo de 1 hora (en segundos) findtime = 600 # Ventana de 10 minutos # Para bloqueos más agresivos (reincidentes): [recidive] enabled = true bantime = 604800 # 1 semana para reincidentes findtime = 86400 # Ventana de 24 horas
terminal — Gestionar fail2ban
# Iniciar y habilitar fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban # Ver estado del jail de SSH sudo fail2ban-client status sshd # Ver IPs bloqueadas sudo fail2ban-client status sshd | grep "Banned IP" # Desbloquear una IP manualmente sudo fail2ban-client set sshd unbanip 192.168.1.50
✅ Checklist de hardening SSH
Para un servidor de producción, aplica todas estas medidas: desactivar login por contraseña (solo claves), desactivar login como root, cambiar el puerto por defecto, instalar fail2ban, limitar usuarios con AllowUsers, configurar timeout de sesiones inactivas, y mantener OpenSSH actualizado. Estas medidas combinadas reducen prácticamente a cero el riesgo de acceso no autorizado.

✏️ Ejercicios prácticos

Ejercicio 1: Configurar acceso sin contraseña

Enunciado: Genera un par de claves Ed25519, cópialas a un servidor remoto y verifica que puedes conectarte sin introducir contraseña. Luego configura ~/.ssh/config para crear un alias.

▶ Ver solución
terminal — Solución paso a paso
# 1. Generar claves ssh-keygen -t ed25519 -C "mi-pc" # 2. Copiar al servidor ssh-copy-id -p 22 admin@192.168.1.100 # 3. Probar conexión ssh admin@192.168.1.100 # No debe pedir contraseña # 4. Crear alias en ~/.ssh/config cat >> ~/.ssh/config << EOF Host miservidor HostName 192.168.1.100 User admin Port 22 IdentityFile ~/.ssh/id_ed25519 EOF # 5. Conectarse con el alias ssh miservidor # Conexión directa usando el alias

Ejercicio 2: Backup remoto automatizado

Enunciado: Crea un script que haga backup de un directorio del servidor remoto a tu máquina local, comprimido con fecha, usando scp. Programarlo con cron para ejecutarse diariamente.

▶ Ver solución
backup_remoto.sh
#!/bin/bash set -euo pipefail SERVIDOR="admin@192.168.1.100" RUTA_REMOTA="/var/www/html" DESTINO_LOCAL="$HOME/backups_remotos" FECHA=$(date '+%Y-%m-%d') ARCHIVO="backup_web_${FECHA}.tar.gz" mkdir -p "$DESTINO_LOCAL" # Comprimir en el servidor y descargar ssh "$SERVIDOR" "tar czf /tmp/$ARCHIVO -C $(dirname $RUTA_REMOTA) $(basename $RUTA_REMOTA)" scp "$SERVIDOR:/tmp/$ARCHIVO" "$DESTINO_LOCAL/" ssh "$SERVIDOR" "rm /tmp/$ARCHIVO" echo "Backup completado: $DESTINO_LOCAL/$ARCHIVO" # Programar en cron: crontab -e # 0 2 * * * /home/usuario/backup_remoto.sh

⚠️ Errores frecuentes y soluciones

ErrorCausaSolución
Permission denied (publickey)Clave pública no reconocidaVerificar ~/.ssh/authorized_keys y permisos (chmod 600)
Connection refusedServidor SSH no está activosudo systemctl start sshd y verificar firewall
Connection timed outFirewall bloquea el puertoAbrir puerto en UFW: sudo ufw allow 22/tcp
Host key verification failedHuella del servidor ha cambiadoSi es legítimo: ssh-keygen -R ip_servidor
Too many authentication failuresssh-agent envía demasiadas clavesEspecificar clave: ssh -i ~/.ssh/id_ed25519 user@host
Permisos incorrectos en ~/.sshSSH rechaza claves si los permisos son laxoschmod 700 ~/.ssh && chmod 600 ~/.ssh/*
💡 Archivo ~/.ssh/config para múltiples servidores
Si gestionas varios servidores, el archivo ~/.ssh/config te ahorra tiempo y errores. Define alias con Host, HostName, User, Port e IdentityFile para cada servidor. Así, en lugar de recordar ssh -p 2222 -i ~/.ssh/key_prod admin@185.18.197.42, simplemente escribes ssh produccion.

❓ Preguntas frecuentes sobre SSH en Linux: guía completa de acceso remoto seguro

Las dudas más comunes respondidas de forma clara y directa.

SSH (Secure Shell) es un protocolo de red que permite acceder de forma segura a otro ordenador a través de la red. Toda la comunicación viaja cifrada, lo que impide que terceros intercepten las contraseñas o los datos transmitidos. Se usa principalmente para administrar servidores remotos, transferir archivos y crear túneles seguros.
No. Telnet transmite todo en texto plano, incluyendo contraseñas, y cualquier persona en la misma red puede interceptar la comunicación. SSH cifra absolutamente todo el tráfico. Telnet se considera obsoleto e inseguro desde hace años; SSH es su reemplazo directo.
Desde la terminal de Linux, ejecuta: ssh usuario@direccion_ip. Si es la primera vez, te pedirá confirmar la huella del servidor. Luego introduce tu contraseña. Para mayor seguridad, configura autenticación por clave pública con ssh-keygen y ssh-copy-id.
Ambos transfieren archivos de forma segura sobre SSH. scp es más simple: funciona como cp pero entre máquinas remotas, ideal para copiar un archivo rápidamente. sftp ofrece una sesión interactiva similar a FTP, con comandos como ls, cd, get, put, útil cuando necesitas navegar por directorios antes de transferir.
SSH en sí es seguro, pero un servidor expuesto a Internet recibirá miles de intentos de acceso por fuerza bruta al día. Las medidas esenciales son: desactivar login por contraseña (usar solo claves), cambiar el puerto por defecto (22), instalar fail2ban para bloquear IPs atacantes, y permitir acceso solo a usuarios específicos con AllowUsers.
Los túneles SSH permiten redirigir tráfico de red a través de una conexión SSH cifrada. Un túnel local reenvía un puerto de tu máquina al servidor remoto (útil para acceder a servicios internos). Un túnel remoto hace lo contrario. Un túnel dinámico crea un proxy SOCKS que cifra toda tu navegación.
Sí. Windows 10 y 11 incluyen un cliente SSH nativo accesible desde PowerShell o CMD. También puedes usar PuTTY (cliente gráfico), WSL (subsistema Linux completo) o Git Bash. Para transferir archivos, WinSCP es una opción gráfica popular.
Valora este artículo

💬 Foro de discusión

¿Tienes dudas sobre SSH en Linux: guía completa de acceso remoto seguro? Comparte tu pregunta con la comunidad.

¿Tienes cuenta? o comenta como invitado ↓

Todavía no hay mensajes. ¡Sé el primero en participar!

🚀 ¿Quieres dominar Linux profesionalmente?
Cursos bonificados por FUNDAE para empresas — formación 100% subvencionada
Ver cursos de Linux →