I comuni proxy server implementano soltanto alcuni servizi, (HTTP, posta, etc.), ma servizi come ad esempio IRC, Telnet non sono da loro implementati, quindi essi non possono essere utilizzati verso l'esterno da host che risiedono all'interno di una rete locale protetta da firewall. SOCKS [16] consente proprio di permettere a queste applicazioni client di comunicare verso l'esterno. Il protocollo SOCKS si compone di un SOCKS server ed un SOCKS client. Il SOCKS server viene implementato a livello di applicazione, mentre il SOCKS client è implementato tra il livello di applicazione e quello di trasporto. Le applicazioni client che utilizzano il protocollo SOCKS vengono dette SOCKSified client, in seguito vedremo che esistono diversi modi per trasformare applicazioni client in SOCKSified client.
IL SOCKS server si comporta proprio come un proxy server, infatti, quando un applicazione client (Telnet, IRC, etc.) resa SOCKSified client, vuole connettersi all'applicazione server (posta verso l'esterno), utilizzerà un SOCKS server per farlo, infatti quest'ultimo si connetterà all'applicazione server per conto del SOCKSified client. Quindi per l'applicazione server è il SOCKS server ad essere il client. I messaggi di ritorno provenienti dall'applicazione server verranno quindi ricevuti dal SOCKS server, il quale provvederà ad inviarli a sua volta al SOCKSified client. In questo modo tutti i client che si trovano dietro ad un SOCKS server, otterranno un pieno accesso ad internet, mentre tutti gli accessi non autorizzati provenienti da internet verso l'interno verranno bloccati. Il protocollo SOCKS definisce messaggi e convenzioni che consentono ad applicazioni TCP-IP di attraversare i firewall, infatti senza un SOCKS proxy applicazioni come IRC e Telnet non riuscirebbero ad attraversare il firewall poichè i proxy server comuni non li gestiscono. I SOCKS server consentono l'accesso sulla base delle informazioni contenute nell'header IP, quali: indirizzi IP sorgente e destinazione e numeri di porte e possono essere utilizzati come Gateway per protocolli IPv4 e IPv6 [9].
Attualmente vi sono in circolazione due versioni di SOCKS, SOCKSv4 e SOCKSv5. SOCKS versione 4 è un protocollo che esegue tre funzioni: fare una richiesta di connessione, settare un proxy circuit e ricollocare dati di applicazioni. Il SOCKS versione 5 è un estensione della versione 4, esso supporta in più una varietà di metodi di autenticazione, supporta UDP proxy ed è un open Internet standard (RFC 1928), semplifica l'amministrazione DNS ed inoltre facilita la traslazione e il mascheramento dell'indirizzo IP.
Tuttavia un'applicazione client per poter utilizzare il protocollo SOCKS e quindi comunicare con il SOCKS server, deve essere resa SOCKSified. I SOCKESified client per ogni richiesta che vorranno inoltrare verso l'esterno la inoltreranno sempre al SOCKS server. Ci sono diverse alternative a seconda del sistema operativo utilizzato per far sì che applicazioni client diventano SOCKSified client:
UNIX | Windows | |
Source Code |
Compile with SOCKS | |
Convert SOCKSv4 to SOCKSv5 | ||
Executable | Use runsocks | Use SocksCap |
Vediamo ora nel dettaglio queste alternative.
Compilazione con SOCKS
La libreria SOCKS è arrivata alla
versione 5, essa implementa funzioni socket equivalenti a quelle dello standard
BSD. Per far si che un'applicazione utilizzi il protocollo SOCKS viene
normalmente richiesto di aggiungere la direttiva #include
,
il linking con la libreria SOCKSv5 e una modifica per far identificare il
programma al syslog.
1) Per far si che il programma sia identificato da syslog con il nome dell'attuale programma client anzichè con un nome di programma generico, si deve aggiungere il seguente codice
SOCKSinit(argv[0]);
come prima linea di codice all'interno della procedura principale.
2) Per mappare le funzioni in funzioni SOCKSified bisogna
- per utenti SOCKSv4: bisogna aggiungere le seguenti direttive per il cc
-Dconnect=Rconnect -Dgetsockname=Rgetsockname \
-Dgetpeername=Rgetpeername -Dbind=Rbind \
-Daccept=Raccept -Dlisten=Rlisten
-Dselect=Rselect
- per utenti SOCKSv5: bisogna aggiungere questa direttiva
-DSOCKS
e in più includere il seguente header file
socks.h
3) Linkare le librerie SOCKS appropriate
- per utenti SOCKSv4:
-L<socks_lib_dir> -lsocks
- per utenti SOCKSv5:
-L<socks_lib_dir>
-lsocks5
Un esempio: supponiamo di utilizzare
SOCKSv5 e che le librerie sono presenti in /user/gjh/socks5
e di utilizzare
il compilatore gcc.
Se un programma era compilato
normalmente con:
% gcc -o foo foo.c
per renderlo SOCKSify bisogna:
%
gcc -include /user/gjh/socks5/include/socks.h -DSOCKS -L/user/gjh/socks5/lib
-lsocks5 -o foo foo.c
Tuttavia se si utilizzano le linee guida di riferimento per le implementazioni SOCKS, non si dovrebbero modificare le linee di codice della procedura principale.
CONVERTIRE DA SOCKSv4 A SOCKSV5
Se un codice sorgente è stato scritto utilizzando la libreria SOCKSv4 e la si vuole compilare attraverso la libreria SOCKv5 bisogna:
1) aggiungere le seguenti direttive al compilatore
-DRconnect=SOCKSconnect \
-DRgetsockname=SOCKSgetsockname \
-DRgetpeername=SOCKSgetpeername \
-DRbind=SOCKSbind \
-DRaccept=SOCKSaccept \
-DRlisten=SOCKSlisten \
-DRselect=SOCKSselect \
-Drecvfrom=SOCKSrecvfrom \
-Dsendto=SOCKSsendto \
-Drecv=SOCKSrecv \
-Dsend=SOCKSsend \
-Dread=SOCKSread \
-Dwrite=SOCKSwrite \
-Drresvport=SOCKSrresvport \
-Dshutdown=SOCKSshutdown \
-Dlisten=SOCKSlisten \
-Dclose=SOCKSclose \
-Ddup=SOCKSdup \
-Ddup2=SOCKSdup2 \
-Dfclose=SOCKSfclose \
-Dgethostbyname=SOCKSgethostbyname
2) linkare con la libreria SOCKSv5
-L<socks_lib_dir>
-lsocks5
RUNSOCKS
E' uno script shell per Unix, che carica la libreria dinamica SOCKSv5. Runsocks consente alle applicazioni di usare dinamicamente le funzioni di rete SOCKSified invece di utilizzare le funzioni di reti standard BSD. Quindi in questo modo le applicazioni diventano SOCKSified senza doverle ricompilare e ogni volta che utilizzeranno i socket per comunicare verso l'esterno inoltreranno la richiesta al SOCKS server specificato attraverso RUNSOCKS.
SOCKSCAP
E' un applicazione windows che consente alle applicazioni che utilizzano Winsock di comunicare con un SOCKS server e quindi di essere SOCKSified. SOCKSCap intercetta le chiamate di networking da un'applicazione client e li redirige attraverso il SOCKS server senza modificare l'applicazione originale o il sistema operativo oppure i drivers.