Andrea Beggi

I'm brave but I'm chicken shit.

Aggirare un firewall con il port forwarding dinamico

A T T E N Z I O N E ! Questo post ha piu' di sei mesi. Le informazioni contenute potrebbero non essere aggiornate.

Scenario 1: siamo connessi ad internet tramite un firewall con politiche restrittive che non permette il traffico verso i server di cui abbiamo bisogno e/o verso alcuni siti web.

Scenario 2: siamo connessi ad internet tramite una rete non fidata (internet cafè, lanparty, hackmeeting) e sospettiamo che il nostro traffico possa essere sniffato da qualche malintenzionato.

In questi casi, avendo a disposizione un account su un server SSH pubblico raggiungibile su una qualunque porta (anche diversa dalla stardard TCP/22) possiamo utilizzare il dynamic port forwarding, un sistema particolarmente comodo di veicolare traffico criptato bypassando eventuali restrizioni.

Il port forwarding dinamico (dynamic port forwarding) è un meccanismo trasparente che supporta il protocollo SOCKS4 o SOCKS5. Invece di configurare un port forwarding da porte specifiche dell’host locale verso porte specifiche del server remoto, esso permette di specificare un server SOCKS che può essere utilizzato dalle applicazioni. Il Client SSH apre una porta sull’host locale e simula un server SOCKS per ciascuna delle applicazioni opportunamente configurate. Quando queste applicazioni devono connettersi a servizi come HTTP, FTP, POP3, SMTP ecc., esse “parlano” al client SSH che simula un server SOCKS e crea un port forwarding verso il server SSH remoto, al quale inoltra il traffico crittografato dal protocollo SSH.

In pratica tutto il traffico in uscita dalle applicazioni configurate per usare il server SOCKS locale viene incapsulato nella connessione SSH verso il server remoto, da dove esce e viene poi veicolato verso i server di competenza. Per effetto di questo meccanismo otteniamo il duplice risultato di bypassare le eventuali regole restrittive del firewall (in quanto la connessione in uscita è solo verso il server SSH), e di criptare tutto il traffico dal client fino al server SSH, nascondendolo agli sguardi indiscreti.

Il requisito principale è un accesso shell via SSH a un server che possiamo raggiungere: potrebbe essere anche un computer a casa che abbiamo configurato per essere raggiungibile dall’esterno con varie tecniche, ad esempio DynDNS. Praticamente tutte le distribuzioni linux contengono OpenSSH, disponibile anche per Windows e su OS/X si abiliterà il login remoto. Il giochino funziona anche se avete un account su un server di un provider che fornisce una shell SSH, ad esempio DreamHost, e riuscite a raggiungerlo dalla vostra posizione. I client sono Putty per Windows e nativi negli altri casi.

Putty può essere usato tramite linea di comando o interfaccia grafica. La sintassi per la linea di comando è la seguente:

putty -ssh -D 9999 -P 80  serverssh.dominio.com

dove:

  • -ssh indica usare il protocollo SSH.
  • -D 9999 indica al client di ascoltare sulla porta 9999/TCP. Potete utilizzare qualunque porta libera sul vostro client: controllate con netstat -an -p TCP | findstr LISTENING (Windows) o netstat -an -p TCP | grep LISTEN (OS/X e linux).
  • -P 80 identifica la porta sulla quale è in ascolto il server SSH remoto. Se è la default TCP/22 non serve indicarla.
  • serverssh.dominio.com è il nome del server SSH. Si può usare anche l’indirizzo IP.

Se si usa l’interfaccia grafica bisogna stabilire una normale connessione, poi aggiungere un tunnel nel menu Connection –> SSH –>Tunnels compilando il campo “Source port” (la porta locale di ascolto),  lasciare vuoto “Destination”, scegliere “Dynamic” e cliccare su “Add”

La sintassi per linux e OS/X è:

ssh -D porta_locale utente@serverssh

Una volta autenticati e stabilita la connessione si può minimizzare la finestra della console senza chiuderla e passare alla configurazione delle applicazioni. In Windows si possono utilizzare tutte quelle che supportino l’utilizzo di un server SOCKS. Praticamente tutti i browser lo fanno e molti altri programmi hanno il supporto, per esempio Pidgin.

In Firefox la configurazione si fa tramite il menu Strumenti –> Opzioni –> Avanzate –> Rete  –> Impostazioni –> Configurazione manuale del proxy –> Host SOCKS e si specifica “localhost” (o 127.0.0.1) e la porta locale sulla quale ascolta il client SSH (9999 nell’esempio qui sopra).

Una comoda alternativa è rappresentata da una categora di tool chiamati socksifier, che permettono a qualunque applicativo di connettersi all’esterno tamite SOCKS. Uno dei più utilizzati per Windows è gratuito e si chiama WideCap. Su linux si può usare tsocks, avendo cura di modificare prima il file /etc/tsocks.conf specificando 127.0.0.1 nella variabile “server” e la porta desiderata in “server_port”.  Per OS/X il supporto è nativo: Preferenze di sistema –> Network –> scegliete l’interfaccia con la quale siete collegati ad internet –> Avanzate –> Proxy –> Abilitare “Proxy SOCKS” e compilare i capi “Server” (localhost) e porta (quella scelta precedentemente). In questo modo tutte le connessioni uscenti da quella scheda di rete transiteranno attraverso il proxy SOCKS, e non ci sarà bisogno di toccare la configurazione delle applicazioni poiché il meccanismo è completamente trasparente.

Questo è un breve screencast che mostra come utilizzare Putty e Firefox per ottenere un port forwarding dinamico.

(Utilizzate questi metodi con giudizio: bypassare le policy di sicurezza aziendali vi potrebbe mettere nei guai.)

13 Commenti

Qale | #

se, per accedere ad internet, c’è di mezzo un proxy?

Valerio | #

Un altro metodo, più semplice come utilizzo, ma più complicato come setup è quello di utilizzare OpenVPN: si installa un OpenVPN server su un server, preferibilmente linux, cui si ha accesso (può essere il proprio PC di casa o addirittura il proprio router di casa con OpenWRT) e poi si installa un OpenVPN client con GUI sul proprio PC. Il client OpenVPN può utilizzare un http proxy server per stabilire la connessione. L’unica cosa importante è che il server OpenVPN usi il TCP e risponda alla porta 443 o 80 che sono quelle che l’http proxy server permette di utilizzare con certezza. E’ ovviamente necessario anche configurare il routing/NAT sul server OpenVPN.
Ho utilizzato questa configurazione, non per aggirare policy aziendali, ma per per configurare alcuni software aziendali del cavolo scritti con i piedi che volevano per forza un accesso pieno ad Internet.

Giorgetto | #

Quindi, giusto per capire, configurando il mio accont di dreamhost, posso permettermi di accedere a Hulu?

Fabio | #

Ciao Andrea.
Volevo farti i complimenti per il blog e ringraziarti per i tutorial che seguo sempre con attenzione. Questo articolo mi è servito un bel po’ in quanto avevo già provato a fare un port forwarding usando PuTTY ma senza successo.
Continua così! 😉

Ciao!

Emilio | #

C’e’ un problema: se il mio firewall aziendale blocca la porta 22, addio…putty non si connette. mi puo confermare o smentire?

Emilio | #

ah dimenticavo, esiste un server ssh gratuito?
io ho provato con la societa’ di hosting alwaysdata.com,
supporta ssh ma non funziona. credo sia per il fatto che
la porta 22 e’ bloccata dal firewall aziendale.
messaggio: “connection refused”

Ho l’impressione che mi tocchera’ usare il pc di casa.

Grazie

Andrea | #

Volevo fare una domanda..ma cercando la parole per farmi capire ho trovato la risposta… 😉

WM | #

Per lo scenario 2, da iPhone ho risolto creando una VPN IPsec. Sul pix ho configurato un accesso VPN Client standard (senza split). Così scarico la posta tranquillo da qualsiasi wifi open 🙂

Fabio | #

Ragazzi,

Mi serve di modificare il mio php.ini che è situato sul mio nas. Mi potete dare una mano a come arrivarci con putty ???’ Devo modificare le porte per poter inviare l’email in fase di registrazione fatta con php. Mi servirebbe con urgenza una risposta, grazie.

La mia email è: paperinik4@gmail.com

alessandro | #

ma perchè il firewall non dovrebbe filtrare ssh a monte ?
cosa mi sfugge?