Un SSH server en Linux permite acceder de forma remota y segura a un sistema desde otro equipo usando la terminal. Gracias a OpenSSH, es posible administrar servidores, ejecutar comandos, transferir archivos y gestionar servicios sin necesidad de estar físicamente delante de la máquina.
En este artículo veremos cómo instalar y configurar un SSH server en Linux usando OpenSSH. También repasaremos cómo comprobar el estado del servicio, habilitarlo al inicio del sistema y aplicar recomendaciones básicas de seguridad para reducir riesgos en conexiones remotas.
👉 Y recuerda, si quieres aprender más de Linux, pincha en este curso de Linux gratis
👉 También te dejo por aquí una guía de comandos Linux por categorías
Qué es “SSH server” (cliente vs servidor)
Cuando hablamos de SSH hay dos piezas:
- Cliente SSH: el comando ssh que ejecutas desde tu PC/portátil u otro servidor.
- SSH server: el demonio sshd que corre en la máquina destino y acepta conexiones entrantes.
En muchas distribuciones el cliente viene instalado por defecto, pero el servidor no siempre.
Comprobar si el SSH server está instalado
Según la distribución, puedes comprobarlo así:
Debian / Ubuntu
dpkg -l | grep openssh-server || trueFedora / RHEL y derivadas
rpm -qa | grep openssh-server || trueInstalar OpenSSH Server
Debian / Ubuntu
sudo apt update
sudo apt install openssh-serverFedora / RHEL / CentOS / Rocky / Alma
sudo dnf install openssh-serverArch Linux
sudo pacman -S opensshTras instalar, el servicio suele quedar listo para arrancar.
Arrancar y habilitar el servicio (systemd)
En la mayoría de sistemas modernos, el servicio se llama ssh o sshd.
Habilitar y arrancar (ahora y al inicio)
sudo systemctl enable --now ssh || sudo systemctl enable --now sshdVer estado y diagnosticar rápido
systemctl status ssh --no-pager || systemctl status sshd --no-pagerConfirmar que escucha (puerto 22 por defecto)
sudo ss -tulpn | grep sshdSi no aparece nada escuchando, normalmente el servicio no está activo o falló al arrancar.
Abrir el puerto en el firewall (si aplica)
Si tu servidor tiene firewall activo, necesitas permitir el puerto de SSH desde las IPs necesarias.
UFW (Ubuntu/Debian)
sudo ufw allow OpenSSH
sudo ufw statusfirewalld (Fedora/RHEL)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-servicesSi más adelante cambias el puerto de SSH, no olvides ajustar también las reglas del firewall.
Primer acceso y verificación (huella + logs)
Con el servidor escuchando, prueba desde el cliente:
ssh usuario@IP_O_HOSTNAMELa primera conexión te pedirá confirmar la huella (host key). Ese aviso es normal: sirve para detectar ataques tipo “man-in-the-middle”. Idealmente, valida la huella por un canal alternativo (consola del proveedor, acceso físico, panel de tu VPS, etc.).
Revisar logs del servidor cuando algo falla
sudo journalctl -u ssh -n 100 --no-pager || sudo journalctl -u sshd -n 100 --no-pagerConfiguración principal: sshd_config
El archivo típico de configuración del servidor SSH es /etc/ssh/sshd_config. Antes de cambiar nada, aplica estas tres reglas básicas.
1) Haz copia de seguridad
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak2) Valida la sintaxis antes de reiniciar
sudo sshd -tSi sshd -t devuelve error, corrígelo antes de reiniciar.
3) Reinicia el servicio de forma segura
Si estás conectado por SSH, deja otra sesión abierta por si algo sale mal (o ten consola out-of-band).
sudo systemctl restart ssh || sudo systemctl restart sshdAutenticación por clave pública (recomendado)
El mayor salto de seguridad suele ser pasar de contraseñas a claves SSH.
Generar una clave en el cliente (ed25519)
ssh-keygen -t ed25519 -a 64Esto crea una clave privada (no se comparte) y una pública (se copia al servidor).
Copiar la clave al servidor (forma sencilla)
ssh-copy-id usuario@IP_O_HOSTNAMECopia manual (cuando no tienes ssh-copy-id)
En el servidor:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keysLuego añade el contenido de tu clave pública (del cliente) dentro del archivo ~/.ssh/authorized_keys (en el servidor).
Hardening esencial para un SSH server
La seguridad de SSH no es un único ajuste: es un conjunto de decisiones razonables para tu entorno. Estos son los cambios más típicos (y útiles) para endurecer un SSH servidor.
Deshabilitar el login directo de root
En /etc/ssh/sshd_config:
PermitRootLogin noLa idea es entrar con un usuario normal y escalar con sudo.
Usar solo claves (deshabilitar contraseñas)
Cuando confirmes que tu acceso por clave funciona:
PasswordAuthentication no
KbdInteractiveAuthentication noEn algunas distribuciones aparece ChallengeResponseAuthentication; si existe, ponlo en no.
Limitar quién puede entrar (usuarios o grupos)
Por usuarios:
AllowUsers admin deployO por grupos:
AllowGroups sshusersCambiar el puerto (opcional)
No es “seguridad fuerte”, pero reduce mucho ruido de bots.
Port 2222Recuerda ajustar:
- El firewall
- El cliente (por ejemplo, indicando el puerto al conectar)
ssh -p 2222 usuario@hostDesactivar opciones que no uses
Ejemplo típico:
X11Forwarding no
PermitEmptyPasswords noSi no necesitas túneles/forwarding:
AllowTcpForwarding noLímites y timeouts básicos contra fuerza bruta
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 5
ClientAliveInterval 300
ClientAliveCountMax 2Fail2ban (bloqueo por intentos fallidos)
En Debian/Ubuntu:
sudo apt install fail2ban
sudo systemctl enable --now fail2banEs especialmente útil si, por política o por compatibilidad, no puedes desactivar contraseñas todavía.
MFA/2FA (avanzado)
Puedes añadir 2FA con PAM + TOTP, pero requiere más cuidado para no bloquearte. Es una buena capa extra en servidores críticos.
Buenas prácticas operativas
Mantén un acceso alternativo por si te bloqueas
Ten a mano consola del proveedor, KVM/IPMI, acceso físico o snapshots/rollback. En SSH, un cambio mal aplicado puede dejarte sin entrada.
Usa usuarios dedicados y mínimos privilegios
Por ejemplo, un usuario deploy solo para despliegues y otro admin para administración.
Documenta cambios y actualiza OpenSSH
Anota qué cambiaste en sshd_config y por qué. Mantener el sistema actualizado reduce exposición a vulnerabilidades conocidas.
Simplifica conexiones con ~/.ssh/config
En tu cliente puedes definir host, usuario, puerto y clave para no repetirlo siempre:
Host mi-servidor
HostName 203.0.113.10
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519Túneles SSH (port forwarding): cuándo y cómo
Un SSH servidor también permite crear túneles cifrados para acceder a servicios internos sin exponerlos.
Forward local (traer un puerto remoto a tu máquina)
Ejemplo: base de datos en el servidor (puerto 5432) accesible como localhost:15432 en tu equipo:
ssh -L 15432:127.0.0.1:5432 usuario@servidorForward remoto (exponer un puerto de tu cliente en el servidor)
ssh -R 18080:127.0.0.1:8080 usuario@servidorSi no necesitas túneles, considera desactivar el forwarding o permitirlo solo para ciertos usuarios (por ejemplo con bloques Match en sshd_config).
Errores comunes y troubleshooting (checklist)
Aquí tienes un checklist rápido para los errores que más se repiten en SSH servidor.
“Connection refused”
Suele significar que no hay nada escuchando en ese puerto o que un firewall lo bloquea.
systemctl status ssh --no-pager || systemctl status sshd --no-pager
sudo ss -tulpn | grep sshdRevisa también reglas de firewall (por ejemplo, el estado de UFW o firewalld) y, si cambiaste puerto, que estés conectando con el parámetro correcto.
“Permission denied (publickey)” o “Permission denied (password)”
Checklist típico:
- Usuario equivocado (en SSH, el usuario importa).
- Permisos incorrectos en la carpeta ~/.ssh o en authorized_keys.
- Clave pública mal copiada (con saltos de línea raros o duplicada).
Permisos recomendados en el servidor:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keysLogs:
sudo journalctl -u sshd -n 200 --no-pager || sudo journalctl -u ssh -n 200 --no-pager“REMOTE HOST IDENTIFICATION HAS CHANGED!”
Puede ser un ataque… o un cambio legítimo (reinstalación, IP reutilizada, regeneración de claves del host). Valida primero el motivo.
Si confirmas que el cambio es legítimo, en el cliente:
ssh-keygen -R hostname_o_ipLuego reconecta y confirma la nueva huella.
sshd no arranca tras cambiar sshd_config
Valida la sintaxis:
sudo sshd -tY revisa el motivo exacto:
sudo journalctl -u sshd -xe --no-pager || sudo journalctl -u ssh -xe --no-pagerSELinux bloquea un puerto no estándar (RHEL/Fedora)
Si cambias el puerto de SSH y SELinux está en modo enforcing, puede que necesites autorizarlo:
sudo semanage port -a -t ssh_port_t -p tcp 2222Si semanage no existe, suele faltar el paquete policycoreutils-python-utils (o equivalente en tu distribución).
Conclusión
Configurar un SSH server en Linux es una tarea esencial para administrar sistemas de forma remota. Con OpenSSH, podemos habilitar conexiones seguras, controlar el acceso de usuarios y gestionar servidores de manera eficiente desde la terminal.
Además de instalar el servicio, es importante revisar opciones de seguridad como el puerto de escucha, el acceso por contraseña, el uso de claves SSH y la configuración del archivo sshd_config. Dominar estos conceptos permite trabajar con servidores Linux de forma más segura, ordenada y profesional.
Referencias recomendadas
🔗 Referencia oficial: Manual de sshd_config (OpenSSH) — man.openbsd.org
