Elementi in gioco:
- host-dietro-nat: host su cui vogliamo accedere, sarà lui a creare il tunnel
- server-pubblico: server pubblico a cui abbiamo accesso e che conterrà il file di testo con il comando per aprire o chiudere il tunnel; per accedere a server-pubblico dovremo bussare alla porta 1234
Vogliamo che host-dietro-nat controlli periodicamente un file sul server web server-pubblico e in base a questo apra/chiuda un tunnel ssh sempre verso server-pubblico. Una volta aperto il tunnel ssh dal server pubblico potremo accedere ad host-dietro-nat con un semplice ssh -p 2222 localhost impoartito su server-pubblico.
File con comando:
Il file contenente il comando per aprire/chidere la connessione ssh deve risiedere sulla web root di server-pubblico ed è nominato o.txt. Deve contenere uno dei seguenti caratteri seguito dal ritorno a capo (\n)
- r: reset - killa ssh bussanti, ssh tunnel e riapre il tunnel
- o: open - apre il tunnel
- c: close - chiude il tunnel (killa ssh bussanti e ssh tunnel)
Vediamo gli script che dovranno essere eseguiti da host-dietro-nat:
open-tunnel-ssh.sh
#!/bin/sh
COMANDO=`wget -q -O - http://server-pubblico/o.txt`
echo "COMANDO=$COMANDO"
if [ "$COMANDO" == "r" ] || [ "$COMANDO" == "c" ]; then
echo "reset"
kill_ssh_bussanti
kill_ssh_tunneling
fi
if [ "$COMANDO" == "r" ] || [ "$COMANDO" == "o" ]; then
PORTAAPERTA=`ps |grep "[s]sh -f -N -R 2222" | wc -l`
if [ "$PORTAAPERTA" == "0" ]; then
echo "sto bussando"
ssh -p 1234 server-pubblico &
sleep 10
echo "apro il tunnel"
ssh -f -N -R 2222:localhost:22 user@server-pubblico
kill_ssh_bussanti
fi
fi
kill_ssh_tunneling
#!/bin/sh
echo "killo ssh tunneling"
for KPID in `ps |grep "[s]sh -f -N -R 2222" | tr -s ' ' | cut -d ' ' -f 2 `; do
kill -9 $KPID
done
kill_ssh_bussanti
#!/bin/sh
echo "killo ssh bussanti"
for KPID in `ps | grep "[s]sh -p 1234" | tr -s ' ' | cut -d ' ' -f 2 `; do
kill -9 $KPID
done
Vediamo i passi che eseguire lo script open-tunnel-ssh.sh:
- recupera il comando da eseguire inserendolo nella variabile COMANDO (wget -q -O - http://server-pubblico/o.txt)
- chiude eventuali richieste di port knocking ed eventuali tunnel aperti quando il comando è reset o close grazie agli script kill_ssh_bussanti e kill_ssh_tunneling
- se il comando impartito è reset oppure open prosegue bussando a server-pubblico (sh -p 1234 server-pubblico &) e aprendo il tunnel ssh verso server-pubblico (ssh -f -N -R 2222:localhost:22 user@server-pubblico)
Una volta inserito nel crontab di host-dietro-nat lo script open-tunnel-ssh.sh potremo aprire o chiudere il tunnel grazie al contenuto del file o.txt residente su server-pubblico.