security ssh linux security proxy hack

SSH Dynamic Port Forwarding

Ossia: come ho superato la Grande Muraglia digitale

La settimana scorsa sono stato a lavorare in Cina, precisamente al salone dell'auto di Shanghai. E ho avuto a che fare con la nuova Grande Muraglia Cinese, cioè il sistema di firewall che blocca del tutto alcuni siti stranieri e filtra in modo più o meno serio tutti gli altri. Non credevo che per me sarebbe stato un problema, non facendo propaganda antiregime, quindi avevo sottovalutato la questione. Ma quando mi sono connesso alla rete dell'albergo, mi sono trovato subito in difficoltà: volevo comunicare con la mia ragazza tramite facebook, niente. Volevo scrivere un tweet, niente. Anche la sensazione che le mie ricerche in google fossero controllate mi metteva a disagio. Così ho provato a collegarmi al server aziendale e a quello di casa tramite secure shell. Funzionava!

La questione è semplice: quando hai una connessione ssh verso un computer remoto, è praticamente come essere lì veramente, perché puoi fare tutto. Quindi, se la grande muraglia non bloccava la mia connessione ssh verso l'Italia, potevo usare internet come se fossi seduto nel mio ufficio, cioè senza censura.

In aggiunta, potevo godere della stessa privacy che c'è in Italia (sempre che ci sia) senza preoccuparmi che qualche funzionario cinese stesse controllando la mia attività online: l'algoritmo AES usato da ssh è così sicuro che viene usato dal governo americano per secretare i dati. Non è inattaccabile, ma la potenza di calcolo necessaria ad attaccarlo lo rende praticamente sicuro al cento per cento.

Unico aspetto negativo della soluzione ssh è che tutto quello che io scarico, deve passare per il server in Itala, che non ha molta banda in upload. Avrei potuto anche appoggiarmi ad un server ssh in qualche webfarm, ma per l'utilizzo che dovevo farne io andava benissimo il server dell'ufficio.

Quindi, in pratica, stavo creando un tunnel ssh, attraverso il quale far passare tutto il traffico necessario a vedere i siti (http, https, dns...). La procedura è semplice, ma ora la vediamo nel dettaglio.

SOCKS proxy con Chromium e SSH

Un tunnel ssh permette di far passare del traffico non criptato attraverso una strada criptata, cioè completamente opaca all'osservatore esterno. In questo caso, voglio che il traffico http e dns utilizzato dal browser risulti invisibile al firewall che si occupa di filtrare i siti. Posso utilizzarlo solo perché è permessa la connessione a una porta remota qualsiasi. In un sistema più protetto, questo tipo di connessione non sarebbe possibile, o al massimo sarebbe permessa solo la connessione alla porta 443 (usata da https). È per questo motivo che uso spesso la porta 443 come server ssh.

Ci sono vari modi per far passare il traffico generato dal browser attraverso il tunnel, ma il più semplice è sicuramente il Dynamic Port Forwarding usando il protocollo SOCKS.

Il Dynamic Port Forwarding permette di configurare un porta locale per passare i dati verso varie destinazioni remote attraverso un unico tunnel. In pratica, il client locale (es: browser) utilizza il protocollo SOCKS per dire ad un proxy remoto (es: server di casa) a quali destinazioni remote far andare il traffico dati una volta arrivato dall'altra parte.

Mettiamo di avere l'account username nel server my-server, per cui riesco a connettermi semplicemente con il comando ssh username@my-server, allora posso attivare il Dynamic Port Forwarding con questo comando:

ssh -D 9999 username@my-server 

L'opzione -D 9999 specifica di attivare il port-forwaring locale dinamico a livello di applicazione. Funziona allocando un socket che ascolta alla porta specificata nella macchina locale. Ogni volta che viene attivata una connessione a questa porta, la connessione viene inoltrata attraverso il tunnel e il protocollo SOCKS è utilizzato per determinare a chi connettersi dall'altra parte. In questo caso è proprio ssh che fa da SOCKS server.

Un server SOCKS è un particolare tipo di proxy che permette di effettuare connessioni TCP dirette (e, dalla versione 5, di veicolare traffico UDP) tra computer su due reti IP differenti nei casi in cui un instradamento diretto ( routing) non sia disponibile. (Wikipedia)

È possibile aggiungere due ulteriori opzioni al comando, per fare in modo che vada in background e non apra una shell nel computer remoto:

ssh -D 9999 username@my-server -Nf

L'opzione -N dice di non eseguire un comando remoto (quindi di non aprire un terminale remoto), mentre l'opzione -f chiede a ssh di andare in background immediatamente dopo aver aperto la connessione.

Eventualmente, se il server ssh usa una porta diversa dalla 22, possiamo specificarne un'altra, per esempio con -p 443.

Ora che abbiamo creato il proxy SOCKS, dobbiamo usarlo. Io uso il browser opensource Chromium, ma lo stesso comando funziona anche con Chrome.

chromium-browser --proxy-server="socks://localhost:9999"

È possibile anche configurare il programma dalle opzioni, ma trovo più comoda questa modalità. Infatti, cambiando le impostazioni, chrome cambia le configurazioni di tutto il sistema, quando invece a me interessa solo che siano diverse per chrome.

Addirittura posso utilizzare due istanze dello stesso programma, una che usa il proxy, l'altra che non lo usa. Ho trovato molto utile questa cosa in albergo, perché il servizio internet offerto prevedeva che ci fosse sempre una pagina aperta nel "sito" locale, altrimenti la connessione sarebbe caduta entro pochi minuti.

Con questo comando, si crea una nuova istanza di chromium (o di chrome), con delle opzioni tutte sue. Nella seconda istanza non ci sono le estensioni, i preferiti e tutte le personalizzazioni che ci sono nel Chromium normalmente utilizzato:

chromium-browser --user-data-dir=~/.config/chromium-alt

Possiamo specificare una qualsiasi altra cartella, io preferisco utilizzare questa, perché quella predefinita è in ~/.config/chromium, quindi mi sembra plausibile che quella alternativa si trovi in ~/.config/chromium-alt.

Per essere sicuri che tutto abbia funzionato, possiamo visitare un sito che ci dica qual è il nostro indirizzo IP attuale, per esempio ipreal.org. Se visualizza lo stesso ip che ha l'host my-server, allora abbiamo fatto!

Attenzione! Quello che ho scritto in questo articolo è puramente a scopo informativo. Utilizzare questa procedura in un paese in cui è illegale, può portare a conseguenze poco simpatiche. Lo stesso vale per aziende o scuole che non lo permettono da regoloamento.

In questo articolo ho spiegato come fare il dynamic port forwarding, utilizzando linux comunque un sistema operativo *NIX-Like. Si può fare anche con Windows, ma diventa un attimino più complicato. In questo articolo è spiegato abbastanza bene come si può fare utilizzando PuTTY.

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus