Protocolul SOCKS este un protocol Internet care permite rutarea pachetelor de rețea între aplicații client server printr-un server proxy. SOCKS operează la nivelul 5 – Sesiune – al modelului OSI.
Server Proxy
Un server proxy este un server prin care se trimit cereri de la aplicații client care caută resurse pe alte servere. Aplicația client se conectează la un server proxy cerându-i niște servicii cum ar fi un fișier, o conexiune, o pagină web sau orice resursă disponibilă pe un alt server. Serverul proxy analizeză cererea conform regulilor lui de filtrare (poate filtra traficul pe baza adresei IP sau a protocolului de comunicare folosit). Dacă cererea este validată de către filtru, proxy-ul va pune la dispoziția aplicației client resursa cerută conectându-se la server și cerând informația în locul aplicației client. Uneori serverul proxy poate deservi cererea clientului fără a se mai conecta la serverul specificat. In acest caz el salvează într-o memorie tampon răspunsurile de la server pentru a le deservi mai tarziu la o eventuală nouă cerere client.
Un server proxy are două scopuri importante:
- păstrează anonimatul mașinilor client.
- Crește viteza de acces la resurse prin salvarea lor în memoria tampon.
Istoric
Protocolul a fost dezvoltat de David Koblas, un inginer de sistem de la MIPS Computer Systems si l-a făcut public în anului 1992.
Comparație cu proxy HTTP
SOCKS folosește un protocol de negociere pentru a informa despre conexiunea pe care clientul încearcă să o stabilească și poate fi folosit cu orice fel de conexiune prin socket TCP sau UDP.
Un proxy HTTP pe de altă parte analizează antetele HTTP trimise prin el pentru a deduce adresa serverului și din această cauză poate fi folosit numai pentru trafic HTTP.
Exemplul de mai jos descrie protocolul HTTP:
Bogdan vrea să descarce o pagină web de la Maria, care rulează un server web. Bogdan nu poate accesa direct serverul Mariei din cauza unui firewall care a fost pus în rețeaua lui. Ca să comunice cu serverul Mariei, Bogdan se conectează la serverul lui proxy HTTP. Navigatorul lui de internet comunică cu proxy-ul exact ca și cum ar fi serverul destinație: trimite antete HTTP standard. Proxy-HTTP citește cererea și se uită la antetul Host. Apoi se conectează la serverul specificat în antet și îi transmite datele serverului.
Vom vedea în continuare detaliile protocolului SOCKS.
SOCKS
Pachete TCP
Când o aplicație client bazată pe pachete TCP dorește să stabilească o conexiune cu o resursă accesibilă doar prin firewall, ea trebuie să deschidă o conexiune TCP pe serverul proxy. Serviciul SOCKS ascultă de obicei pe portul 1080. Dacă conexiune a reușește, clientul va cere negocierea metodei de autentificare folosită, se autentifică prin metoda aleasă, și trimite cererea pentru server. Proxy-ul SOCKS evaluează această cerere și stabilește conexiunea cu serverul sau refuză să o facă.
NOTĂ Valorile decimale din descrierea formatelor pachetelor reprezintă lungimea câmpului respectiv în octeți. Acolo unde un octet trebuie să ia o valoare anume, sintaxa X’hh’ este folosită și indica un singur octet în acel câmp.
Cereri
Clientul se conectează la proxy și trimite un identificator de versiune și mesajul de selecție a metodei folosite:
Câmpul VER e setat la 05 pentru versiune a 5 a protocolului. Câmpul NMETHODS conține numărul de octeți care apar în câmpul METHODS.
Proxy-ul alege una din metodele date în METHODS și trimite un mesaj clientului:
Dacă metoda selectată este FF nici una din metodele listate de client nu este acceptată, iar clientul trebuie să închidă conexiunea.
Valorile definite pentru câmpul METHOD sunt:
-
X’00′ NO AUTHENTICATION REQUIRED
-
X’01′ GSSAPI
-
X’02′ USERNAME/PASSWORD
-
de la X’03′ la X’7F’ IANA ASSIGNED
-
de la X’80′ la X’FE’ RESERVED FOR PRIVATE METHODS
-
X’FF’ NO ACCEPTABLE METHODS
Apoi urmează o subnegociere între client și server specifică metodei alese.
Odată ce subnegocierea specifică metodei s-a încheiat, clientul trimite proxy-ului detaliile cererii. Dacă metoda negociată include încapsulare pentru verificarea integrității sau confidențialitate, atunci aceste cereri trebuie încapsulate în detaliile metodei de autentificare.
Cererea SOCKS arată astfel:
| VER |
CMD |
RSV |
ATYP |
DST.ADDR |
DST.PORT |
Unde
-
VER este versiunea protocolului SOCKS: 5
-
CMD poate fi
-
CONNECT X’01′
-
BIND X’02′
-
UDP ASSOCIATE X’03′
-
RSV RESERVED
-
ATYP tipul adresei
-
adresă IP V4: X’01′
-
DOMAINNAME: X’03′
-
adresă IP V6: X’04′
-
DST.ADDR adresa destinației
-
DST.PORT portul destinației în format de rețea.
Serverul SOCKS va analiza cererea din punct de vedere al adreselor sursă și destinație și va returna unul sau mai multe mesaje în funcție de tipul cererii.
Răspunsuri
Cererea SOCKS este trimisă de către client imediat după ce a stabilit conexiunea cu proxy-ul și s-au terminat negocierile pentru autentificare. Proxy-ul evaluează cererea și dă un răspuns asemănător:
| VER |
REP |
RSV |
ATYP |
BND.ADDR |
BND.PORT |
Unde:
Dacă metoda negociată include încapsulare pentru verificarea integrității sau confidențialitate, atunci aceste răspunsuri trebuie încapsulate în detaliile metodei de autentificare.
CONNECT
Dacă comanda cerută de client a fost CONNECT, BND.PORT va conține numărul portului asignat proxy-ului pentru conexiunea cu serverul, iar BND.ADDRva conține adresa IP asociată. BND.ADDR returnat este adesea diferit de adresa IP pe care clientul a folosit-o pentru a accesa proxy-ul SOCKS.
BIND
Cererea BIND este folosită în protocoale la care clientul trebuie sa accepte conexiuni de la server. FTP este un astfel de exemplu, folosind o conexiune client-la-server pentru comenzi dar poate folosi și o conexiune server-la-client pentru a transmite date.
Protocolul SOCKS cere ca partea de client a unei aplicații să facă cererea BIND numai pentru a crea o conexiune secundară după ce o conexiune primară a fost deja facută cu CONNECT. Serverul SOCKS va folosi DST.ADDR și DST.PORT pentru a evalua cererea BIND.
Serverul SOCKS trimite două răspunsuri clientului în timpul unei operații BIND.Primul este trimis după ce serverul crează și face bind pentru un nou socket. Câmpul BND.PORT va conține numărul portului pe care serverul SOCKS l-a asignat pentru o conexiune așteptată, iar BND.ADDR va conține adresa IP asociată. Cel de-al doilea răspuns este trimis clientului numai după ce conexiunea așteptată are succes sau a eșuat. BND.PORT și BND.ADDR vor conține adresa și portul serverului destinație.
Exemplu de utilizare
Tunel SSH
Unul dintre cele mai la îndemână servere proxy SOCKS este OpenSSH[4]. Dacă aveți un cont pe un calculator ce are OpenSSH instalat nu mai trebuie decât să deschideți o conexiune ssh pentru portforwarding. Să zicem că aveți numele de utilizator ‘ion’ pe serverul exemplu.ro Pe un calculator cu Linux instalat tot ce trebuie să faceți este să rulați comanda:
ssh -D 1080 -fCN ion@exemplu.ro
O să vă ceară parola pentru utilizatorul ion. Această comandă va porni un proces a carui stare o puteți. Puteți verifica faptul că procesul încă rulează cu comanda:
ps -ef | grep ssh | grep 1080
Pentru a face acestă operație pe Windows aveți nevoie de Putty[5]. Pentru a seta un tunel SSH pâna la exemplu.ro, mergeți la câmpul Connection->SSH->Tunnels, adăugați numărul portului pe care doriți să-l aveți local (în general 1080), selectați opțiunile Dynamic și Ipv4, iar apoi introduceți hostname-ul (exemplu.ro) sau IP-ul în câmpul Host Name din categoria Session. Salvați această sesiune și conectați-vă. Lăsați consola deschisă după conectare.
Setare navigator web (Mozilla Firefox)
Unul din scopurile pentru care ați dori să folosiți un server proxy este păstrarea anonimatului în timpul navigării pe internet. Pentru a seta un server proxy SOCKS în Mozilla Firefox, deschideți Edit->Preferences->Network->Settings. Bifați Manual proxy configuration. Setați câmpul SOCKS Host la localhost iar câmpul Port din dreptul lui 1080 (numărul portului pe care ați deschis portul)
Pentru a verifica faptul că datele transmise până la serverul proxy SOCKS sunt criptate și anonimatul dumneavoastră este asigurat putți folosi Wireshark[6] pentru a analiza cererile făcute în timpul navigării pe internet. De asemenea dacă deschideți o pagină web care vă determină IP-ul, veți observa că atunci când proxy-ul este setat va apărea adresa proxy-ului, nu a dumeavoastră.
Proxy transparent
Cu librării precum tsocks[7] puteți să utilizați aplicații de rețea precum ssh sau telnet prin proxy SOCKS. Trebuie însă să instalați și să configurați aceste librării, dar apoi utilizarea este extrem de simplă.
Securitate
Protocolul SOCKS este un protocol pentru nivelul sesiune pentru transmiterea de date prin firewall-uri IP. Securitatea acestei transmisii de date depinde de metodele de autenficare și încapsulare oferite de diverse implementări și selectate în timpul negocierii dintre clientul SOCKS și serverul SOCKS.
Referințe:
-
IETF, RFC1928 – SOCKS Protocol Version 5, http://www.faqs.org/rfcs/rfc1928.html
- Wikipedia, http://en.wikipedia.org/wiki/Proxy_server
- Wikipedia, http://en.wikipedia.org/wiki/SOCKS
- OpenSSH, http://www.openssh.com
- Putty, http://www.chiark.greenend.org.uk/~sgtatham/putty/
- Wireshark, http://www.wireshark.org/
- TSOCKS, http://tsocks.sourceforge.net/