… un tunnel SSH! XD
OK, spiegazione!
Scenario:
- una rete informatica dietro firewall e/o proxy, che impedisce le connessioni verso determinate porte all’esterno (ma che lascia libera almeno una porta, altrimenti non c’è soluzione);
- un’applicazione che dovrebbe connettersi ad un server esterno, ma che viene bloccata da queste limitazioni;
- una persona che ha veramente bisogno di utilizzare questa applicazione!!
Il programma in questione potrebbe essere un browser web, nel caso in cui non si volesse essere osservati dal proxy aziendale mentre si naviga, oppure un programma di posta elettronica, come Outlook o KMail, oppure un programma di chat, come Messenger o IRC, oppure un gioco online come World of Warcraft, Dark Age of Camelot o altri.
La soluzione a tutti i problemi di questo tipo si chiama TUNNEL SSH: per metterlo a punto serve un computer esterno al quale collegarsi, che abbia un server SSH in esecuzione (tutte le distribuzioni Linux lo hanno nella dotazione di default).
Praticamente succede qualcosa di simile a questa immagine:
Come realizzare questa configurazione? E’ facilissimo!
Ovviamente suppongo che su my.workplace.com abbiate a disposizione una macchina con una distribuzione GNU/Linux, nel mio caso Ubuntu (con Windows si potrebbe pure fare, ma… non mi interessa :)).
Dando per scontato che il server SSH su my.home.it funzioni correttamente, operiamo sulla macchina my.workplace.com.
Cominciamo aprendo un terminale (konsole, xterm o equivalenti).
Prima di tutto dovete sapere verso quale server volete connettervi e la porta (in questo caso other.server.com_, porta 25 perchè ipotizziamo che sia un server di posta in uscita).
Per conoscere l’IP e la porta giusta potete avviare il programma bloccato (che comunque al momento non potrà connettersi) e lanciare il comando netstat, in questo modo:
$ sudo netstat -vatnp
SENT 9334/kmail
….
tcp 0 1 172.28.200.105:36687 89.238.64.166:25 SYN
….
e cercare la riga corrispondente al programma (guardando l’ultima colonna). Nella quinta colonna c’è quello che cercate, cioè l’indirizzo IP e la porta al quale state tentando di connettervi (IP 89.238.64.166, porta 25).
Poi…
$ sudo iptables -t nat -A OUTPUT -d 89.238.64.166 -j DNAT --to 127.0.0.1 [sudo] password for user: ******* $ sudo ssh -L 25:89.238.64.166:25 username@my.home.it username@my.home.it's password: *********
NB: nella mia macchina ho Ubuntu, quindi ho dovuto utilizzare sudo per eseguire quei comandi con i permessi di amministratore. Nelle altre distribuzioni dovrete semplicemente eseguire i suddetti comandi come utente root.
Il primo comando dice al sistema operativo di effettuare una deviazione di tutti i pacchetti diretti al server esterno, rinviandoli invece alla macchina locale (127.0.0.1) che, non passando dal firewall, risulterà raggiungibile sulla porta 25.
Il secondo comando avvia finalmente il tunnel SSH, aprendo la porta 25 in ascolto su localhost, collegata tramite il tunnel (quindi, tramite il computer my.home.it) alla porta 25 del server esterno other.server.com :)
NB: nel caso in cui la porta 22 (quella di SSH) risultasse anch’essa bloccata, sarà necessario modificare la configurazione del server SSH su my.home.it, mettendolo in ascolto su una porta che è possibile raggiungere da my.workplace.com.
Adesso potete lanciare il programma che precedentemente risultava bloccato e… magia! :)
Sicuramente la velocità non sarà quella di una linea ADSL, perchè sarà comunque limitata dalla banda in upload disponibile su my.home.it.
Inoltre questa tecnica non può funzionare con i programmi peer to peer, come Bittorrent o eMule, perchè sebbene si colleghino ad un server unico per ottenere le informazioni sui file da scaricare (nel caso dei torrent il server si chiama tracker), il resto della comunicazione avviene da e verso una miriade di altri computer (i peer), di cui è impossibile prevedere l’indirizzo IP.













Questo tuo post cade a fagiuolo.. :P Abbiamo i pc che possono collegarsi soltanto ad un determinato sito. Gli altri sono interedetti da un proxy…che palle..Domanda forse cretina. Ma l’amministratore della rete è in grado di capire facilmente se abbiamo aperto un tunnel ssh ? P.S. Non vorrei che mi incoccino.. :P
Beh… si vede traffico criptato (un vantaggio di SSH è proprio questo) verso un IP privato… potrebbe essere qualsiasi cosa.
L’admin non può andare oltre, perchè sarebbe violazione della privacy!
Non mi dire che ora non ci sarai? :-)
http://palermo.blogolandia.it/2009/01/21/domani-a-palermo-per-la-consegna-della-nostra-petizione/
Due osservazioni forse banali:
1) Se sono a lavoro, molto probabilmente non ho i diritti di amministrazione, dal momento che in ogni caso le policy di rete sono, o dovrebbero essere, che un utente normale non ha a disposizione la pwd di amministratore.
2)Hai detto che un amministratore non può andare oltre il controllo del traffico, ma è anche vero che se ha motivo di sospettare una connessione crittata non aderente alle policy ha il diritto di sospenderla, e probabilmente anche di fare verifiche.
Sì, è vero :)
Nel mio caso avrei il mio portatile personale collegato alla rete aziendale, quindi potrei farlo.
Le verifiche che può fare un amministratore si limiterebbero a constatare la presenza di traffico criptato… ma come distinguerlo da una sessione SSH o SFTP? In nessun modo si potrebbe decifrare il contenuto del flusso dati.
Ciò non toglie che l’admin può chiudere tutte le porte in uscita e far passare da un proxy ben configurato soltanto le connessioni HTTP, e allora ci sarebbe poco da fare.
Ciao, volevo chiederti se è possibile effettuare tutto questo senza avere un server ssh proprio; perchè io non ho la possibilità di avere un altro pc connesso.
esiste altrimenti un altro modo?
@lorenzo: ciao! :) il server SSH esterno devi averlo obbligatoriamente, altrimenti il tunnel SSH non può essere avviato (mancherebbe uno dei capi del tunnel).
L’unica alternativa che non prevede un proprio server di appoggio sarebbe l’utilizzo di un proxy SOCKS o un proxy HTTP… se ne trovano a centinaia su Internet, anche anonimi, addirittura in comode liste ( ad esempio: http://www.samair.ru/proxy ).
bye e grazie per la visita! :)