DNS tunneling

05Feb11

Qualche volta può capitare di trovarsi, per vari motivi, collegati ad una rete wifi o cablata che è in qualche modo connessa ad Internet, ma non ci potete accedere direttamente.

Se sulla stessa rete c’è un server DNS, oppure vi è permesso in generale effettuare connessioni su Internet ma solo verso server DNS, iodine potrebbe fare al caso vostro. Iodine è infatti un programma, composto da una parte server-side e una parte client-side che vi permette di stabilire un tunnel di scambio dati, basato sull’invio e la recezione di richieste DNS. Le possibilità sono due:

Rete che permette connessioni verso server DNS arbitrari

Cioè stiamo parlando di una rete in cui i dati che voi mandate su internet vengono filtrati e accettati solo se sono diretti alla porta UDP 53 di qualche server, oppure se una volta analizzati risultano richieste di tipo DNS.

In questo caso la questione è abbastanza semplice. Andiamo su un nostro server con indirizzo pubblico e lanciamo

iodined -f 10.0.0.1 dominio.test

Ci sarà richiesta una password, che sarà poi utilizzata per autenticarci nel tunnel (è una protezione molto blanda, non fateci troppo affidamento); il “dominio.test” in questo caso non ha rilevanza e può essere qualunque cosa (purché poi lo si usi uguale sul client), vederemo nel prossimo esempio a cosa serve.
Sul server sarà creata una interfaccia di tipo TUN con nome “dns0”, che avrà indirizzo 10.0.0.1 come specificato dal parametro passato

A questo punto andiamo sul client e lanciamo il programma che si collegherà a iodoned sul nostro serve e farà viaggiare i pacchetti sulle richieste DNS

iodine -f 123.456.789.10 dominio.test

Dove 123.456.789.10 è l’ip del nostro server, che in questo caso farà da “finto” server dns. Ci sarà richiesta la password e inseriamo la stessa di prima. Il programma procederà poi a calcolare la dimensione dei pacchetti da utilizzare per la comunicazione andando a tentativi.
Ovviamente anche sul client avremo una interfaccia “dns0” con il relativo ip, probabilmente successivo a quello del server, quindi 10.0.0.2

Io in diversi test la rete 10.0.0.0 l’avevo già occupata, e per non fare confusione ho utilizzato la 172.16.0.0

Rete che permette connessioni verso un unico server DNS

Siete in una rete da cui non potete in nessun modo accedere ad internet, però con qualche colpo di nslookup vi accorgete che il DNS della rete locale/DNS predefinito assegnato dal dhcp, vi risolve qualunque indirizzo.
Anche qui iodine vi da una comoda mano, ma questa volta bisogna aggiungere alcuni dettagli.

Questa volta il tunnel funzionerà in modo diverso: non vi collegherete infatti direttamente all’altro capo, ma dovrete passare sempre per l’intermediario che è il server DNS della rete locale.

Supponiamo di avere un dominio mydomain.com , possiamo andare nel pannello di amministrazione del nostro dominio impostiamo che ad esempio tutte le richieste dirette a test.mydomain.com  e i relativi sottodomini vadano inoltrate a un certo server, che le gestirà.
Questo è possibile realizzarlo mediante un record di tipo “NS” nella tabella dei record del nostro dominio.

Magari abbiamo due record di questo tipo:

myserver       A       123.456.789.10
test       NS       myserver.mydomain.com.

In questo modo, se chiediamo al server DNS nella nostra rete locale di risolvere l’indirizzo aaaaaa.test.mydomain.com, lui andrà a vedere i record del dominio mydomain.com e noterà che test.mydomain.com viene affidato tramite NS ad un altro server, quindi contatta infine il server myserver.mydomain.com per richiedergli quale sia l’indirizzo associato a aaaaaa.test.mydomain.com .
Ovviamente nelle risposte il server potrà inserire tante informazioni, e dentro lì “nasconderà” i dati da inviare al client dall’altra parte del tunnel.

Supponiamo allora di aver impostato i nostri record del dns come mostrato sopra. A questo puto ci basterà rifare lo stesso comando dato prima sul server, con l’opportuno dominio:

iodined -f 10.0.0.1 test.mydomain.com

E allo stesso modo sul client:

iodine -f 123.456.789.10 test.mydomain.com

È importante in questo caso ricordare che appena possibile il DNS della nostra rete locale tenterà di fare la cache di quello che può, quindi se sbagliamo a impostare i record DNS e glieli facciamo risolvere, anche se poi li sistemiamo lui probabilmente avrà in cache ancora quelli errati.

Qualche volta non si capisce niente se sta funzionando o meno il tunnel, quindi i creatori di iodine hanno messo a punto una comoda pagina, in cui se inserite il vostro dominio di tunnel, loro tenteranno di collegarvisi e comparirà sulla pagina stessa se è funzionante o no. Eccola: http://code.kryo.se/iodine/check-it/

Suggerimenti

Uscire su Internet

“Sì, ok ho fatto tutto, ma ora? Posso solo fare il ping del mio host remoto, non posso uscire su Internet!”

Beh, poco ci vuole, basta che sul server preparate una NAT:

echo “1” > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE

Se avete la policy DROP sulla chain FORWARD di iptables dovete aggiungere anche:

iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT

iptables -A FORWARD -d 10.0.0.0/24 -j ACCEPT

Mentre invece sul client dovremo prima aggiungere una regola statica di routing per il DNS della rete locale (altrimenti salta il tunnel quando cambiamo le route) e poi togliere la default e aggiungere la nuova:

route add IP_DNS_RETE_LOCALE gw GATEWAY_LOCALE

route add default gw 10.0.0.1

Abbiamo ipotizzato fino ad ora che il server DNS della rete locale risolva qualunque cosa, quindi non vi servirà cambiarlo, se volete farlo allora è consigliabile specificare l’ip del server dns della rete locale a iodine.

Sicurezza

La sicurezza della password per accedere al tunnel, come già detto è molto blanda. Se non ci sono eccessivi cali di prestazioni vi consiglio di non seguire quanto detto prima per uscire su internet e mettere una VPN sul vostro server ed uscire su internet una volta effettuato l’accesso a quella.

Versioni incompatibili

Fate molta attenzione alle versioni di iodine su server e client, se sono release di date molto diverse potrebbe non funzionare nulla!
Per controllare la versione lanciate (ovviamente):

iodine -v

Annunci


2 Responses to “DNS tunneling”

  1. Anche stavolta un lavoro ben curato.
    Ottimo tutorial 😉

  2. Veramente molto utile questo post, mi è servito molto per capire la dinamica del DNS tunneling; se posso fare un appunto consiglierei un tunnel ssh che, oltre che essere molto più sicuro, può velocizzare il collegamento!
    Complimenti comunque, davvero molto utile


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...


%d blogger hanno fatto clic su Mi Piace per questo: