Posso far fallire SSH quando fallisce un port forwarding?


39

Se eseguo il forwarding di una porta remota, anche -R 3690:localhost:3690se esiste già un'associazione sulla porta sull'host remoto, ricevo questo avviso:

Warning: remote port forwarding failed for listen port 3690

C'è un modo per far sì che ssh fallisca (es. Esca con un codice di ritorno diverso da zero), piuttosto che emettere un avviso?


Hai davvero bisogno di creare anche un canale terminale o solo l'inoltro?
Ignacio Vazquez-Abrams,

1
@ IgnacioVazquez-Abrams: solo l'inoltro.
Matt Joiner,

Risposte:


63

Correre

ssh -o "ExitOnForwardFailure yes" ...

o mettere

ExitOnForwardFailure yes

in ~/.ssh/config. Vedi man ssh_configper i dettagli.


Purtroppo ho OpenSSH 4. Potete dirmi quando è stata aggiunta questa funzione?
Matt Joiner

2
No, non lo so. Potrebbe essere una funzione versione 5. Ma la versione 4 deve avere molti anni ormai e ci sono correzioni di sicurezza in ogni momento. Se non è possibile aggiornare il server da soli, è possibile chiedere all'amministratore del server se ritiene che sia sicuro continuare a utilizzare quella versione.
Andrew Schulman,

Ricorda che se non specifichi esplicitamente bind_addressssh potrebbe non fallire. Ad esempio, se un altro utente è già in ascolto su localhost ipv6, [::1]:3690ssh può associare solo ipv4 127.0.0.1:3690e non si lamenta. Ma il tuo client svn preferirebbe probabilmente il socket ipv6 (dell'attaccante). Per un uso sicuro-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier

3
Si può anche usare ssh -o ExitOnForwardFailure = yes per evitare spazi bianchi e la necessità di quotare.
Freespace

1

Uso lo script bash sull'host di destinazione per assicurarmi che l'inoltro sia stato aperto correttamente. La connessione SSH eseguirà questo e terminerà se si verifica un problema con il port forwarding, ad es

script lato client: (utilizza .ssh / config per le impostazioni di port forwarding)

#!/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 lato server (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

Forse anche eseguire lo script lato client sotto schermo con -dmS


2
Il caso che sto cercando di evitare è che esiste già un port forward e viene dato un avviso. Penso che questo script tratterà un'associazione esistente alla porta come un successo, piuttosto che un fallimento.
Matt Joiner,

1
Questo è vero. Il mio problema era con lo stesso script che teneva la porta aperta per alcuni minuti prima del timeout. Questo script sarebbe uscito ed eseguito nuovamente alcune volte dopo di che la porta sarebbe stata nuovamente aperta. Se hai bisogno di sapere con certezza chi possiede la porta, puoi provare a eseguire netstat -anp con sudo e grepping.
Antti Rytsölä Circles Consult

@ AnttiRytsöläCirclesConsult: Nota che potresti aver bisogno di controllare l'ID del processo, come ad esempio la corrispondenza su "ssh" poiché il nome del processo non ti dice ancora quale dei client SSH sta attualmente inoltrando quella porta.
Piskvor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.