Supponiamo di aver un host A con un indirizzo pubblico e un host B su una lan dietro Nat, a questo punto vogliamo raggiungere dall'host A l'host B tramite ssh ma non possiamo mettere mano al gateway che Natta B.
Una possibile soluzione è fare aprire a B un tunnel ssh su A tramite il quale poi ci collegheremo
open_tunnel_ssh.sh
#!/bin/bash
PORTAAPERTA=`ps u -N -C grep |grep "ssh -N -R 3333" | tr -s ' ' | cut -d ' ' -f 11 | wc -l`
if [ "$PORTAAPERTA" == "0" ]; then
ssh -N -R 3333:localhost:22 user@host_A.com -f
fi
questo script può essere inserito nel crontab di B in modo che venga eseguito ogni cinque minuti. Se il tunnel è già aperto la connessione ssh non verrà rieseguita altrimenti verra aperta la porta 3333 sull'host A che punterà alla porta 22 (ssh) dell'host B
A questo punto dall'host A possiamo impartire il comando
ssh -p 3333 localhost
e avremo accesso a l'host B
nell'eventualità che il tunnel cada questo verrà ripristinato dopo cinque minuti grazie al crontab.
Per fare funzionare il tutto è fondamentale che la connessione ssh da B verso A funzioni senza dovere impartire la password ma grazie alla chiave pubblica di B precedentemente generata
ssh-keygen -t dsa e salvata in
~/.ssh/authorized_keys di A