Şifreli iletişimin önemli unsurlarından SOCKS protokolüne giriş yapıyoruz.
SOCKS (Socket Secure)

SOCKS, herhangi bir istemci ile bir sunucu arasında belirlenen bir proxy’i kullanarak ağ paketlerini değiştiren bir Internet protokülüdür. Bunun yanında, SOCKS5 protokolü, aşamalı şekilde bir kimlik doğrulama yetkisi sağlar. Bu sayede yalnızca yetkili kişiler belirlenen sunuculara erişim sağlayabilir. Pratikte, bir SOCKS sunucusu, gelen TCP bağlantılarını rastgele bir IP adresine yönlendirir ve UDP paketlerinin iletilmesini sağlayan araçları harekete geçirir.
SOCKS, bütün işlemlerini OSI modelinin 5. katmanında gerçekleştirir. Bu katman, oturum, sunum ve taşıma katmanları arasındaki bir ara katmandır. SOCKS sunucusu, 1080 nolu TCP portundan gelen bağlantıları kabul eder.
SOCKS Tarihi
Bu protokol, aslında MIPS Computer Systems’in yöneticilerinden biri olan David Koblas tarafından geliştirildi.
1992 yılında, Silicon Graphics şirketi MIPS’i devraldıktan sonra geliştirici Koblas, o yıl düzenlenen Usenix Güvenlik Sempozyumunuda, SOCKS protokolünü herkese açık hale getiren bir makale sundu. Daha sonra Ying-Da Lee tarafından protokol versiyonu 4'e yükseltildi.
SOCKS’un referans mimarisi Permeo Technologies’e aittir.
SOCKS5 protokol türü, ilk başta güvenlik duvarlarını ve bazı güvenlik ürünlerini yönetmeyi sağlayan bir internet güvenlik protokolüydü. İlk olarak 1996 yılında IETF( Internet Engineering Task Force) tarafından onaylandı. Daha sonraları bu protokol, Asya kıtası dışına teknolojileri ulaştıran Aventail Corporation ile işbirliği içerisinde geliştirilmeye devam edildi.
SOCKS Protokolünün Kullanımı
SOCKS , ağ geçitleri için fiili olarak kullanılan bir protokol standartıdır.
SOCKS, diğer bir yandan engellenen ağ trafiğine farklı bir yol oluşturmak için kullanılır. Veri trafiğinin hükümetler, sistem yöneticileri gibi etmenler tarafından engellendiği durumlarda SOCKS protokolü, bu engelleri atlamak için kullanılır.
Bazı SSH paketleri (OpenSSH gibi) standart kullanıcının yerel ağda bir SOCKS proxy’si oluşturmasına izin verebilecek dinamik port yönlendirmeyi destekler. Bu seçenek kullanıcıyı sadece engellenmiş sunuculara bağlanma konusunda yetkilendirebilir.
Tor proxy yazılımı ise, kullanıcılara grafikleştirilmiş bir SOCKS arayüzü sunmaktadır.
SOCKS protokolü aynı zamanda siber saldırılar için bir bariyer görevi de görmektedir.
HTTP Proxy ile SOCKS Karşılaştırması

Temele bakıldığında, SOCKS protokolü HTTP Proxy’lerinden daha pasif şekilde çalışmaktadır. SOCKS proxy yazılımı, istemci tarafından yapılan bağlantı için bir denetleyici kullanır. Bu denetleyici alınan ve verilen paketleri analiz edebilir ve yazılımın bariyer görevi görmesini sağlayabilir (FTP gibi temel protokollerin kullanımında standart bir HTTP proxy’si kullanılır).
SOCKS protokolü , HTTP’den farklı olarak TCP bağlantılarını izleyebilir ve farklı proxy denetimleri kullanarak UDP trafiğini kontrol edebilir.
Fakat HTTP Proxy’leri geleneksel olarak daha yüksek seviyede filtreleme gerçekleştiren denetim yöntemleri kullanır( Her bir bağlantı metodu için farklı bir denetim kullanılabilir).
SOCKS
Örnekleme yaparsak, Bill internet ağı aracılığıyla Jane ile iletişime geçmek istiyor fakat bu iki istemci arasında bir güvenlik duvarı mevcut. Bill doğrudan Jane ile iletişim kuramıyor çünkü güvenlik duvarı bunu engelliyor. Bu sebeple, Bill kendi ağındaki SOCKS istemcisine bağlantı sağlayarak başka bir ağ kurmuş oluyor. SOCKS proxy’si ise bu durumda Bill ve Jane’i dolaylı yoldan birbirine bağlamış oluyor.
HTTP
Bu örnekte ise, Bill web sunucusuna sahip olan Jane’den bir veri almak istiyor. Yani kısacası standart bir web bağlantı isteği yapıyor diyebiliriz. Fakat Jane’in ağında bir güvenlik duvarı yaratıldığından dolayı Bill, doğrudan bağlantı sağlayamaz. Sunucuya bağlanmak için Bill, HTTP Proxy’sine bağlanır. Web tarayıcısı (istemci) proxy ile doğrudan iletişim kurabiliyorsa Jane’in sunucusuna da doğrudan bağlanabilir. Kısacası standart bir HTTP bağlantı protokolü gerçekleşir. Bu işlemin ardından HTTP sunucusu doğrudan Jane’in sunucusuna bağlantı sağlar ve Jane’in sunucusundan aldığı veriyi tekrar Bill’e iletir.
Protokol Türleri

SOCKS4
Varsayılan bir SOCKS4 bağlantı isteğini şu şekilde özetleyebiliriz:
SOCKS istemcisinden ana SOCKS sunucusuna:
field 1 : Bu sürümde SOCKS versiyonu 1 byte için 0x04 olmalı.
field 2 : 1 byte için komut kodu:
0x01 = TCP/IP ana veri akışı
0x02 = TCP/IP port aktarımı
field 3 : port numarası , 2 byte (ağdaki byte sırasına göre)
field 4 : IP Adresi , 4 byte (ağdak byte sırasına göre)
field 5 : kullanıcı ID dizesi (0x00)
SOCKS sunucusundan SOCKS ana istemcisine :
field 1 : geçersiz veri
field 2 : sunucu durumu , 2 byte
0x5A = istek kabul edildi
0x5B = istek başarısız oldu ya da reddedildi
0x5C = istemci kimlik tanıması veya sunucu reddi sebebiyle başarısız oldu
0x5D = istemcideki kimlik dizesi hatası nedeniyle doğrulama başarısız oldufield 3 : 2 byte (isteğe bağlı, göz ardı edilebilir)
field 4 : 4 byte(isteğe bağlı göz ardı edilebilir)
Örneğin, bir SOCKS4 protokolü ile sunucuya bağlanma talebi “OK” yanıtı alıyor:
İstemci: 0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x46 0x72 0x65 0x64 0x00
Sunucu : 0x00 | 0x5A | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX
NOT: 0xXX herhangi bir byte değeri olabilir. SOCKS4 protokolü bu byte değerlerinin ana bağlantı isteğinde dikkate alınmaması gerektiğini iletir.
Bu aşamadan sonra SOCKS istemcisinden SOCKS sunucusuna gönderilen her veri, bağlantı kapsamında ele alınmaktadır.
Komut alanı aktif FTP bağlantıları için 0x02 veya 0x01 standartlarına geçiş yapabilir.
SOCKS4a
Bu protokol ise, SOCKS4 protokolünü bir ağ bulmak yerine bir hedef alanı belirlemesi için sınırlarını genişletir. Bu, etki alanı adının bir IP adresi tarafından çözülemediği durumlarda işe yaramaktadır.
İstemciden SOCKS sunucusuna:
field 1 : Bu sürümde SOCKS versiyonu 1 byte için 0x04 olmalı.
field 2 : 1 byte için komut kodu:0x01 = TCP/IP ana veri akışı
0x02 = TCP/IP port aktarımıfield 3 : port numarası , 2 byte (ağdaki byte sırasına göre)
field 4 : sınırılandırılmış geçersiz IP adresi
field 5 : kullanıcı ID dizesi (0x00)
field 6 : sunucunun hedef alan adı (0x00)
Sunucudan SOCKS istemcisine:
field 1 : geçersiz veri
field 2 : sunucu durumu , 2 byte
0x5A = istek kabul edildi
0x5B = istek başarısız oldu ya da reddedildi
0x5C = istemci kimlik tanıması veya sunucu reddi sebebiyle başarısız oldu
0x5D = istemcideki kimlik dizesi hatası nedeniyle doğrulama başarısız oldufield 3 : port numarası , 2 byte (ağdaki byte sırasına göre)
field 4 : IP Adresi , 4 byte (ağdaki byte sırasına göre)
SOCKS4A kullanan bir web sunucusu , gelen paketteki DSTIP verilerini kontrol etmelidir.
Temsili adresi 0 içermeyen x ve 0.0.0.x dahilinde bir istek yapıyorsa, sunucu gönderilen verilerin etki alanının adını okur. Bu bağlamda sunucu gelen paketlerdeki alan adını çözmeli ve mümkünse ana bilgisayara bağlanmalıdır.
SOCKS5
Bu protokol tipi ise, SOCKS4 protokolünün bir uzantısı olarak ele alınabilir. Ayrıca kimlik doğrulaması için daha fazla seçenek sunmaktadır. IPv6 ve UDP için dinamik DNS desteği sunmaktadır. Birincil bağlantı isteği şu aşamalardan oluşur:
- İstemci tarafından desteklenen kimlik bağlantıları için bir istek gönderilir ve bağlantı başlatılır.
*Sunucu tarafından bu istek kabul edilir (kabul edilmezse veya yanıt vermezse hata mesajı ile belirtilir).
*Kimlik doğrulama tipine bağlı olarak istemci ve sunucu arasında birden fazla kimlik doğrulama görevi yürütülebilir.
*İstemci SOCKS4 tipine bağlı bir bağlantı isteği gönderir.
*Sunucu tarafından ise SOCKS4'e benzer bir yanıt verilir.
Desteklenen kimlik doğrulama aşamaları ve tipleri aşağıdaki şekildedir:
0x00: Doğrulama başarısız.
0x01: GSSAPI[15]
0x02: Username/password
0x03–0x7F: IANA metodu uygulanır
0x80–0xFE: gizli kullanıcılar için bağlantı isteği göz ardı edilir.
İstemci tarafından gelen ilk yanıt ise aşağıdaki gibidir:
field 1: SOCKS protokol sürümü, 1 byte (0x05 yalnızca bu sürüm için)
field 2: numaralandırılmış doğrulama tipleri desteklenir, 1 byte
field 3: doğrulama metodu sunucuda işlenir, 1 byte başına düşen işlem sayısı metoda göre değişir.
Sunucu tarafından yapılan seçim:
field 1: SOCKS sürümü, 1 byte (0x05 yalnızca bu sürüm için)
field 2:seçilen doğrulama metodu denetlenir, 1 byte, eğer seçilen doğrulama metodu başarısız olursa hata kodu verilir: 0xFF
Bir sonraki aşamadaki kimlik doğrulama işlemi ise metoda göre değişmektedir. 0x02 metodu için :
Username/password authenticate için istemcinin kimlik isteği:
field 1: versiyon numarası, 1 byte (0x01 mevcut versiyondaki doğrulama isteği için)
field 2: username uzunluğu, 1 byte
field 3: username, 1–255 bytes
field 4: password uzunluğu, 1 byte
field 5: password, 1–255 bytes
Username/password authenticate için sunucunun yanıtı:
field 1: versiyon, 1 byte (0x01 mevcut versiyondaki doğrulama isteği için)
field 2: durum kodu, 1 byte
0x00: başarılı
verilen değerler dışındaki herhangi bir değer bir hata kodu olacaktır.
İstemcinin bağlantı isteği:
field 1: SOCKS versiyon numarası, 1 byte (0x05 yalnızca bu sürüm için)
field 2: komut, 1 byte:
0x01: TCP/IP ana veri akışı
0x02: TCP/IP port kontrolü
0x03: UDP portunu ilişkilendir
field 3: bölüm ayrıldı, 0x00 için oluşturulan alan UDP ile ilişkilendirildi, 1 byte
field 4: hedef tipi, 1 byte:
0x01: IPv4 adresi
0x03: Alan adı
0x04: IPv6 adresi
field 5: hedef adresi
IPv4 için 4byte
Alan adı için 1–255 byte
IPv6 için 16 byte
field 6: ağdaki byte değerine göre port ID’si, 2 byte
Sunucu yanıtı:
field 1: SOCKS protocol versiyon, 1 byte (0x05 yalnızca bu sürüm için)
field 2: durum, 1 byte:
0x00: bağlantı onaylandı
0x01: kritik hata
0x02: bağlantıya kural sebebiyle izin verilmedi
0x03: ağ ulaşılamaz
0x04: sunucu ulaşılamaz
0x05: bağlantı, hedef sunucu tarafından engellendi
0x06: TTL süresi doldu
0x07: komut desteklenmiyor / protokol hatası
0x08: adres tipi desteklenmiyor
field 3: ayrılmış, 0x00 kodu için bağlantı isteği , 1 byte
field 4: adres tipi, 1 byte:
0x01: IPv4 adresi
0x03: Alan adı
0x04: IPv6 adresi
field 5: bağlı sunucu adresi için;
Alan adı için 1–255 byte
IPv6 için 16 byte
field 6: ağdaki byte değerine göre port ID’si, 2 byte
Şu ana kadar SOCKS4, SOCKS4a ve SOCKS5 protokol tiplerinin bir sunucuyla yaptıkları bağlantı isteklerini ve SOCKS5 protokolünün authenticate işlemini inceledik. Standart HTTP veya HTTPS bağlantısı gibi görünse de aslında daha karmaşık bir yapıya sahip.
SOCKS protokolü kullanıldığı yere göre HTTPS’den daha güvenli olabilmektedir. Bildiğiniz gibi HTTPS mükemmel değildir. Aynı şekilde SOCKS protokolü de mükemmel değildir. Ancak bu iletişim protokolleri kullanım alanlarına göre birbirlerinden ayrılmaktadır.
SOCKS Proxy Server Yazılımları

Sıra geldi SOCKS Proxy destekli sunucu yazılımlarına.
3proxy : Unix, Linux ve Windows için kapsamlı UDP isteği sağlayan ve IPv6 desteği veren bir SOCKSv4 / 4a / 5 tipi bir proxy’dir. Ayrıca zincirleme proxy isteğini destekler ve farklı proxy türleri arasında geçiş yapabilir.
Antinat: Genişletilmiş bir SOCKS sunucusu ve istemci kütüphanesi olarak tanımlanabilir. SOCKS 4 / 4a / 5 , gelişmiş kimlik doğrulama , CHAP, XML güvenlik duvarı , Win32 sunucu bileşenini ve UDP’yi destekler. Bunun yanında daha çok deneysel sayılabilecek bir IPv6 desteği de mevcuttur.
Dante : Uygun ve güvenli bir ağ bağlantısı sağlanması amacıyla kullanılan ve yalnızca sunucudan istemciye doğru bir bağlantı destekleyen SOCKS yazılımıdır.
Shadowsocks : Bu yazılım ise Çinde mevcut olan engellemeleri kaldırmak için geliştirilmiş bir SOCKS 5 türüne sahip yazılımdır.
Srelay : Bu yazılım ise sadece iki protokol türünü destekleyen (SOCKS4/5) bir mini yazılımdır.
SS5 : Socks 4 ve 5 tipini uygulayan bir SOCKS yazılımıdır.
Sun Java System Web Proxy Server : HTTPS , NSAPI I/O filtrelerine ve dinamik yeniden yapılandırma özelliklerine sahip bir SOCKS sunucu yazılımıdır.
WinGate : Windows için SOCKS 4 / 5 destekleyen gelişmiş bir çoklu protokol türüdür. UDP, GSSAPI desteği ile çoklu HTTP proxy denemeleri sağlar.
Diğer SOCKS yazılımları
OpenSSH: SOCKS protokolünün alt protokollere de eşleşmesine izin veren ve dinamik bir bağlantı kütüphanesine sahip yazılımdır.
PuTTY: Win32 SSH İstemcisidir. Uzak bağlantılarda çoklu dinamik eşleşmeye izin veren bu yazılım aynı zamanda uzak sunuculardaki SOCKS protokollerini de destekler.
ShimmerCat : Bir dahili ağı simule etmek için kullanılan, SOCKS5 destekli bir yazılımdır. Web geliştiricilerinin etc / hosts / dosyasını değiştirmeden kendi sunucularını test edebilmelerini de sağlamaktadır.
Tor: Çevrimiçi anonimlik sağlayabilecek olan Tor, SOCKS desteği sunmaktadır.
Bu makalede SOCKS protokolünden, tarihçesinden, geliştirilme aşamasından, iletişim aşamalarından ve SOCKS destekli yazılımlardan bahsettik. SOCKS hakkında geniş bir Türkçe kaynak olmaması sebebiyle bu makalenin son derece önemli olduğunu düşünüyorum. Kendi bilgilerimin yanı sıra makalede geçen birçok paragraf tarafımca kaynak linkten çevrilmiştir.
Kaynak - HowlingPixel Wiki