martedì 9 agosto 2016

Reverse SSH su Intel Edison

Il tunnel reverse SSH e' un metodo estremamente comodo per amministrare macchine su reti private senza necessariamente installare una VPN e senza dover cambiare le configurazioni dei firewall (questo perche' la connessione viene iniziata dall'interno della rete privata, regola generalmente accettata e non filtrata dai firewall su un protocollo SSH che viene spesso lasciato non filtrato)

Le condizioni necessarie sono
1) una macchina deve essere disponibile con indirizzo pubblico
2) le due macchine devono poter instaurare una connessione SSH

diciamo di avere una macchina A su indirizzo pubblico del tipo 150.217.xxx.xxx ed una chiamata B (una Intel Edison per esempio) su una rete privata con indirizzo del tipo 192.168.1.10. L'obbiettivo e' di amministrare la macchina B da A mediante una shell SSH

Per prima cosa si deve procedere allo scambio delle chiavi in modo da rendere l'autenticazione automatica (cio' aiuta nel caso in cui la connessione cada per creare uno script per riattivarla in modo automatico o per iniziare il reverse tunnel al boot)

Macchina B
con il comando
ssh-keygen 

si creano una coppia di chiave pubblica e privata per la macchina B.
Su Intel Edison non e' disponibile ssh-agent quindi e' piu' comodo NON utilizzare una passphrase 

a questo punto si copia la chiave pubblica sulla macchina A mediante

scp -P 22 ~/.ssh/id_rsa.pub root@150.217.xxx.xxx:~/.ssh/authorized_keys
per comodita' l'utente della Intel Edison e quello della macchina remota sono identici e sono root (lo so, non si fa....e' solo per semplicita')

da questo punto ci si dovrebbe loggare da B (Edison) al server esterno con il solo comando

ssh root@150.217.xxx.xxx
se tutto va bene si puo' procedere a creare il tunnel inverso

dalla macchina B si digita il comando
ssh -R 19999:localhost:22 root@150.217.xxx.xxx

a questo punto la connessione e' stabilita. Per amministrare la macchina B dalla macchina A si digita

ssh localhost -p 19999

e si entra nella shell di B

A questo punto non e' ancora finita perche' bisogna assicurarsi che la macchina B chiami A ad ogni riavvio (per esempio per mancanza di corrente)
Per fare cio' si deve creare la directory

mkdir /etc/init.d

copiare il file script che avvia il reverse tunnel e renderlo eseguibile
a questo punto si digita

update-rc.d script.sh defaults

sembra finito ma non e' cosi' perche' se la connessione non viene usata (ovvero non passano pacchetti lungo il tunnel) il collegamento viene resettato dopo un timeout. Non volendo modificare le impostazioni del server la soluzione piu' semplice e' usare autossh

L'installazione non e' banale perche' non e' disponibile il pacchetto opkg

wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz 
gunzip -c autossh-1.4e.tgz > autossh.tar  
tar xvf autossh.tar 
cd autossh-1.4e 
./configure 
make 
make install

si sostituisce il comando precedente con autossh

autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 19999:localhost:22 root@150.217.xxx.xxx 

un altro sistema e' quello di usare la sintassi
autossh -i /home/root/.ssh/id_rsa. -M 20002 -N -R 20000:localhost:22 root@150.217.73.18 &