Progetto irctunnel: collegare 2 host dietro NAT senza il port forwarding, over IRC.

Se ignoriamo le tecniche di TCP hole punching et similia, possiamo affermare che: tra 2 host dietro NAT, senza che almeno uno dei due host disponga di porte forwardate dal router, il collegamento tra i due è impossibile. L’ unica via sta nel disporre di un terzo host che può ricevere connessioni su porte in ascolto senza rotture ulteriori, che svolga il compito di “macchina nel mezzo”. Nella realtà si potrebbe ad esempio affittare un VPS oppure utilizzare il servizio ngrok. Nel caso del VPS questo ha inanzitutto un costo ma il punto centrale è che bisogna registrarsi e questo non lo vogliamo. L’ idea è sfruttare un server IRC che si offra come ponte tra i due host anzi tra i due client. E’ noto che i server IRC sono limitati a smistare dati alfanumerici e non dati binari ma vedremo come superare questo limite. Vediamo come funziona:

Diciamo che esistono 2 programmi: uno gira sul client 1 e l’altro sul client 2.

Il programma che gira su client 1 mette in ascolto una porta e contemporaneamente si collega a un server IRC e entra in un chan e avrà un proprio nick.

Il programma che gira su client 2 si collega allo stesso server IRC, ed entra nello stesso chan e avrà un altro nick.

Client 1 vuole stabilire una connessione su client 2 diciamo un collegamento SSH.

Client 1 lancia il client SSH specificando come host localhost e come porta la porta aperta precedentemente dal programma.

A questo punto il programma su client 1 comunica via IRC con il programma su client 2 e chattando in privato gli ordina di collegarsi in localhost al servizio SSH.

Il client SSH su client 1, inizierà a inviare dati al programma che gira in locale su client 1.

Il programma su client 1, codifica i dati ricevuti dal client SSH in base64 (alfanumerici) e gli invia mediante chat privata al programma su client 2.

I dati ricevuti dal programma 2 su client 2 verranno decodificati da base64 e verranno inviati al servizio SSH locale.

E così via.

Naturalmete bisognerà creare un protocollo over IRC ad hoc poichè i due programmi dovranno scambiarsi: i comandi, gli stati della connessione e naturalmente i dati. C’è da osservere che la codifica base64 appesantisce la comunicazione poichè per 3 byte binari ne dovranno essere inviati 4 in base64.

Aggiornamento del 06/01/2015.

Quest’ idea è già stata implemantata in python, questi sono i sorgenti.

Annunci
Questa voce è stata pubblicata in Senza categoria. Contrassegna il permalink.

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...