Featured Posts

:: syscallme :: Rss

Corkscrew: tunneling ssh attraverso un proxy HTTP/HTTPS

Posted on : 21-07-2010 | By : daniele | In : Experience, Linux, Simple

Tags: , , ,

7

E’ effettivamente molto tempo che non scrivo più un post tecnico, un how-to, una guida o qualcosa che ci somigli. Lo ametto, un po’ queste pagine mi mancavano. Mi sono chiesto cosa raccontarvi, ce ne sarebbero in realtà di cose, ma cerco sempre di trovare argomenti che siano sì interessanti, ma anche “sfiziosi”, che raccolgano le attenzioni di un pubblico vasto, che rispondano ad esigenze specifiche.

E allora ho pensato: perchè non raccontare come garantirsi una connettività ssh anche quando sembra impossibile?

Lo scopo di questo post è dare le indicazioni necessarie per permettere alla propria Linux-box di raggiungere in ssh qualsiasi server sparso nel pianeta, anche nella situazione più scomoda del mondo. Quando, cioè, la nostra connettività è sottomessa ad un cattivissimo proxy che ci lascia libere solo le porte HTTP e HTTPS in uscita. Per farlo eseguiremo un tunneling ssh attraverso il nostro maledettissimo proxy, e sfrutteremo un softwarino open piccolo piccolo ma potente potente: Corkscrew.

Un po’ di teoria (semplificata)

Probabilmente sappiamo tutti cos’è un proxy e come funziona. Se qualcuno avesse dei dubbi, può dare un’occhiata alla pagina relativa su Wikipedia. Molto spesso, essere dietro ad un proxy HTTP, vuol dire dover rinunciare a tutti i flussi comunicativi che non siano, appunto, flussi HTTP o HTTPS. Il che si traduce in una semplice affermazione:

qualsiasi tentantivo di connessione verso l’esterno diretto verso porte diverse dall’80 (HTTP) e dalla 443 (HTTPS) risulteranno bloccati dal proxy.

Come sappiamo, quando provo a loggarmi in ssh su un server remoto, sto provando ad istanziare una connessione sulla porta 22 di questo server. Ovviamente il proxy HTTP non mi farà passare. Come risolvere questo problema?

Diciamo che la soluzione che mi sono divertito a trovare non è proprio “a basso impatto”!! Nello specifico si tratta di utilizzare (e quindi di base di avere a disposizione…) un “server ponte”, sul quale settare SSH in listening sulla 443.

La 443 è la porta dell’HTTPS. L’HTTPS è consentito generalmente da un classico proxy HTTP. Di conseguenza, istanziando una connessione ssh sul nostro “server ponte”, stiamo materialmente chiedendo al nostro proxy di far passare un flusso dati destinato ad una porta che lui considera abilitata.

Questo è il nostro ambiente, questo è quello che spiegheremo di seguito.

Due parole su Corkscrew

Corkscrew è, banalmente e semplicemente, un software che permette la realizzazione di tunnels ssh attraverso proxies HTTP. La sua home page è questa: http://www.agroman.net/corkscrew. Se utilizzate Debian o Ubuntu (server o desktop non fa differenza) ve lo trovate già pacchettizzato. Altrimenti dovrete attrezzarvi e compilarlo, ma non è certo un lavorone. Nel nostro caso utilizzeremo come “distribuzione-esempio” Ubuntu Lucid Lynx 10.04 LTS.

La configurazione di Corkscrew è veramente semplice e consta di un file config che va posizionato all’interno della cartella .ssh che ogni utente linux dovrebbe avere nella sua $HOME.

Iniziamo a lavorare

Configuriamo il server ponte

Cominciamo dal nostro “server ponte” Qui dovremmo mettere SSH in ascolto sulla 443. Non lo togliamo, però, dalla porta 22 perchè può sempre tornare utile!

Per fare ciò è sufficiente aprire il file /etc/sshd/sshd_config ed aggiungere la seguente stringa:

Port 443

sotto la dichiarazione (uguale peraltro) relativa alla porta 22. Restartate SSH

root@ubuntu-server:~# /etc/init.d/ssh restart
* Restarting OpenBSD Secure Shell server sshd
...done.

e il gioco è fatto. Con un piccolo netstat vedremo che SSH è correttamente in LISTENING sulla porta 443.

root@ubuntu-server:~# netstat -natp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      16680/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      10661/exim4
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      16680/sshd
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      11369/mysqld
tcp6       0      0 :::80                   :::*                    LISTEN      3895/apache2
tcp6       0      0 :::22                   :::*                    LISTEN      16680/sshd
tcp6       0      0 :::443                  :::*                    LISTEN      16680/sshd

Come potete vedere nella terza riga, SSH aspetta la nostra connessione sulla porta 443. Perfetto! Ora procediamo a configurare il client.

Configuriamo il nostro client

Sul nostro client, anzitutto, scarichiamo corkscrew. Può bastare un colpetto di apt-get…

root@ubuntu-client:~# apt-get install corkscrew

Una volta concluso download ed installazione del pacchetto entriamo nella nostra directory .ssh

root@ubuntu-client:~# cd .ssh

e qui creiamo il nostro file “config”

root@ubuntu-client:~/.ssh # vi config

che conterrà due righe due

Host my.serverponte.com
ProxyCommand corkscrew my.proxy.local 8080 %h 443

Ovviamente sostituite “my.proxy.local” con l’indirizzo o il FQDN del vostro proxy e 8080 con la porta sulla quale esso è in listening. Una volta fatto ciò il gioco è fatto. Dalla vostra shell digitate

root@ubuntu-client:~# ssh root@my.serverponte.com

Una volta che siete lì…siete dappertutto!!!

E se il mio proxy necessita di credenziali???

A volte può accadere che sia necessario inserire delle credenziali per accedere al proxy. In quel caso è necessario scrivere quelle credenziali in un authfile. Creiamolo:

root@ubuntu-client:~# vi ~/.ssh/authfile

e scriviamo all’interno le nostre credenziali, prima la username, poi la password separate da un “:”. In questo modo

username:password

Per farlo leggere al file config è necessario aggiungere alla seconda riga del config la path (anche relativa) dell’authfile. Il config diventerà quindi:

Host my.serverponte.com
ProxyCommand corkscrew my.proxy.local 8080 %h 443 authfile

Nel nostro caso, dato che l’authfile si trova esattamente allo stesso livello del file config può bastare inserire solo il nome del file.

Ok anche qui il gioco è fatto. Un colpetto di ssh sul serverponte e siete fuori!

ATTENZIONE!!!

Attenzione:  tutte le indicazioni date sopra potrebbero non essere valide (quindi non funzionare!) se il vostro è un proxy NTLM. In quel caso dovrete utilizzare corkscrew in combinazione con NTLMAPS. Ma questa è un’altra storia…che forse scriverò! :D

Enjoy!

Comments (7)

Complimenti per l’articolo, mi è piaciuto molto e penso possa servire in diverse occasioni. L’unica problema penso sia quello di avere un server ssh ponte in attesa sulla porta 443.

Volevo inotre fare giusto un paio di domande:
1) il file config dentro la cartella ~/.ssh da chi viene letto? Dal cliente ssh?
2) Le due direttive Host my.serverponte.com
ProxyCommand corkscrew my.proxy.local 8080 %h 443 valgono solamente ovviamente sempre dal momento in cui le impostiamo. E’ sufficiente commentarle nel caso in cui non siamo più dietro al proxy?

Ciao ciao.

Ciao, grazie per i complimenti. Mi rendo conto che non è facile avere sempre a disposizione un server ponte, però è anche vero che con una qualsiasi ADSL (che non sia fastweb) ci danno un IP pubblico al quale possiamo attaccare una bella linux-box da battaglia e a quel punto il gioco è fatto.
Cerco poi di rispondere alle tue domande:
1) si il file config viene letto dall’ssh client. Non è un file di config relativo a corkscrew, ma ad openssh. Effettivamente non l’ho specificato per bene. Farò un upgrade del post :)
2) si ovviamente è una configurazione che vale sempre quando vuoi raggiungere quel FQDN o IP a cui corrisponde quel server. Quando non sei più sotto proxy, basta commentarle o rinominare il file ed è tutto come prima.

Ciao e grazie!
Daniele

OK, grazie a te Daniele… non appena ne avrò l’occasione lo testerò.
In realtà ho un server dedicato dove posso abilitare anche il server ponte… devo solo vedere se Apache sta attualmente usando la porta 443.

Alla prossima!

Ho utilizzato anch’io corkscrew, fino a quando ho poi conosciuto il tool “Shellinabox”. Si installa e configura solo lato client, e non serve fare altro.
Mi sembra che ne esista il file .deb per architettura intel, io invece ho dovuto compilarmelo sotto la mia debian-arm.
Da provare

Ciao,
rettifico quanto scritto in fretta e furia questa mattina.
Shellinabox e corkscrew non sono strumenti simili.
Corkscrew come tu spiechi è un tool per realizzare del tunneling, shellinabox è poco più (o poco meno) di un webserver che mette a disposizione una shell ssh interattiva.
Sono pertanto cose diverse.
Tuttavia io (come nel tuo esempio) utilizzavo corkscrew per raggiungere la mia linux box dietro al proxy aziendale. Nell’azienda in cui lavoro ora il proxy è coosì restrittivo da far cadere anche le richieste di corkscrew, che diventa quindi inutilizzabile.
Inoltre corkscrew richiede del lavoro anche lato client.
Shellinabox invece si installa solo sul server (ecco la rettifica) e non richiede altro, tranne che una connessione internet lato client con aperte le porte 80 o 443.
Meraviglioso, se quello che serve è solo una shell ssh…
Saluti,
Andrea

@fabbro: non ho mai usato Shellinabox. Ho usato guacamole. Sarà oggetto di un prossimo post :)

[...] Utilizzandola avrete la possibilità di accedere al server sul quale è installata da un comunissimo browser compliant con gli standard HTML5; da lì, avrete il “possesso” completo della vostra macchina, come se foste in console e…beh,  al diavolo il proxy HTTP che vi blocca le connessioni SSH (tanto per fare un piccolo riferimento al mio post precedente)! [...]

Write a comment