Conflictos de Puertos SSH: Cómo Identificar y Cambiar Puertos

Resuelve frustrantes problemas de conexión SSH causados por conflictos de puertos. Esta guía detalla cómo identificar de manera definitiva el puerto SSH activo usando comandos del sistema (ss/netstat) y proporciona una metodología segura paso a paso para modificar el archivo de configuración (sshd_config) y actualizar los cortafuegos para cambiar a un nuevo número de puerto, evitando bloqueos.

Conflictos de Puertos SSH: Cómo Identificar y Cambiar Puertos

SSH normalmente escucha en el puerto TCP 22, pero los servidores reales no siempre son tan ordenados. Una imagen en la nube puede tener SSH movido al 2222. Un host de contenedores puede publicar varios servicios similares a SSH a través de diferentes puertos. Un script de endurecimiento puede haber cambiado sshd_config hace meses. O sshd puede simplemente fallar al iniciar porque otro proceso ya está vinculado a la misma dirección y puerto.

Los problemas de puerto generalmente se manifiestan como Connection refused o Connection timed out. La diferencia importa: "refused" generalmente significa que llegaste al host pero nada aceptó la conexión en ese puerto. "Timeout" generalmente significa que un cortafuegos, ruta, grupo de seguridad o ruta de red descartó el tráfico.


Entendiendo los Conflictos de Puertos SSH

Un conflicto de puerto surge cuando dos servicios de red distintos intentan escuchar conexiones entrantes en el mismo número de puerto TCP o UDP. Dado que solo un proceso puede vincularse a un puerto específico en una dirección IP en un momento dado, el segundo servicio que intente iniciar generalmente fallará o usará un puerto diferente si está configurado para hacerlo.

Para SSH, un verdadero conflicto de enlace significa que sshd no puede escuchar en la dirección y puerto configurados. Un problema más común es más simple: SSH está escuchando en un puerto, mientras que el cliente o el cortafuegos está usando otro.

Problemas Comunes de Conexión Relacionados con Puertos

Al solucionar problemas de conectividad SSH, los problemas de puerto a menudo se manifiestan como:

  1. Conexión Rechazada: Esto generalmente significa que la máquina de destino es accesible, pero ningún servicio está escuchando activamente en el puerto especificado (ya sea que se usó el puerto incorrecto o el servicio SSH falló al iniciar).
  2. Tiempo de Espera Agotado: Esto a menudo indica que el tráfico destinado a ese puerto está siendo bloqueado por un cortafuegos (ya sea basado en host o en red) o que el host en sí mismo es inalcanzable.

Paso 1: Identificando el Puerto SSH Actualmente Activo

Antes de realizar cualquier cambio, debes confirmar qué puerto está usando realmente el demonio SSH. Esto requiere acceso administrativo (generalmente a través de la consola o una conexión exitosa existente).

A. Verificando el Archivo de Configuración SSH

La ubicación principal para la configuración de SSH es el archivo sshd_config. La directiva Port especifica en qué puerto escucha sshd.

Ubicación: /etc/ssh/sshd_config (Común en sistemas Linux/Unix)

Usa un editor de texto como nano o vim para inspeccionar el archivo:

sudo nano /etc/ssh/sshd_config

Busca la línea que comienza con Port. Si está comentada, OpenSSH usa el puerto predeterminado 22 a menos que otro archivo de configuración incluido lo anule.

#Port 22
Port 2222

También verifica los fragmentos de configuración incluidos:

grep -R "^[[:space:]]*Port" /etc/ssh/sshd_config /etc/ssh/sshd_config.d 2>/dev/null

B. Verificando los Sockets de Escucha con netstat o ss

La forma más autorizada de confirmar a qué puerto está vinculado actualmente el servicio es verificando los sockets de escucha de red del sistema operativo. La herramienta moderna es ss, pero netstat todavía está ampliamente disponible.

Usando el comando ss (Recomendado en sistemas modernos):

Este comando muestra todos los listeners TCP (-t), incluyendo procesos (-p), filtrando por el servicio SSH (grep sshd).

sudo ss -tlpn | grep sshd

Ejemplo de Salida (Puerto Predeterminado):

LISTEN 0      128    0.0.0.0:22               0.0.0.0:*    users:(("sshd",pid=1234,fd=3))

Ejemplo de Salida (Puerto Personalizado 2222):

LISTEN 0      128    0.0.0.0:2222             0.0.0.0:*    users:(("sshd",pid=1234,fd=3))

Usando netstat (Alternativa):

sudo netstat -tulpn | grep sshd

Una vez que identifiques el puerto (por ejemplo, 2222), debes usar ese número de puerto al conectarte desde un cliente remoto.


Paso 2: Cambiando el Puerto SSH de Forma Segura

Cambiar el puerto SSH es una práctica común de endurecimiento de seguridad. Crucialmente, nunca cambies el puerto antes de asegurarte de que tu nueva configuración funciona, o corres el riesgo de bloquearte.

A. La Secuencia Segura para Cambiar Puertos

Sigue estos pasos precisamente para evitar perder el acceso:

  1. Verificar el Acceso del Cortafuegos: Asegúrate de que el nuevo puerto esté abierto en tu cortafuegos basado en host (por ejemplo, ufw o firewalld) antes de reiniciar el servicio SSH.
  2. Editar Configuración: Modifica /etc/ssh/sshd_config al nuevo número de puerto.
  3. Probar la Sintaxis de Configuración: Prueba la sintaxis de configuración antes de reiniciar.
  4. Reiniciar el Servicio SSH: Aplica los cambios.
  5. Probar Conexión Remota: Intenta inmediatamente conectarte usando el nuevo puerto desde una sesión de terminal separada.
  6. Eliminar Regla de Puerto Antiguo (Opcional): Una vez verificado, cierra el puerto antiguo (22) en el cortafuegos.

B. Modificando /etc/ssh/sshd_config

Usa tu editor preferido para abrir el archivo de configuración:

sudo nano /etc/ssh/sshd_config

Localiza la línea Port. Cambia el valor existente o descomenta/añade una nueva directiva Port. Cambiemos de 22 a 2222.

# Cambia esta línea:
Port 2222

Guarda y cierra el archivo.

C. Actualizando Cortafuegos Basados en Host (Paso Crucial)

Si omites esto, tu conexión fallará con un tiempo de espera después de que el servicio se reinicie.

Usando UFW (Ubuntu/Debian):

# 1. Permitir el nuevo puerto
sudo ufw allow 2222/tcp

# 2. Si deseas eliminar la regla del puerto antiguo más tarde (después de probar):
# sudo ufw delete allow 22/tcp

sudo ufw status verbose

Usando Firewalld (RHEL/CentOS/Fedora):

# 1. Permitir el nuevo puerto permanentemente
sudo firewall-cmd --permanent --add-port=2222/tcp

# 2. Recargar las reglas del cortafuegos
sudo firewall-cmd --reload

D. Probando y Recargando el Demonio SSH

Siempre prueba la sintaxis del archivo de configuración antes de aplicar cambios:

sudo sshd -t

Si la sintaxis es correcta, recarga o reinicia el servicio:

sudo systemctl reload sshd
# Si tu sistema usa el nombre de servicio ssh en su lugar:
# sudo systemctl reload ssh

Luego verifica el estado:

sudo systemctl status sshd

Deja tu sesión SSH actual abierta y prueba el nuevo puerto desde una terminal separada antes de cerrar nada.

E. Conectándose a Través del Nuevo Puerto

Desde tu máquina cliente, ahora debes especificar explícitamente el nuevo puerto usando la bandera -p con el comando ssh:

ssh usuario@tu_servidor_ip -p 2222

Si la conexión tiene éxito, el cambio de puerto funcionó. Solo entonces debes eliminar la regla del cortafuegos antiguo.

Advertencia: Si cambias el puerto y no lo abres en el cortafuegos, o si sshd falla al recargar, puedes bloquearte. Mantén disponible la consola, serial, recuperación en la nube u otra ruta administrativa.


Solucionando Fallos de Conexión Después de Cambiar Puertos

Si recibes un error después de cambiar el puerto, sigue esta lista de verificación rápida:

Síntoma de Error Causa(s) Probable(s)
Conexión Rechazada 1. sshd falló al iniciar (verifica systemctl status sshd). 2. Especificaste el puerto incorrecto en el comando del cliente. 3. El cortafuegos está permitiendo tráfico en el puerto antiguo (22) pero bloqueando el nuevo puerto (2222).
Tiempo de Espera Agotado 1. El host está caído. 2. El cortafuegos del host (UFW/firewalld) está descartando activamente paquetes para el nuevo puerto. 3. El cortafuegos de infraestructura de red está bloqueando el puerto.

Para confirmar que el demonio está escuchando, vuelve a ejecutar sudo ss -tlpn | grep sshd en el lado del servidor.

Una Forma Más Segura de Pensar en los Cambios de Puerto

No confíes solo en el archivo de configuración, y no confíes solo en el cortafuegos. Confirma las tres capas: sshd_config dice el puerto que esperas, ss muestra que sshd está realmente escuchando allí, y el cortafuegos o grupo de seguridad en la nube permite que el tráfico llegue. Cuando esos tres coinciden, el comando del cliente es sencillo:

ssh -p 2222 usuario@tu_servidor_ip

Cambiar el puerto SSH puede reducir los escaneos automatizados ruidosos en el puerto 22, pero no es un reemplazo para la autenticación por clave, reglas de cortafuegos sensatas, sistemas parcheados y deshabilitar el inicio de sesión por contraseña cuando sea apropiado.