SOCKS5
Yayın tarihi
Okuma süresi
6 dk okuma

SOCKS5 Proxy Nedir? Nasıl Çalışır?

SOCKS5 proxy, RFC 1928 ile tanımlı bir oturum katmanı vekilidir. El sıkışma, komutlar, adres türleri, kullanıcı/parola doğrulaması ve socks5h farkı.

SOCKS5, bir istemcinin hedef sunucuya doğrudan bağlanmak yerine araya bir vekil sunucu (proxy) koymasını sağlayan oturum katmanı protokolüdür. RFC 1928 (yeni sekmede açılır) ile tanımlanır. HTTP proxy'nin aksine HTTP başlıklarını yorumlamaz; hedefe bağlanır ve baytları olduğu gibi aktarır. Bu yazıda el sıkışmayı, komutları, adres türlerini ve kimlik doğrulamayı bayt düzeyinde görürsünüz.

SOCKS5 neden oturum katmanında çalışır?

HTTP proxy, istekteki Host ve yol bilgisini okuyabilir çünkü uygulama protokolünü bilir. SOCKS5 bunu bilmez. İstemci "şu adrese şu portla bağlan" der, sunucu bağlantıyı kurar ve geri kalanına karışmaz. Bu yüzden aynı SOCKS5 sunucusu HTTP, SMTP, bir oyun protokolü ya da kendi tasarladığınız bir TCP protokolü için kullanılabilir.

Bu sadelik iki sonuç doğurur. Birincisi, protokolden bağımsız olduğu için masaüstü uygulamaları, botlar ve komut satırı araçları kolayca yönlendirilir. İkincisi, proxy içeriği görmediği için HTTP düzeyinde filtreleme, önbellekleme ya da başlık düzenleme yapmaz. Bu konuyu HTTP ve SOCKS5 farkları yazısında karşılaştırmalı olarak ele aldık.

SOCKS5'in geleneksel bağlantı noktası TCP 1080'dir (RFC 1928 §3). Sağlayıcılar başka port numaraları kullanabilir; geçerli port her zaman teslim edilen bağlantı bilgisindedir.

El sıkışma adım adım

Bir SOCKS5 oturumu üç aşamadan oluşur: yöntem seçimi, isteğe bağlı kimlik doğrulama ve bağlantı isteği.

Yöntem seçimi

İstemci ilk mesajında sürümü (0x05), desteklediği yöntem sayısını ve yöntem kodlarını gönderir. Tanımlı kodlar şunlardır:

KodAnlamı
0x00Kimlik doğrulama yok
0x01GSSAPI
0x02Kullanıcı adı / parola
0xFFKabul edilebilir yöntem yok

Sunucu, istemcinin listesinden birini seçip 05 <yöntem> ile yanıt verir. 0xFF dönerse istemci bağlantıyı kapatmalıdır.

Kullanıcı adı ve parola alt müzakeresi

Sunucu 0x02 seçtiyse RFC 1929 (yeni sekmede açılır) devreye girer. İstemci VER = 0x01, kullanıcı adı uzunluğu, kullanıcı adı, parola uzunluğu ve parolayı gönderir. Sunucu 01 00 ile yanıt verirse doğrulama başarılıdır; başarısızlıkta sunucu bağlantıyı kapatmalıdır.

Uyarı

RFC 1929 §3'e göre parola ağda düz metin olarak gider. Ağ dinlenebiliyorsa bu yöntem önerilmez. SOCKS5 kendi başına şifreleme sağlamaz; hassas veri taşıyorsanız uygulama katmanında TLS kullanın.

Bağlantı isteği

Kimlik doğrulama bittikten sonra istemci asıl isteği gönderir: VER, CMD, RSV (sıfır), ATYP, hedef adres ve 2 baytlık hedef port (ağ bayt sırasında).

Komutlar: CONNECT, BIND, UDP ASSOCIATE

RFC 1928 §4 üç komut tanımlar:

KodKomutNe için kullanılır?
0x01CONNECTHedefe giden TCP bağlantısı; en yaygın kullanım
0x02BINDProxy üzerinden gelen bağlantıyı beklemek (örneğin FTP'nin eski etkin kipi)
0x03UDP ASSOCIATEUDP datagramlarını proxy üzerinden aktarmak

Günlük kullanımın büyük bölümü CONNECT'tir. BIND ve UDP ASSOCIATE'i her sunucu uygulamaz; bir sağlayıcının bunları sunduğunu varsaymayın, ürün bilgisinden doğrulayın.

UDP ASSOCIATE'te istemci, TCP kontrol bağlantısını açık tutar ve datagramları sunucunun bildirdiği UDP adresine, başlıklı bir biçimde gönderir. Kontrol bağlantısı kapanınca ilişki de sona erer.

Adres türleri: IPv4, alan adı, IPv6

Hedef, ATYP baytıyla belirtilir (RFC 1928 §5):

ATYPHedef türüAdres alanı
0x01IPv4 adresi4 bayt
0x03Alan adı1 bayt uzunluk + ad (sonda NUL yok)
0x04IPv6 adresi16 bayt

Burada sık yapılan bir hata var: IPv6 adresini metin olarak 0x03 ile göndermek. Doğrusu 0x04 ve 16 bayttır. Örneğin 2001:db8::1 adresi (belgelendirme aralığından örnek adres), 443 portu için CONNECT isteği şöyle görünür:

Metin
05 01 00 04 | 20 01 0d b8 00 00 00 00 00 00 00 00 00 00 00 01 | 01 bb
VER CMD RSV ATYP |            DST.ADDR (16 bayt)             | DST.PORT

Alan adı biçimi ise hedefin adını proxy'ye bırakır; bunu bir sonraki bölümde işliyoruz. IPv6 adreslerinin yazımı ve türleri için IPv6 adres türleri yazısına bakabilirsiniz.

Uçtan uca bayt akışı

Aşağıdaki akış, kullanıcı adı/parola doğrulamalı bir oturumda example.com:443 hedefine CONNECT çağrısını gösterir. Kullanıcı adı KULLANICI, parola PAROLA yer tutucusudur; bayt değerleri bu yer tutucuların ASCII karşılığıdır.

Metin
İstemci -> Sunucu : 05 01 02
                    sürüm 5, 1 yöntem, yöntem 0x02 (kullanıcı/parola)
Sunucu  -> İstemci: 05 02
                    sunucu 0x02 yöntemini seçti

İstemci -> Sunucu : 01 09 4b 55 4c 4c 41 4e 49 43 49 06 50 41 52 4f 4c 41
                    VER=1, ULEN=9, "KULLANICI", PLEN=6, "PAROLA"
Sunucu  -> İstemci: 01 00
                    STATUS=0, doğrulama başarılı

İstemci -> Sunucu : 05 01 00 03 0b 65 78 61 6d 70 6c 65 2e 63 6f 6d 01 bb
                    CONNECT, ATYP=3, uzunluk 11, "example.com", port 443
Sunucu  -> İstemci: 05 00 00 01 c6 33 64 0a 9c 40
                    REP=0 (başarılı), bağlama adresi 198.51.100.10:40000

Son satırdaki bağlama adresi (BND.ADDR ve BND.PORT), proxy'nin hedefe giden bağlantısı için kullandığı yerel uçtur; örnek değerler belgelendirme aralığındandır. Bu yanıttan sonra tünel açıktır: istemcinin gönderdiği her bayt hedefe, hedefin gönderdiği her bayt istemciye aktarılır. Örneğin TLS el sıkışması artık bu tünelin içinde, proxy'nin göremediği biçimde yapılır.

Başarısızlık yanıtlarında REP alanı nedeni verir (RFC 1928 §6): 0x01 genel hata, 0x02 kurallarca izin verilmedi, 0x03 ağa ulaşılamıyor, 0x04 ana makineye ulaşılamıyor, 0x05 bağlantı reddedildi, 0x07 komut desteklenmiyor, 0x08 adres türü desteklenmiyor. Bu kodlar hata ayıklarken işe yarar: 0x04 genellikle hedefe yol olmadığını, 0x08 ise sunucunun gönderdiğiniz adres türünü tanımadığını gösterir.

socks5 ve socks5h: DNS nerede çözülür?

İstemci hedef alan adını kendisi çözüp IP adresiyle ATYP = 0x01/0x04 gönderebilir ya da alan adını ATYP = 0x03 ile proxy'ye bırakabilir. İlk durumda DNS sorgusu istemcinin kendi ağından çıkar, ikincisinde proxy'nin tarafında çözülür.

curl belgesi socks5h:// şemasında alan adının proxy tarafından çözüldüğünü söyler. Düz socks5:// için aynı açıklık yoktur; davranış istemciye bağlıdır. Pratik kural basit:

  • Alan adının proxy üzerinden çözülmesini istiyorsanız socks5h şemasını kullanın.
  • İstemcinin yerel DNS'ine güveniyorsanız ve ayrıca bir sızıntı kaygınız yoksa socks5 yeterli olabilir.
Bash
# Alan adı proxy tarafında çözülür
curl --proxy socks5h://KULLANICI:PAROLA@PROXY_HOST:PROXY_PORT https://example.com/

# Aynı işin seçenek biçimi
curl --socks5-hostname PROXY_HOST:PROXY_PORT --proxy-user KULLANICI:PAROLA https://example.com/

Python requests kitaplığında SOCKS desteği için pip install "requests[socks]" gerekir:

Python
import requests

proxy = "socks5h://KULLANICI:PAROLA@PROXY_HOST:PROXY_PORT"
yanit = requests.get(
    "https://example.com/",
    proxies={"http": proxy, "https": proxy},
    timeout=15,
)
print(yanit.status_code)

Parolada @, : ya da / gibi karakterler varsa URL'de yüzde ile kodlanmaları gerekir.

Nerede kullanılır?

SOCKS5 şu durumlarda öne çıkar:

  • HTTP dışı trafik üreten uygulamalar: botlar, masaüstü istemcileri, komut satırı araçları.
  • Tek bir ayarla uygulamanın tüm TCP bağlantılarını yönlendirmek isteyen yazılımlar.
  • Alan adı çözümlemesini proxy tarafına bırakmak isteyen kurulumlar.
  • Proxy sunucusu UDP ASSOCIATE sunuyorsa UDP kullanan uygulamalar.

Tarayıcı eklentileri ve hazır araçlar çoğu zaman HTTP(S) proxy ile daha rahat çalışır. Hangisinin hangi senaryoya uyduğunu HTTP ve SOCKS5 farkları yazısında tablolarla bulursunuz.

Bir proxy'nin çalışıp çalışmadığını denemek için SOCKS5 Kontrol aracını kullanabilirsiniz; araç el sıkışmayı ve yetkilendirmeyi sınar. Genel bir bağlantı testi için Proxy Kontrol de var.

Ürün tarafında SOCKS5

SOCKS5'in protokol olarak ne sunduğu ile bir ürün paketinin ne sunduğu aynı şey değildir. Sağlam Proxy'de ürün protokolleri pakete göre değişir:

  • HTTP & SOCKS5 Proxy ISP Proxy paketlerinin protokol katmanıdır; ayrı bir paket değildir. Türkiye ve Amerika paketlerinin özelliklerinde HTTP ve SOCKS5, Avrupa paketlerinde yalnızca SOCKS5 yazar.
  • Türkiye siparişinde protokol türü olarak HTTP ya da SOCKS5 seçilir; "HTTP(S)" için ayrı bir sipariş seçeneği yoktur.
  • ISP sayfasında SOCKS5 için UDP desteği belirtilmemiştir. UDP gerekiyorsa sipariş öncesi destekten teyit alın.
  • Kimlik doğrulama kullanıcı adı ve parola iledir.

Genel bakış için ISP Proxy sayfasına, güncel fiyat ve paketler için ürün sayfasına bakın. Satın alma işlemi Sağlam Proxy (saglamproxy.com) üzerinden yapılır; ipv6proxy.tr ürün satmaz. Sipariş vermek isterseniz ISP Proxy paketlerine (yeni sekmede açılır) gidebilirsiniz.

Not

Bu sitenin odağı IPv6 olsa da SOCKS5 protokolü IPv6 hedeflerini ATYP = 0x04 ile destekler. Bir ürünün IPv6 ya da SOCKS5 sunması ise paket bilgisinden doğrulanmalıdır. IPv6 Proxy paketinde SOCKS5 paket özelliği olarak listelenmemiştir; gerekiyorsa sipariş öncesi destekten teyit alın.

SOCKS5'in sınırları

  • Şifreleme yok. Trafik ve parola, ek bir katman olmadan açık gider. HTTPS gibi uygulama katmanı şifrelemesi ayrıca gerekir.
  • İçerik görünürlüğü yok. HTTP başlığı eklemek ya da önbellek tutmak gibi işler SOCKS5'in kapsamı dışındadır.
  • Tek kimlik doğrulama kipi yaygın. Pratikte kullanıcı adı/parola ve kimlik doğrulamasız kip görülür; GSSAPI desteği istemci ve sunucuya bağlıdır.
  • Uygulama desteği değişir. UDP ASSOCIATE, IPv6 hedefleri ve socks5h davranışı yazılıma göre farklılaşır.
  • Hedef erişilebilirliği. Proxy IPv6 çıkışlıysa ve hedefin yalnızca A kaydı varsa, NAT64/DNS64 gibi bir çevirici yoksa hedefe ulaşılamaz. Bu konu SOCKS5'ten değil, çıkış ağından kaynaklanır.

Her kullanımda yasalara ve hedef sitenin kullanım koşullarına uyum sizin sorumluluğunuzdadır.

Kısaca

SOCKS5, hedef adresi ve portu alıp bağlantıyı kuran, sonra baytları aktaran sade bir protokoldür. El sıkışma üç aşamalıdır: yöntem seçimi, isteğe bağlı kimlik doğrulama, bağlantı isteği. DNS'in nerede çözüleceğini şema belirler (socks5h), şifreleme ise protokolün işi değildir. Ürün seçerken protokolü paket bilgisinden doğrulayın.

Sık sorulan sorular

SOCKS5 proxy nedir?

SOCKS5, RFC 1928 ile tanımlanan ve uygulama protokolünden bağımsız çalışan bir proxy protokolüdür. İstemci önce sunucuyla bir el sıkışma yapar, sonra hedefe bağlanmasını ister; sunucu bağlantıyı kurduktan sonra baytları olduğu gibi iki yöne aktarır.

socks5 ile socks5h arasındaki fark nedir?

curl belgesine göre socks5h:// şemasında alan adı proxy tarafından çözülür. Düz socks5:// şemasında çözümlemenin nerede yapılacağı istemciye bağlıdır; emin olmak için alan adının proxy'de çözülmesini istediğiniz yerde socks5h kullanın.

SOCKS5 trafiği şifreler mi?

Hayır. SOCKS5 bir şifreleme katmanı değildir. RFC 1929 kullanıcı adı ve parolanın düz metin gittiğini belirtir; HTTPS gibi uçtan uca şifreleme uygulama katmanında ayrıca sağlanır.

SOCKS5 UDP trafiğini taşır mı?

Protokol UDP ASSOCIATE komutuyla UDP aktarımını tanımlar, ancak her sunucu bunu uygulamaz. Bir üründe UDP desteği olup olmadığı ürün bilgisinden doğrulanmalıdır; ISP Proxy sayfasında SOCKS5 için UDP desteği belirtilmemiştir.

/128Ürün

HTTP & SOCKS5 Proxy ürününü inceleyin

ISP paketlerinde HTTP ve SOCKS5 protokol seçenekleri. Satışı Sağlam Proxy (saglamproxy.com) üzerinden yapılır.