SOCKS5, bir istemci ile hedef sunucu arasına giren ve uygulama katmanı protokolünü yorumlamayan bir proxy protokolüdür. Proxy, taşıdığı verinin HTTP, SMTP, SSH ya da başka bir protokol olduğunu bilmek zorunda değildir; yalnızca istemcinin istediği hedefe bir bağlantı açar ve iki yön arasında baytları aktarır. Protokol RFC 1928 ile tanımlanır, kullanıcı adı ve şifre ile doğrulama ise RFC 1929 içinde ayrı bir alt müzakere olarak belirtilir.
Tasarımın temel fikri
Bir SOCKS5 oturumunda istemci önce proxy sunucusuna kendi TCP bağlantısını açar. Bu bağlantı üzerinden üç aşamalı bir konuşma yapılır: hangi doğrulama yönteminin kullanılacağı belirlenir, doğrulama tamamlanır, ardından istemci hedef adresi bildirir. Proxy hedefe bağlanabilirse başarı cevabı döner ve bu noktadan sonra proxy yalnızca iki soket arasında veri taşır.
Bu yapı, SOCKS5 proxy kullanan bir uygulamanın hedef sunucuya doğrudan bağlanmış gibi davranabilmesini sağlar. Hedef sunucunun gördüğü kaynak adres, istemcinin değil proxy çıkış noktasının adresidir.
Adım 1: Yöntem müzakeresi
İstemci, proxy bağlantısı kurulur kurulmaz bir selamlama mesajı gönderir. Mesaj sürüm numarasını (0x05), desteklenen yöntem sayısını ve yöntem kodlarının listesini içerir. Proxy bu listeden birini seçip cevap verir.
| Yöntem kodu | Anlamı |
|---|---|
0x00 | Kimlik doğrulama yok |
0x01 | GSSAPI |
0x02 | Kullanıcı adı ve şifre (RFC 1929) |
0xFF | Kabul edilebilir yöntem yok; istemci bağlantıyı kapatmalıdır |
Kullanıcı adı ve şifre isteyen bir proxy ile konuşan istemci tipik olarak 05 01 02 (sürüm 5, bir yöntem, yöntem 2) ya da 05 02 00 02 (iki yöntem: doğrulamasız ve kullanıcı adı/şifre) gönderir. Proxy 05 02 cevabını verirse bir sonraki adımda kullanıcı adı ve şifre beklenir.
Adım 2: Kullanıcı adı ve şifre doğrulaması
RFC 1929 alt müzakeresinde istemci alt-protokol sürümünü (0x01), kullanıcı adı uzunluğunu, kullanıcı adını, şifre uzunluğunu ve şifreyi gönderir. Proxy iki baytlık bir cevap döner: sürüm ve durum. Durum 0x00 ise doğrulama başarılıdır; sıfırdan farklı herhangi bir değer başarısızlıktır ve bağlantı kapatılmalıdır.
Adım 3: Bağlantı isteği
Doğrulama tamamlandığında istemci asıl isteği gönderir. İstek; sürüm, komut, ayrılmış bir bayt, adres türü, hedef adres ve hedef port alanlarından oluşur.
- Komut
0x01CONNECT (TCP bağlantısı),0x02BIND (gelen bağlantı bekleme),0x03UDP ASSOCIATE (UDP aktarımı). Günlük kullanımın büyük bölümü CONNECT komutudur.- Adres türü
0x01IPv4 adresi,0x03alan adı,0x04IPv6 adresi. Alan adı türünde adres, uzunluk baytıyla başlayan bir metindir.- Hedef port
- İki bayt, ağ bayt sırasıyla (big-endian).
Proxy hedefe bağlanmayı dener ve cevap mesajı gönderir. Cevabın ikinci alanı sonuç kodudur: 0x00 başarı, 0x01 genel hata, 0x02 kurallar gereği izin verilmedi, 0x03 ağa ulaşılamıyor, 0x04 ana makineye ulaşılamıyor, 0x05 bağlantı reddedildi, 0x06 TTL doldu, 0x07 komut desteklenmiyor, 0x08 adres türü desteklenmiyor. Başarılı cevaptan sonra aynı TCP bağlantısı doğrudan hedefe giden bir tünele dönüşür.
Alan adının nerede çözüleceği
Adres türü olarak alan adı (0x03) gönderildiğinde adı proxy sunucusu çözer. İstemci adı kendisi çözüp IPv4 ya da IPv6 adresini gönderirse DNS sorgusu istemcinin yerel çözümleyicisinden çıkar. Birçok istemcide bu ayrım şema adıyla belirlenir: socks5:// yerel çözümü, socks5h:// uzaktan çözümü ifade eder. Ayrıntılı anlatım için DNS sızıntısı ve socks5h yazısına bakın.
Uygulamada görünümü
Komut satırında bir SOCKS5 proxy üzerinden istek atmanın en kısa yolu curl kullanmaktır. Aşağıdaki örnek dokümantasyon amaçlı yer tutucular içerir; KULLANICI, SIFRE ve PORT değerlerini kendi bilgilerinizle değiştirin.
# Alan adı çözümü proxy üzerinde yapılır (socks5h)
curl --proxy socks5h://KULLANICI:SIFRE@proxy.example.com:PORT https://api.ipify.orgPython tarafında requests kütüphanesi SOCKS desteği için ek bir bağımlılık ister (pip install "requests[socks]"). Bağlantı ayrıntıları proxies sözlüğüyle verilir.
import requests
proxy = "socks5h://KULLANICI:[email protected]:PORT"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=15)
print(r.text)SOCKS5 ne yapmaz
- Trafiği kendi başına şifrelemez; şifreleme uygulama protokolüne aittir.
- İstemcinin hedef sunucuya kendini tanıtan başlıklarını (örneğin HTTP
User-Agent) değiştirmez; protokolü yorumlamaz. - Tek başına gizlilik ya da anonimlik garantisi değildir; hedefin gördüğü adres proxy çıkış adresi olur, bunun ötesindeki izler uygulama ve tarayıcı davranışına bağlıdır.
- UDP aktarımı (UDP ASSOCIATE) hem protokolün hem de karşıdaki proxy hizmetinin desteğine bağlıdır; her SOCKS5 sunucusu bu komutu uygulamaz.
Özet
- SOCKS5 uygulama protokolünden bağımsızdır; proxy yalnızca baytları taşır.
- Oturum üç adımdır: yöntem müzakeresi, doğrulama, bağlantı isteği.
- Kullanıcı adı ve şifre doğrulaması RFC 1929 ile yapılır ve şifre düz metin gider.
- Adres türü alan adı olduğunda ad çözümü proxy tarafında yapılır; istemcilerde bu davranış
socks5hile seçilir. - Başarılı bir CONNECT cevabından sonra proxy iki yön arasında veri iletir.