Reverse SSH
Raggiungere un Raspberry che si trova in una rete non raggiungibile, ad esempio sotto rete 3G o "nattata"
utilizzando come server un altro Raspberry che ha ip pubblico
Occorre configurare:
Raspberry server: impostare ip privato fisso
Router: aprire la porta esempio 12345 TCP verso la porta 22 all'indirizzo privato del Raspberry server
aprire la porta esempio 54321 TCP verso la stessa porta 54321 all'indirizzo privato del Raspberry server
Utilizzare un ddns se l'ip pubblico è dinamico ad esempio pippo@dyndns.org
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Creare una coppia di chiavi ssh senza password nel Raspberry sotto rete non raggiungibile con:
ssh-keygen
Aspettare qualche istante, dare invio al prompt, ancora invio e invio, lasciare il campo Password vuoto
Copiare la chiave pubblica appena creata dal Raspberry della rete non raggiungibile al Raspberry con ip pubblico:
Digitare sul Raspberry della rete non raggiungibile:
ssh-copy-id pi@pippo.dyndns.org -p 12345
Inserire la password dell'utente del Raspberry con ip pubblico
Fare una prova di connessione ssh dal Raspberry della rete non raggiungibile al Raspberry con ip pubblico:
Digitare sul Raspberry della rete non raggiungibile:
ssh -p 12345 pi@pippo.dyndns.org
Si deve accedere al Raspberry con ip pubblico senza richiesta di password
In caso contrario verificare i passaggi precedenti
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Modificare i file di configurazione sul Raspberry server:
sudo nano /etc/ssh/sshd_config
aggiungere alla fine del file:
ClientAliveInterval 30
GatewayPorts yes #se non è presente
Poi:
sudo nano /etc/ssh/ssh_config
aggiungere alla fine del file:
ServerAliveInterval 15
Modificare i file di configurazione sul Raspberry della rete non raggiungibile (client)
sudo nano /etc/ssh/sshd_config
aggiungere alla fine del file:
ClientAliveInterval 30
Poi:
sudo nano /etc/ssh/ssh_config
aggiungere alla fine del file:
ServerAliveInterval 15
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Creare il file bash sul Raspberry della rete non raggiungibile (client)
per instaurare e per verificare la connessione:
nano tunnel.sh
Copiare all'interno:
#!/bin/bash
ps -A x |grep "ssh -N -R pippo.dyndns.org:54321:localhost:22 pi@pippo.dyndns.org -p 12345" |grep -v grep > /dev/null 2>&1
if [[ $? -eq 1 ]]; then
ssh -N -R pippo.dyndns.org:54321:localhost:22 pi@pippo.dyndns.org -p 12345 &
fi
Renderlo eseguibile con:
chmod +x tunnel.sh
Richiamarlo ogni minuto da crontab:
crontab -e
Incollare alla fine del file:
*/1 * * * * ~/tunnel.sh > /dev/null 2>&1 &
Crontab avvierà lo script ogni minuto e se la verifica darà esito negativo creerà la connessione
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Procedura per il collegamento al Raspberry della rete non raggiungibile:
ssh -p 54321 pi@pippo.dyndns.org
oppure
ssh -p 54321 root@pippo.dyndns.org
Digitare la password del Raspberry della rete non raggiungibile