Pagine

Reverse tunnel ssh

Aggiornato 29-3-2017

Vediamo come realizzare un reverse tunnel ssh persistente, utile per raggiungere il nostro raspberry, o pc linux, dietro nat. Per lo scopo bisogna avere un ddns registrato e funzionante sull'ip della rete raggiungibile oppure un ip statico. Il servizio gratuito offerto da no-ip.com va più che bene, ma bisogna confermarlo mensilmente, almeno nella versione libera. Registratevi e aggiungete un host scegliendo un nome a vostro piacere.

Per aggiornare l'ip del ddns ricordatevi di configurarlo nel vostro router adsl oppure eseguite il client DUC windows, client DUC linux, da un pc dalla vostra rete locale.

Cominciamo, per prima cosa apriamo la porta 22 ssh verso l'esterno sul router adsl della connessione raggiungibile, impostando, allo stesso tempo, un ip statico al pc linux nella nostra rete locale. Installate su quest'ultimo ssh server.
Impostate nel router, verso l'esterno, wan, una porta diversa dalla 22, per esempio la 4725. Interna 22 esterna 4725.

Se il router non consente la personalizzazione di porta interna esterna, potrete reimpostarla nel file di configurazione del server ssh /etc/ssh/sshd_config Bisogna riavviare ssh per confermare la modifica: sudo service ssh restart.

Adesso configuriamo il raspberry nella rete non raggiungibile, telefonia mobile:

Creiamo una coppia di chiavi ssh senza password:
  • ssh-keygen
Aspettate qualche istante, date invio al prompt. Ancora invio e invio, lasciando la passphrase vuota.

Adesso copiamo la chiave pubblica appena creata, dal raspberry al pc con ip pubblico.
  • ssh-copy-id "user@my-public-ddns -p 4725"
Inserite la password. se non otterrete errori, la chiave è stata copiata con successo.

Facciamo adesso una prova di connessione ssh dal raspberry della rete non raggiungibile al pc nella rete raggiungibile:
  • ssh -p 4725 user@my-public-ddns
Se accedete al pc raspberry senza richiesta di password avete eseguito fin qui tutto correttamente, se così non è, verificate i passaggi precedenti.

Creiamo adesso il reverse tunnel dal raspberry nella rete non raggiungibile verso il pc con ip pubblico raggiungibile:
  • ssh -N -R 3700:localhost:22 user@my-public-ddns -p 4725
In ordine, partendo dalla fine, le porte sono:
  • 4725 Porta ssh del pc remoto con ip pubblico
  • 22 Porta del raspberry nella rete non raggiungibile da traslare, in questo caso la 22, ssh server
  • 3700 Porta traslata disponibile sul pc con ip pubblico 
Proviamo a conneterci al raspberry, digitiamo sul pc nella rete con ip pubblico:
  • ssh -p 3700 user@127.0.0.1
Oppure
  • ssh -l user -p 3700 127.0.0.1
Se tutto è stato impostato correttamente ci verrà chiesta la password per l'utente in uso sul raspberry o pc nella rete non raggiungibile.
  • ctrl+d sul pc per chiudere il tunnel
  • ctrl+c sul raspberry per chiudere il reverse tunnel ssh appena creato
Adesso creiamo il tunnel all'avvio del raspberry. Per prima cosa facciamo che resti attivo, in vita, una volta creato:

Modifichiamo i file di configurazione del client e server ssh sia sul pc che sul raspberry:
  • sudo nano /etc/ssh/sshd_config
aggiungiamo alla fine del file:
  • ClientAliveInterval 30
successivamente editiamo:
  • sudo nano /etc/ssh/ssh_config
aggiungiamo sempre alla fine di questo file:
  • ServerAliveInterval 15
Creiamo adesso il file bash per verificare e instaurare la connessione: 
  • nano tunnel.sh
Copiamo all'interno il seguente codice:
  • #!/bin/bash
  • ps -A x |grep "ssh -N -R 3700:localhost:22 user@my-public-ddns -p 4725" |grep -v grep > /dev/null 2>&1
  •   if [[ $? -eq 1 ]]; then
  • ssh -N -R 3700:localhost:22 user@my-public-ddns -p 4725 &
  •   fi
Modificate in tutte le righe user@my-public-ddns con l'utente e il ddns o ip corretto.

Rendiamolo eseguibile con:
  • chmod +x tunnel.sh
e ichiamiamolo ogni minuto da crontab:
  • crontab -e
incollate alla fine del file questa riga:
  •  */1 * * * * ~/tunnel.sh > /dev/null 2>&1 &
Crontab avvia lo script ogni minuto. Se la verifica dà esito negativo, lo script creerà il tunnel.

Buon divertimento.



Nessun commento: