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ística
SSH
Telnet
Cifrado
AES-256, ChaCha20
Ninguno (texto plano)
Autenticación
Contraseña, clave pública, certificados
Solo contraseña (en plano)
Puerto por defecto
22
23
Transferencia de archivos
Sí (scp, sftp)
No
Túneles
Sí (port forwarding)
No
Estado
Estándar de la industria
Obsoleto, 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 Mintsudoapt update
sudoapt install openssh-server -y
# Fedora / RHEL / CentOSsudodnf install openssh-server -y
# Arch Linuxsudopacman-S openssh
# Verificar que el servicio está activosudosystemctl status sshd
# Activar para que inicie con el sistemasudosystemctl enable sshd
sudosystemctl start sshd
# Comprobar que escucha en el puerto 22ss-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ásicassh usuario@192.168.1.100
# Conexión con nombre de dominiossh admin@miservidor.com
# Especificar un puerto diferentessh-p 2222 usuario@192.168.1.100
# Ejecutar un comando remoto sin abrir sesión interactivassh 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 servidorssh-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 existentesls-la ~/.ssh/
# id_ed25519 → Clave privada (NUNCA compartir)# id_ed25519.pub → Clave pública (copiar a servidores)
Algoritmo
Seguridad
Compatibilidad
Recomendación
ed25519
Excelente
OpenSSH 6.5+
Recomendado para instalaciones nuevas
rsa (4096 bits)
Muy buena
Universal
Usar si necesitas compatibilidad con sistemas antiguos
ecdsa
Buena
OpenSSH 5.7+
Aceptable, pero ed25519 es preferible
dsa
Débil
Obsoleto
Nunca 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 reiniciarsudosshd-t
# Si no hay errores, reiniciar el serviciosudosystemctl 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 servidorscp informe.pdf usuario@192.168.1.100:/home/usuario/
# Copiar archivo del servidor a localscp 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 personalizadoscp-P 2222 archivo.txt usuario@servidor:/tmp/
# Copiar entre dos servidores remotosscp usuario@server1:/datos/backup.tar.gz usuario@server2:/backups/
sftp — Sesión interactiva
# Iniciar sesión sftpsftp 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:3307ssh-L 3307:localhost:3306 usuario@servidor
# Ahora puedes conectarte a MySQL en localhost:3307mysql-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ónssh-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 interactivassh-fN -L 3307:localhost:3306 usuario@servidor
Tipo de túnel
Flag
Dirección
Caso de uso típico
Local
-L
Local → Remoto
Acceder a bases de datos o paneles internos del servidor
Remoto
-R
Remoto → Local
Exponer una app de desarrollo para que la vean otros
Dinámico
-D
Proxy SOCKS
Cifrar 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.
[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 fail2bansudosystemctl enable fail2ban
sudosystemctl start fail2ban
# Ver estado del jail de SSHsudofail2ban-client status sshd
# Ver IPs bloqueadassudofail2ban-client status sshd | grep"Banned IP"# Desbloquear una IP manualmentesudofail2ban-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 clavesssh-keygen-t ed25519 -C "mi-pc"# 2. Copiar al servidorssh-copy-id-p 22 admin@192.168.1.100
# 3. Probar conexiónssh admin@192.168.1.100 # No debe pedir contraseña# 4. Crear alias en ~/.ssh/configcat >> ~/.ssh/config << EOF
Host miservidor
HostName 192.168.1.100
User admin
Port 22
IdentityFile ~/.ssh/id_ed25519
EOF# 5. Conectarse con el aliasssh 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/bashset-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 descargarssh"$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
Error
Causa
Solución
Permission denied (publickey)
Clave pública no reconocida
Verificar ~/.ssh/authorized_keys y permisos (chmod 600)
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
¿Útil?
💬 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 ↓
Iniciar sesión
🔑 Recuperar contraseña
Introduce el email con el que te registraste. Te enviaremos un enlace para crear una nueva contraseña.
Crear cuenta
Solo necesitas nombre, email y contraseña. Sin verificación por email.
Todavía no hay mensajes. ¡Sé el primero en participar!
🚀 ¿Quieres dominar Linux profesionalmente?
Cursos bonificados por FUNDAE para empresas — formación 100% subvencionada
Usamos cookies propias para mejorar tu experiencia de navegación y analizar
el uso del sitio. No compartimos datos con terceros ni usamos cookies de
publicidad. Puedes aceptar todas, aceptar solo las necesarias o configurar
tus preferencias.
Política de privacidad
Imprescindibles para el funcionamiento del sitio: preferencias de interfaz,
gestión de sesiones y este mismo aviso de cookies. No recogen datos
identificativos.
Nos permiten entender cómo navegas por el contenido para mejorar la
experiencia de aprendizaje. Utilizan identificadores anónimos (UUID) sin
vinculación a datos personales. Retención máxima: 6 meses.
¿Cómo valorarías tu experiencia aprendiendo en esta sección?