¿Puedo hacer que SSH falle cuando falla un reenvío de puerto?

39

Si realizo un reenvío de puerto remoto, como -R 3690:localhost:3690cuando ya existe un enlace en el puerto en el host remoto, recibo esta advertencia:

Warning: remote port forwarding failed for listen port 3690

¿Hay alguna manera de hacer que ssh falle (es decir, salir con un código de retorno distinto de cero), en lugar de simplemente emitir una advertencia?

Matt Joiner
fuente
¿Realmente necesitas hacer un canal terminal también, o solo el reenvío?
Ignacio Vazquez-Abrams
1
@ IgnacioVazquez-Abrams: Solo el reenvío.
Matt Joiner el

Respuestas:

63

correr

ssh -o "ExitOnForwardFailure yes" ...

o poner

ExitOnForwardFailure yes

en ~/.ssh/config. Ver man ssh_configpara más detalles.

Andrew Schulman
fuente
Lamentablemente tengo OpenSSH 4. ¿Puede decirme cuándo se agregó esta función?
Matt Joiner el
2
No, no lo se. Puede ser una característica de la versión 5. Pero la versión 4 debe tener muchos años y hay soluciones de seguridad todo el tiempo. Si no puede actualizar el servidor usted mismo, puede preguntarle al administrador del servidor si cree que es seguro seguir usando esa versión.
Andrew Schulman el
Tenga en cuenta que si no especifica explícitamente, bind_addressentonces ssh podría no fallar. Por ejemplo, si otro usuario ya está escuchando en ipv6 localhost [::1]:3690, ssh puede vincular solo ipv4 127.0.0.1:3690y no se queja. Pero su cliente svn probablemente preferiría el socket ipv6 (del atacante). Para estar seguro mejor uso-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier
3
También se puede usar ssh -o ExitOnForwardFailure = yes para evitar espacios en blanco y la necesidad de comillas.
espacio libre
1

Utilizo el script bash en el host de destino para asegurarme de que el reenvío se abrió correctamente. La conexión SSH ejecutará esto y se cerrará si hay un problema con el reenvío de puertos, p. Ej.

script del lado del cliente: (esto usa .ssh / config para la configuración de reenvío de puertos)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

script del lado del servidor (bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

Tal vez incluso ejecute el script del lado del cliente en la pantalla con -dmS

Antti Rytsölä Circles Consult
fuente
2
El caso que estoy tratando de evitar es que ya existe un puerto hacia adelante y se da una advertencia. Creo que este script tratará un enlace existente al puerto como un éxito, en lugar de un error.
Matt Joiner el
1
Esto es verdad. Mi problema fue con el mismo guión que sostiene el puerto abierto durante unos minutos antes de que se agote el tiempo. Thsi guión podría salir y volver a ejecutar un par de veces después de lo cual el puerto se abre de nuevo. Si necesita saber con seguridad que posee el puerto usted podría intentar ejecutar netstat -anp con sudo y grepping eso.
Círculos Antti Rytsölä Consulta
@ AnttiRytsöläCirclesConsult: Tenga en cuenta que puede que tenga que comprobar el ID del proceso, como por ejemplo en el juego "ssh" como nombre de proceso todavía no le dice cuál de los clientes SSH actualmente está reenvío de ese puerto.
Piskvor