Connessione SSH permanente in background per creare tunnel inverso: qual è il modo corretto?


41

Domanda correlata: avvia la connessione ssh dal server al client

La risposta da lì mi ha aiutato molto, questo comando fa quello che mi serve:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Quindi ho scritto la sceneggiatura per riconnettermi tutto il tempo:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

E l'ho aggiunto al /etc/crontab. Ma ho scoperto che funziona se solo lo eseguo "a mano" dalla shell, ma se viene chiamato da cron, ssh si collega e termina immediatamente. (quindi, lo script sopra si riconnette continuamente)

Da man ssh, ho scoperto che per le connessioni in background dovrei chiamarlo con -nchiave, ma non ha aiutato. Quindi, ho appena cercato script simili e ho scoperto che funziona se chiamo tail -f something, cioè un comando "infinito", quindi ho appena creato un file vuoto /tmp/dummy_filee ora il mio comando ssh è simile al seguente:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

Ora funziona! Ma questa soluzione sembra un po 'brutta, inoltre non capisco davvero le ragioni reali di quel comportamento. Per caso, ho provato a chiamare bashinvece di tail -f( bashmi sembra anche il comando "infinito"), ma non funziona.

Quindi, qualcuno potrebbe spiegare questo comportamento, e qual è il modo corretto di creare una connessione ssh in background per mantenere il tunnel ssh inverso?


che ne dici di usare &alla fine del tuo comando ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker,

Ma poi il mio whileloop verrà eseguito più volte, avviando una nuova sshconnessione in background ogni 5 secondi, giusto? Questo non è quello di cui ho bisogno.
Dmitry Frank,

Risposte:


37

Sembra che tu voglia l' -Nopzione per ssh.

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

Consiglio vivamente di prendere in considerazione autossh. Ha alcune euristiche che le consentiranno di determinare se la perdita di connessione è la ragione sottostante e ridurrà la frequenza dei tentativi di riconnessione. Inoltre monitora la connessione utilizzando tunnel aggiuntivi, il che lo rende estremamente utile per scenari come quello di cui stai chiedendo.

Se sei su Ubuntu, ad esempio, puoi fare una ricerca web per autossh upstarttrovare alcuni esempi utili su come configurare Ubuntu in modo che il tunnel sia mantenuto in modo persistente.

Lo sto usando per mantenere sempre aperta una connessione con tunnel al mio server per determinati servizi.


In realtà ho provato autossh, ho letto questo articolo: goo.gl/jVuuSR , ma ha funzionato solo per me se ho subito una connessione Internet all'avvio del sistema; ma se la connessione viene stabilita in un secondo momento, non ha funzionato. Non sono sicuro, forse ho fatto qualcosa di sbagliato, ma anche in questo articolo l'autore ha fatto il sleep 10suo /etc/rc.local, per essere sicuro che la connessione a Internet sia già pronta quando viene chiamato autossh.
Dmitry Frank,

2
@DmitryFrank: un po 'ingiusto non menzionarlo nella tua domanda, se ci hai provato. Lo consiglio ancora. Con upstarte altri sostituti di init puoi collegare l'inizio del tunnel a uno o più dispositivi di rete in fase di installazione. La migliore delle soluzioni (IMO) sul web è questa: erik.torgesta.com/tag/ssh-upstart ... e comunque sleep 10non aiuterà nulla in alcuni casi limite.
0xC0000022L

Mi dispiace non averlo menzionato, ad essere sincero quando non ha funzionato per me ho deciso di farlo solo "a mano" e ho completamente dimenticato di autossh. Grazie per ssh-upstartdare un'occhiata!
Dmitry Frank,

tardi alla festa, ma volevo aggiungere che non sono riuscito a ottenere l'autossh affidabile per mantenere un tunnel inverso. se il tunnel inverso fallisse per qualche motivo, l'autossh non l'avrebbe notato e non avrebbe ricostruito la connessione. Ho bisogno di più tunnel da più server e questo complica le cose
DeveloperChris

@DeveloperChris: Beh, sto eseguendo esattamente questo scenario - e in modo affidabile. A meno che il server remoto non si spenga letteralmente e sia necessario riaccenderlo, il tunnel viene sempre ristabilito. Forse dovresti scrivere la tua domanda e fornire dettagli. Certamente questo può essere fatto. Ho usato questo per aggirare i problemi di VPN per mesi.
0xC0000022L

9

Io secondo @ suggerimento di 0xC0000022L e l'uso autosshpure. Lo uso per mantenere una connessione SSH dal mio laptop mentre lo prendo da un posto all'altro e funziona. Uso questa connessione per ripristinare le porte 25 e 2143 per accedere ai miei server SMTP e IMAP personali.

Ecco lo script che uso:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Quindi mantengo una Hostvoce nel mio $HOME/.ssh/configfile per l'host imap-o.

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

Lo autossh_mail.shscript viene eseguito come parte del mio desktop quando eseguo l'accesso. È possibile accedervi tramite gnome-session-properties.

       ss # 1

                                          ss # 2

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.