Socksun açılımı Socket Secure demektir.
Socks, proxylerin kullandığı bir protokoldür.
Proxy kelime anlamıyla vekil demektir. Proxydeki mantık, clientın servera erişirken vekil sunucu üzerinden bağlantı kurmasıdır.
Socks proxy sadece spesifik bir protokole hizmet etmez. Yani Socks proxy http,smtp,ftp gibi bir çok protokol/uygulama için kullanılabilecek generic bir servis protokolü olarak düşünülebilir.
Yaygın olarak kullanılan iki socks sürümü bulunur. Socks4 ve Socks5.
Socksda temel iki bileşen vardır. Bunlardan biri socks server (socks proxy), diğeri socks client.
# Socks5 Protocol
# Socks4 Protocol
# Socks4 vs Socks5
Socks4 de user authentication bulunmazken, Socks5 de user authentication bulunmaktadır.
Socks4 de sadece TCP desteklenirken, Socks5 ile birlikte ek olarak UDP desteği de gelmiştir. DNS gibi UDP konuşan protokoller sock serverla iletişim kurabilir hale gelmiştir.
Socks4de name resolution bulunmaz. Client isim çözme sorgusunu proxye iletmez, kendi tarafında çözer.
Socks4a, socks4ün name resolution yapabilen sürümüdür.
Sock5de name resolution bulunur. Client isterse host bilgisini de proxye iletebilir ve sock serverdan bunu çözmesi istenebilir.
Socks5de ipv6 desteği varken, socks4 de ipv4 desteği bulunmamaktadır.
Socks4 için bir RFC dokümanı bulunmaz, Socks5 için ise üç adet RFC (1928, 1929, 1961) vardır.
# Socks vs HTTP Proxy
Socks proxy herhangi bir protokol için kullanılabilir. HTTP Proxy Server ise HTTP isteklerini iletir.
# Socks Client
Socks proxy istemcisi sistem, browser, browser eklentileri üzerinden ayarlanabilir. Ancak her uygulama socks desteklemeyebilir.
Socks proxy desteği olmayan bir uygulamanın trafiğini socks proxy üzerinden geçirmek için proxyfier, socksify (dante-client) gibi çok güzel araçlar bulunmaktadır.
# Socks4 Protocol Paket İncelemesi
Örneğin internet free olarak bulduğum bir socks4 proxy server (89.108.146.99:4145) üzerinden gokhankesici.com başlık bilgilerini sorgulayalım. İsteği curl ile yapalım.
> curl --socks4 89.108.146.99:4145 -I https://www.gokhankesici.com
106 nolu pakette giden paket aşağıdaki gibidir. Paketi incelediğimizde sürüm bilgisi, hangi servera ve porta bağlanmak istediğimiz, ve hangi socks komutunu çalıştırdığımız görülmektedir. Burada hedef sunucuya bağlanmak istediğimizden Connect methodu kullanılmıştır. Socks4 de kullanıcı doğrulaması olmadığını belirtmiştik. Bu sebeple boştur.
108 nolu pakette ise proxy sunucusundan dönen cevabı Results kısmındagörüyoruz. Results yazan byte dışındaki bytelar ise boş olduğundan 0 olarak doldurulmuştur.
# Socks5 Protocol Paket İncelemesi
Örneğin localime kurduğum socks5 proxy server (192.168.80.199:1080) üzerinden gokhankesici.com başlık bilgilerini sorgulayalım. İsteği curl ile yapalım.
> curl --socks5 192.168.80.199:1080 -I https://www.gokhankesici.com
4 nolu paketi incelediğimizde 3-way handshaking sonrası socks sürüm bilgisi ile birlikte authentication metotlarını iletilmiş.
6 nolu paketi incelediğimizde sock server kabul edilmiş authentication metodu ve sürüm bilgisini iletmiş.
8 nolu paketi incelediğimizde clientımız hedef bağlanma bilgilerini sunucuya iletiyor.
13 nolu paketi incelediğimizde socks server ın yanıtı ve yanıtın nereden geldiği bilgisi görülebilir.
Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.
# Socks5-hostname (socks5h) Paket İncelemesi
Socks5 in isim çözdürme işini uzak sunucu da gerçekleştirebileceğinden bahsetmiştik.
Hedef olarak ip yerine domain belirtmek için clientın isteklerini bu şekilde yapması gerekir. curl de aşağıdakiler gibi belirtebiliyor. Her client desteklemeyebilir.
> curl -x socks5h://192.168.80.199:1080 -I https://www.gokhankesici.com
> curl --socks5-hostname 192.168.80.199:1080 -I https://www.gokhankesici.com
6 ve 9 nolu pakette socks5 deki gibi bir authentication gerçekleştirilir. 10 nolu pakette ise hedefe ip yerine domain verilir.
12 nolu pakette ise socks serverımız dns sunucumuza gokhankesici.comu sordu.
21 nolu pakette socks server clienta cevap olarak başarılı olduğunu ip ile dönmektedir.
Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.
# Socks4a Packet İncelemesi
Sock4a, socks4ün basit bir sürümüdür ve socks5deki sadece name resolutionı sağlar.
> curl -x socks4a://192.168.80.199:1081 -I https://www.gokhankesici.com
Socks5 paket incelemesinden farklı olarak çıktımızda authentication bölümü bulunmuyor. 4 nolu pakette klasik socks4den farklı olarak domaini görebilirsiniz. Ve remote address kısmının 0.0.0.1 olduğunu görebilirsiniz. 0.0.0.(1-255) arasındakiler socks4a protokolünde remote domaini çözmesi gerekiğini belirtiyor.
Sonrasında socks4a server gidip dns sorgusu yapar. Sonra hedefe bağlanıp bağlandığını 11 nolu pakette bağlandı bilgisini iletir.
Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.
# HTTP Proxy Paket İncelemesi
HTTP Proxy Sunucumuza aşağıdaki gibi bir istek yapalım.
> curl -x http://192.168.80.199:3128 -I https://www.gokhankesici.com
Paket 6 da görüleceği üzere HTTP CONNECT isteği proxy sunucuya iletiliyor. Paketin detayında bağlanması gerektiği yeri ve protokol sürümünü söyler. Proxy-Connection headerı client ve proxy server arasındaki bir header başlığıdır.
Sonrasında proxy sunucumuz dns sorgusunu yapar. Ve caching aktifse ns kayıtları da tekrar sorgulamamak için proxy server tarafından kaydedilir.
17 nolu pakette ise http proxy sunucumuzdan bağlanıldı yanıtını yani 200 cevabını döner.
Bu paketten sonra proxy server bind edilen port üzerinden paketleri istemci ve hedef sunucu arasında taşır.