Bir uygulamanın proxy kullanması, ağdaki her paketin proxy üzerinden gittiği anlamına gelmez. Bağlantıdan önce yapılan alan adı sorgusu (DNS) istemci tarafında kalmışsa, yerel ağınız ve DNS sağlayıcınız hangi siteye gitmek istediğinizi görmeye devam eder. Buna yaygın olarak DNS sızıntısı denir. Sorun çoğunlukla bir şema adındaki tek harfle, socks5 yerine socks5h yazmakla çözülür.
Sızıntı nasıl oluşur
Bir URL'ye bağlanmak iki ayrı işten oluşur: alan adını IP adresine çevirmek ve o adrese bağlanmak. Proxy kullanan bir istemci bu işlerden ilkini kendisi yaparsa, DNS sorgusu istemcinin işletim sistemi çözümleyicisinden çıkar ve yalnızca bağlantı proxy üzerinden kurulur. İstemci alan adını olduğu gibi proxy'ye verirse ad çözümü proxy tarafında yapılır.
| Senaryo | DNS sorgusu nereden çıkar | Proxy'ye giden |
|---|---|---|
socks5:// (cURL, PySocks) | İstemci makinesi | Hedef IP adresi |
socks5h:// (cURL, PySocks) | Proxy sunucusu | Alan adı |
| HTTP proxy | Proxy sunucusu | İstekteki veya CONNECT satırındaki alan adı |
socks5 ile socks5h
SOCKS5 isteği üç adres türü taşıyabilir: IPv4, IPv6 ve alan adı (RFC 1928, bölüm 5). socks5h şemasındaki h, "hostname" ifadesinden gelir ve istemciye ad çözümünü yapmamasını, alan adını proxy'ye iletmesini söyler. Şema adı kütüphaneden kütüphaneye aynı mantıkla kullanılır ancak ayrıntılar değişebilir; kullandığınız aracın belgesini kontrol edin.
# Ad çözümü yerel makinede yapılır (sızıntı riski)
curl --proxy socks5://KULLANICI:SIFRE@proxy.example.com:PORT https://example.com
# Ad çözümü proxy tarafında yapılır
curl --proxy socks5h://KULLANICI:SIFRE@proxy.example.com:PORT https://example.comPython requests ile aynı ayrım geçerlidir. requests[socks] eklentisi PySocks kullanır ve socks5h şemasını uzak çözüm olarak yorumlar.
import requests
# "socks5h" = alan adı proxy tarafında çözülür
proxy = "socks5h://KULLANICI:[email protected]:PORT"
r = requests.get(
"https://example.com",
proxies={"http": proxy, "https": proxy},
timeout=15,
)
print(r.status_code)Node.js tarafında socks-proxy-agent paketi de socks5h:// şemasında alan adını proxy'ye bırakır; socks5:// şemasında ad yerelde çözülür. Go'da golang.org/x/net/proxy ile kurulan SOCKS5 dialer, bağlantı adresi bir alan adıysa onu doğrudan proxy'ye iletir; yine de paket sürümünüzün davranışını aşağıdaki doğrulama yöntemiyle teyit etmeniz önerilir.
Tarayıcı ve uygulamalarda ayar
Tarayıcılarda ve masaüstü uygulamalarında davranış şema adıyla değil, ayarla belirlenir. Firefox'ta SOCKS v5 seçildiğinde "Proxy DNS when using SOCKS v5" seçeneği, ad çözümünü proxy'ye bırakır; bu seçenek kapalıysa sorgular yerelden çıkar. Diğer uygulamalarda benzer bir seçenek varsa açın; yoksa uygulamanın belgesine bakın.
Sızıntıyı doğrulama
En güvenilir yöntem, ağ arayüzündeki DNS trafiğini gözlemlemektir. Bir terminalde 53 numaralı porttaki paketleri dinlerken diğerinde isteği çalıştırın. Aşağıdaki komut bir Linux makinesini varsayar ve yönetici yetkisi ister.
# Terminal 1: yerel DNS sorgularını izle
sudo tcpdump -n -i any port 53
# Terminal 2: istek at
curl --proxy socks5h://KULLANICI:SIFRE@proxy.example.com:PORT https://example.comBeklenen sonuç, socks5h ile yapılan isteğin hedef alan adı için yerel arayüzde bir DNS sorgusu üretmemesidir. Aynı komutu socks5:// ile tekrarladığınızda sorgunun göründüğünü doğrulayabilirsiniz. Proxy sunucusunun adının kendisi (proxy.example.com) yerelde çözüldüğü için o sorgu her iki durumda da görünür; bu beklenen davranıştır.
Uzak çözümün sonuçları
- Yerel ağ ve yerel DNS sağlayıcısı, proxy üzerinden erişilen alan adlarını sorgu olarak görmez.
- Ad çözümünü proxy yapar; dönen IP, proxy çıkış noktasının bulunduğu ağın çözümleyicisine bağlıdır. Konuma göre farklı adres dönen servislerde bu fark görülebilir.
- Yerel
hostsdosyası ve yerel DNS filtreleri bu yolda devreye girmez. - Proxy sunucusu ad çözümlemesinde başarısız olursa SOCKS5 cevabında
0x04(ana makineye ulaşılamıyor) gibi bir hata kodu döner; sorun yerel DNS'te değil proxy tarafındadır.
Özet
- Proxy üzerinden bağlanmak, DNS sorgusunun da proxy üzerinden gittiği anlamına gelmez.
socks5://ad çözümünü istemcide,socks5h://proxy'de yapar.- HTTP proxy ile alan adı proxy'ye iletildiği için ad çözümü proxy tarafında olur.
- Davranışı
tcpdumpgibi bir araçla gözlemleyerek doğrulayın. - DNS sızıntısını kapatmak tek başına tam gizlilik sağlamaz.