¿Cómo configurar ssh para intentar no solo el puerto 22 sino también el puerto secundario cada vez?

9

Como parte de mi esfuerzo por reducir el ruido en los registros y reducir un poco la capacidad de detección (y además de fail2ban, permitiendo solo la autenticación de clave pública, etc.), rutinariamente cambio los puertos sshd en los servidores que configuré en un puerto diferente, digamos 5492. Actualmente Agrego -p 5492 a mi comando ssh o agrego el puerto para cada servidor específico en mi ssh_config.

¿Hay alguna forma de configurar ssh para intentar conectarse al puerto 22 y al puerto 5492 si el puerto 22 no funciona?

Riley
fuente
1
Prefiero en lugar de tener seguridad a través de la oscuridad, configurar una VPN y no tener puertos ssh abiertos a Internet en general.
Rui F Ribeiro
2
@RuiFRibeiro Estoy de acuerdo, que no es más seguro. Sin embargo, mantiene el ruido bajo en los archivos de registro. También se podría usar la eliminación de puertos para reducir los intentos de inicio de sesión, lo que aumenta la seguridad.
Ned64
2
@RuiFRibeiro ¿Es un servidor VPN más seguro que un servidor SSH?
Riley
Todo depende de la implementación. En mi trabajo anterior, definí 2 entradas VPN para redundancia, y ninguna sshpresencia para el exterior.
Rui F Ribeiro
2
La seguridad por oscuridad es una buena capa ADICIONAL además de una buena configuración, especialmente cuando se trata de atacantes oportunistas.
rackandboneman

Respuestas:

11

Podría envolver un script de shell, sshpero en sshsí mismo no lo hará.

Una forma de usar una función bash es esta (poner en ~/.bashrc):

function ssh() { command ssh -p 22 "$@" || command ssh -p 5492 "$@"; }

Por cierto, se recomienda usar rootpuertos reservados para servicios del sistema, como sshpara evitar que los usuarios tengan un proceso que escuche, por ejemplo, el puerto 5492. De lo contrario, pueden jugar man en el medio y posiblemente capturar datos de inicio de sesión. Entonces, use un puerto <1024.

Ned64
fuente
1
Esa es una gran solución. También una gran nota sobre los puertos!
Riley
55
Tenga en cuenta que la segunda conexión se realizará incluso si la primera tiene éxito si el comando ejecutado por sshdevuelve distinto de cero. Un ejemplo trivial sería ssh user@server false.
Kusalananda
1
@ Kusalananda Gracias, he escrito commandahora. Solo quería evitar la recurrencia, como has acertado.
Ned64
El problema que menciona @Kusalananda se puede evitar (en su mayoría) probando el estado de salida específico de ssh- si hay un error de ssh (a diferencia de la falla del comando remoto), saldrá con un estado de 255. Por lo tanto, command ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fidebería funcionar.
Gordon Davisson
10

sshen sí mismo puede hacerlo a través de Matchdocumentado, ssh_config(5)aunque la documentación es algo escasa en ejemplos. Este formulario puede ser adecuado si se quiere introducir la complejidad en la configuración de SSH, aunque está restringido por las limitaciones de la ssh_config(5)sintaxis y puede requerir un poco de manipulación para el resultado deseado. En particular, el puerto personalizado no se puede configurar o se puede configurar incorrectamente desde el Matchintento anterior . Es por eso que, a continuación, se establece dos veces cuando se prueba, o una vez por defecto, y no se establece al establecer los valores predeterminados canónicos.

# here we set the defaults for the host (no port!)
Match !canonical host testhost
  CanonicalizeHostname yes
  Hostname 192.0.2.42
  IdentityFile ~/.ssh/id_blahblah
  ...
# port available?
Match canonical host 192.0.2.42 exec "is-ssh-up %h 2222"
  Port 2222
# or the default port
Match canonical host 192.0.2.42
  Port 22

is-ssh-up simplemente verifica si algo responde en el puerto dado y podría verse como

#!/usr/bin/env expect
package require Tcl 8.5
if {[llength $argv] < 2} {
   puts stderr "Usage: is-ssh-up host port"
   exit 1
}
puts stderr "is-ssh-up: DEBUG trying $argv"
set socket [socket -async [lindex $argv 0] [lindex $argv 1]]
chan event $socket readable [list exit 0]
after 3000 [list exit 1]
vwait godot
thrig
fuente
1
if-then-else en .ssh / config? ¡No lo hubiera creído!
Archemar
1

Puede usar la función comodín de ~.ssh/config, colocando esta entrada en su lista:

Host *
Port 5492

Pero esto no se reducirá a 22 por sí solo.

Si lo coloca al final, aún puede anularlo para aquellos hosts donde necesite 22 poniendo un valor diferente por encima. (Y siempre puede anularlo en la línea de comando).

Paŭlo Ebermann
fuente