Come faccio a collegarmi alla mia macchina dietro un NAT?

A casa ho attivato Fastweb che, come molti sanno, fornisce un indirizzo IP privato per la sua rete e si esce su internet attraverso un router che fa NAT.

Volendo Fastweb ti da anche un indirizzo pubblico ma se lo fa pagare. Visto che l’unica mia esigenza di avere l’indirizzo pubblico è per fare ssh dall’ufficio sulla mia macchina a casa, ho provato a pensare a qualche soluzione alternativa all’ip pubblico. Direi che la cosa più ovvia è che invece di essere la macchina esterna a collegarsi verso quella di casa deve essere quest’ultima ad avviare la connessione verso l’esterno.

Ho trovato alcune soluzioni già pronte per fare circa quello che volevo ma, visto che avevo voglia di divertirmi un po’, non le ho usate e mi sono messo a pensare ad una soluzione più immediata possibile e senza l’utilizzo di programmi specifici.

Per comunicare al mio computer di casa cosa deve fare ho deciso di utilizzare una pagina web, su un server prefissato, della quale posso modificare i contenuti. Il computer di casa ricaricherà regolarmente questa pagina per capire cosa deve fare (in pratica se e a chi collegarsi).

Quello che ho deciso di usare è:

  • Qualche semplice script di shell.
  • l’utility netcat.

Sul server di casa (H) metto uno script che fa queste operazioni:

  1. carica la pagina web prefissata per capire l’host esterno a cui collegarsi
  2. se non esiste un host esterno a cui collegarsi, aspetta un po’ e ricomincia da 1
  3. apre la connessione sia verso l’host esterno che verso il demone ssh locale e associa queste due connessioni
  4. terminate le connessioni ricomincia da 1

Il punto 3 si realizza con netcat attraverso un comando come questo:

nc hostremoto porta -c "nc locahost 22"

In realtà ho avuto un problema con l’opzione -c che faceva i capricci per passare i parametri al secondo comando nc. Ho risolto facedo uno script “tossh” con dento “nc localhost 22″ e richiamato questo script nell’opzione -c.

Su l’host remoto (R) c’è il client ssh che vuole fare la connessione, ma che invece deve riceverla. L’accoppiamento fra connessione entrante (dal computer di casa) e uscente (dal client ssh) la realizziamo di nuovo attraverso netcat:

nc -lp portalocale -c "nc -lp porta" &
ssh -p portalocale -u utente localhost

dove porta è lo stesso numero di porta utilizzato nel comando sul computer di casa. Per come ho strutturato il primo comando bisogna che queste istruzioni vengano eseguite entrambe prima che il server di casa tenti di collegarsi.

Ora ho un problema che mi impedisce di determinare quando la sessione ssh è terminata. I comandi netcat non chiudono mai la connessione TCP ma terminano solo quando è l’host remoto a chiuderla. Terminare il netcat su (R) non è un problema (in realtà invertendo l’utilizzo di porta e portalocale i comandi terminano da soli). Il problema è su (H) dove rimane la connessione TCP fra un netcat e il demone ssh.

Se qualcuno vuole aiutarmi a risolvere il problemuccio si faccia avanti …

Lo script ancora incompleto che gira su H è questo:

#!/bin/sh
WEBS='www.xyz.it'
WEBA='path/to/test'
ADDR="http://$WEBS/$WEBA"
PARAM=`echo GET $ADDR | nc $WEBS 80`
while [ "$PARAM" == "" ]
do
   sleep 5
   PARAM=`echo GET $ADDR | nc $WEBS 80`
done
nc -ve “tossh” $PARAM

2 Commenti a “Come faccio a collegarmi alla mia macchina dietro un NAT?”

  1. Gravatar Luigi scrive:

    Innanzitutto nello script metterei un $0 in fondo, in modo che una volta terminata la sessione nc lo script si riavii.
    Per chiudere la sessione potresti mettere che se trova PARAM == “” lancia un bel “pkill nc” che uccida tutti i netcat brutalmente. In questo modo ti basta rimodificare la pagina web (che se ho capito bene lo faresti comunque) per fargli chiudere la connessione.

    My 2 cents…

    L

  2. Gravatar mpolci scrive:

    Nel frattempo ho trovato un’opzione del demone openssh per dirgli di verificare ad intervalli regolari il collegamento se non si riceve dati. Il collegamento inteso come tunnel ssh non tcp.
    L’opzione è ClientAliveInterval e va messa nel file di configurazione del demone ssh.

Scrivi un commento