cURL ile Proxy Nasıl Kullanılır?

Yayın tarihi:

13 dk okuma

Güncelleme:

PXNET
Yazar: PXNET
Neredeyse siyah zeminde soluk IP satırları; köşeleri artılı çerçevede Proxynet çarpı cURL, sağ altta INTEGRATION

Sağlayıcınızdan bir proxy adresi aldınız ve onu bir scraper'a, zamanlanmış bir göreve ya da CI hattına koymadan önce çalışıp çalışmadığını görmek istiyorsunuz. En hızlı kontrol cURL ile yapılır: tek komut isteği proxy üzerinden gönderir ve hedef sitenin gördüğü IP adresini ekrana basar. Aynı komut daha sonra olduğu gibi bir shell betiğine taşınabilir.

Bu yazıda -x seçeneğini, kullanıcı adı ve parolayı, SOCKS5 kullanımını, proxy'yi her komut için kalıcı hâle getirmeyi, yeniden deneme yapan bir indirme betiğini ve hata mesajlarının birebir metnini anlatıyoruz. Tüm komutları curl 8.21 ile yerel bir test proxy'si üzerinde çalıştırdık; seçeneklerin resmî açıklaması curl kılavuz sayfasında yer alıyor.

cURL nedir?

cURL (curl olarak okunur) sunuculara ve sunuculardan veri aktarımını kolaylaştıran bir komut satırı aracıdır. URL'lerle çalışır: sayfa ve dosya indirir, form ve API isteği gönderir, yanıtı ekrana basar ya da dosyaya kaydeder. Aktarımı asıl yapan libcurl adlı kütüphanedir; PHP ve başka birçok dil de aynı kütüphaneyi kullanır.

Her program komutu gibi cURL de belirli bir sözdizimine uyar:

bash
curl [seçenekler] [URL]

Sözdiziminin "seçenekler" kısmı komutun ne yapacağını belirler ve cURL'ün 250'den fazla seçeneği vardır. -o sayfa.html yanıtı bir dosyaya kaydeder, -I yalnız başlıkları getirir, -L yönlendirmeleri izler, -x ise proxy kullanır. Seçenekler büyük/küçük harfe duyarlıdır: -x proxy ayarlar, -X HTTP yöntemini belirler.

cURL macOS'ta, Windows 10 ve 11'de curl.exe adıyla ve çoğu Linux dağıtımında kurulu gelir. Küçük container imajlarında ayrıca kurmanız gerekebilir (Debian ve Ubuntu'da apt install curl). curl --version komutunu çalıştırın: Features: satırında HTTPS-proxy görünüyorsa kurulumunuz proxy'ye TLS üzerinden de bağlanabilir.

cURL hangi protokolleri destekler?

cURL yalnız URL ile yazılabilen protokollerle çalışır; URL'si olmayan ağ protokollerini desteklemez. Güncel sürümün listesi şöyle: DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS ve WSS. Kendi kurulumunuzun neleri desteklediğini curl --version gösterir. Eski listelerde geçen RTMP artık yok.

URL'de şema yazmazsanız cURL protokolü host adından tahmin eder: ftp.example.com FTP olarak, adların çoğu HTTP olarak yorumlanır. Proxy açısından önemli olan şudur: HTTP proxy, HTTP ve HTTPS trafiğini taşır. Diğer protokoller ancak bir CONNECT tüneliyle (-p) ve proxy o porta izin veriyorsa geçer. SOCKS5 ise her TCP bağlantısını taşır; bu yüzden FTP ya da SMTP'yi proxy üzerinden kullanmak genellikle SOCKS5 demektir.

Neden cURL ile proxy kullanılır?

  • Her adım görünür. -v proxy'ye bağlantıyı, CONNECT isteğini ve iki tarafın cevabını ekrana basar. Neyin gönderildiğini ve neyin geldiğini gördüğünüz için isteğin hangi adımda takıldığını hemen anlarsınız.
  • Tüm proxy türleri tek seçenekte. HTTP, HTTPS, SOCKS4, SOCKS4a, SOCKS5 ve SOCKS5h proxy'lerin hepsi -x ile verilir.
  • Betik yazmaya uygun. Çıkış kodları, --retry, zaman aşımları ve --write-out sayesinde bir shell betiği hataları kendisi yönetebilir. PHP'nin curl_* fonksiyonları da aynı seçenekleri kullanır.
  • Tek komutta birden çok URL. sayfa[1-20].html ya da {a,b,c} gibi parantezli URL kalıpları birden çok isteğe dönüşür ve bu isteklerin hepsi aynı proxy'den geçer.

Tipik işler: bir veri kazıma çalışmasından önce çıkış IP'sinin ülkesini kontrol etmek, fiyat takibi hedeflerini başka bir pazardan denemek ve zamanlanmış görevlerde dosya indirmek. Bu komutların Node.js karşılıkları JavaScript'te cURL yazısında, PHP karşılıkları PHP ile Siteden Veri Çekme yazısında.

cURL isteği proxy üzerinden nasıl gönderir?

  1. cURL hedef siteye değil, proxy'ye bağlanır.
  2. HTTP hedef, HTTP proxy: cURL isteği tam URL ile gönderir (GET http://example.com/ HTTP/1.1). Proxy isteğin içeriğini okuyabilir.
  3. HTTPS hedef, HTTP proxy: cURL CONNECT example.com:443 gönderir; kimlik bilgisi verdiyseniz yanına Proxy-Authorization başlığını ekler. Proxy 200 ile cevap verdikten sonra hedefle TLS bağlantısı bu tünelin içinde kurulur, proxy yalnız host ve portu görür. CONNECT yöntemi RFC 9110'da tanımlıdır.
  4. SOCKS5 proxy: cURL oturum açar (kullanıcı adı ve parola verildiyse onlarla) ve proxy'den hedefe bağlanmasını ister (RFC 1928). socks5:// ile kendi çözdüğü IP adresini, socks5h:// ile host adını gönderir.
  5. Hedef site proxy'nin IP'sine cevap verir. Sizin IP'niz hedefe ulaşmaz. Ancak cURL adları yerelde çözüyorsa DNS sorgularınız kendi DNS sunucunuzdan çıkar ve hedefin ad sunucusuna kadar gidebilir.

cURL'de proxy nasıl ayarlanır: -x seçeneği

Terminali açın ve curl --help proxy yazıp Enter tuşuna basın. Çıktı proxy ile ilgili tüm seçenekleri listeler; asıl olanı şöyle görünür:

text
 -x, --proxy <[protocol://]host[:port]>  Use this proxy

x'in küçük olduğuna dikkat edin. Proxy ayrıntıları -x ya da --proxy ile verilir, ikisi aynı seçenektir:

bash
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip

httpbin.org/ip proxy testleri için kullanışlıdır, çünkü isteğin geldiği IP adresini döndürür. Proxy doğru çalışıyorsa sayfa sizin makinenizin adresini değil, proxy'nin çıkış IP'sini gösterir.

  • Şema yazılmazsa HTTP kabul edilir. -x "user:pass@pr.proxynet.io:8000" yazmakla adresin başına http:// eklemek aynı sonucu verir.
  • Portu her zaman yazın. Yazmazsanız cURL varsayılan bir port seçer: curl 8.21 testimizde http:// için 80, https:// için 443, SOCKS için 1080 denendi (kılavuz hâlâ 1080 diyor). Bunların sağlayıcınızın portu olma ihtimali düşüktür; bağlantı hata verir ya da zaman aşımına uğrar.
  • Adresi tırnak içine alın. Böylece shell &, ? ya da ! karakterlerini yorumlamaya kalkmaz ve URL'deki özel karakterler bozulmaz.
  • -x yalnız o komut için geçerlidir ve proxy ortam değişkenlerini geçersiz kılar. Sonraki komut yine doğrudan çıkar.

Proxynet'in residential ve mobil ürünlerinde tek bir gateway, HTTP ve SOCKS5'e ayrı portlardan hizmet verir. Kullanıcı adını panelin Endpoint Oluşturucu'su seçtiğiniz ülke, şehir ve oturuma göre hazırlar.

HTTP veya HTTPS proxy ile cURL nasıl kullanılır?

HTTP proxy iki tür hedefi de taşır:

bash
# HTTPS hedef: CONNECT tüneli, sayfa şifreli kalır
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip

# HTTP hedef: proxy düz isteği iletir
curl -x "http://user:pass@pr.proxynet.io:8000" http://httpbin.org/ip

HTTPS proxy (https://) proxy'nin kendisiyle olan bağlantıyı da şifreler. Bunu yalnız port TLS konuşuyorsa kullanın; düz HTTP portuna https:// ile bağlanmaya çalışırsanız el sıkışma aşamasında hata alırsınız (Windows'ta SEC_E_INVALID_TOKEN, OpenSSL'de genellikle wrong version number).

Sertifika seçenekleri iki bağlantı için ayrıdır:

  • -k (--insecure) yalnız hedef sitenin sertifika doğrulamasını kapatır. http:// hedefte hiçbir etkisi yoktur.
  • --proxy-insecure HTTPS proxy'nin sertifika doğrulamasını kapatır. --proxy-cacert dosya.pem daha güvenlidir: doğrulamayı kapatmadan şirket proxy'sinin CA sertifikasına güvenmenizi sağlar.

-k'yi yalnız hızlı testlerde kullanın, token gönderen betiklere koymayın. HTTP dışındaki protokolleri HTTP proxy üzerinden geçirmek için -p (--proxytunnel) ekleyin. Şifreli trafiğin proxy'den nasıl geçtiğini HTTPS Proxy sayfasında bulabilirsiniz.

Proxy kullanıcı adı ve parolası nasıl verilir?

İki yazım da aynı Proxy-Authorization başlığını gönderir:

bash
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/ip
curl -x "http://pr.proxynet.io:8000" -U "user:pass" https://httpbin.org/ip

Kimlik bilgisini adresin içine yazıyorsanız paroladaki özel karakterleri yüzde kodlamasıyla yazmanız gerekir: @ yerine %40, : yerine %3A, # yerine %23. cURL bunları göndermeden önce çözer; testimizde p%40ss proxy'ye p@ss olarak ulaştı. -U (--proxy-user) ile kodlama gerekmez. Varsayılan yöntem Basic kimlik doğrulamadır; şirket proxy'leri --proxy-ntlm, --proxy-digest ya da --proxy-anyauth isteyebilir.

Komut satırına yazılan parolalar shell geçmişine kaydedilir. Betiklerde parolayı yalnız sizin okuyabildiğiniz bir yapılandırma dosyasından okuyun (-K dosya) ya da onun yerine IP whitelist (izinli IP listesi) kullanın; Proxynet en fazla 10 IP kabul eder. Proxy Kimlik Doğrulama: User:Pass ve IP Whitelist yazısı iki yöntemi karşılaştırıyor ve 407 hatasını açıklıyor.

SOCKS5 proxy ile cURL nasıl kullanılır?

SOCKS sürümünü şema olarak yazın:

bash
curl -x "socks5h://user:pass@pr.proxynet.io:1080" https://httpbin.org/ip
ŞemaHost adını kim çözerKullanıcı adı ve parolaNe için
http://ProxyEvetScraping, API'ler, çoğu araç
https://ProxyEvetTLS konuşan proxy portu
socks5h://ProxyEvetKonuma uygun DNS ile SOCKS5
socks5://Sizin makinenizEvetYalnız sizin DNS'inizin çözebildiği hedefler
socks4a://ProxyYalnız kullanıcı kimliğiEski SOCKS4 sunucuları
socks4://Sizin makinenizYalnız kullanıcı kimliğiEski SOCKS4 sunucuları

socks5:// kullandığınızda DNS sunucunuz ziyaret ettiğiniz her host'u görür ve konuma göre içerik sunan siteler sizin bulunduğunuz yere göre cevap verir. socks5h:// ikisini de önler; bunun neden önemli olduğunu WebRTC ve DNS Sızıntısı yazısında anlatıyoruz. Eski --socks5-hostname host:port seçeneği socks5h:// ile aynıdır; kimlik bilgisi -U ile verilir. --socks5 ise yerel DNS kullanır, yani socks5:// karşılığıdır.

Protokol farkları için SOCKS ve HTTP Proxy Farkı ve SOCKS5 Proxyler Nedir? yazılarına bakabilirsiniz. Proxynet SOCKS5 Proxy hizmeti HTTP portunun yanında kendi portunda çalışır.

Proxy her cURL komutunda nasıl kullanılır?

YöntemKapsamÖrnek
-xTek komutcurl -x "http://user:pass@host:port" URL
Ortam değişkeniShell oturumuexport https_proxy="http://user:pass@host:port"
.curlrcO kullanıcının her çalıştırmasıproxy = "http://host:port"

Ortam değişkenleri. cURL HTTP hedefler için http_proxy, HTTPS hedefler için https_proxy ya da HTTPS_PROXY, geri kalanlar için yedek olarak ALL_PROXY değişkenini okur. http_proxy yalnız küçük harfle çalışır (CGI programlarını korumak için), bu yüzden Linux ve macOS'ta HTTP_PROXY yok sayılır. PowerShell'de: $env:HTTPS_PROXY = "http://user:pass@host:port". wget, pip ve git aynı değişkenleri okur; ayrıntılar wget ile Proxy Kullanımı yazısında ve everything curl'ün proxy değişkenleri sayfasında.

Yapılandırma dosyası. cURL her çalıştırmadan önce ~/.curlrc dosyasını okur (Windows'ta %USERPROFILE%\.curlrc ya da _curlrc):

text
proxy = "http://pr.proxynet.io:8000"
proxy-user = "user:pass"

Dosyayı tek bir çalıştırmada atlamak için curl -q URL yazın; -q ilk seçenek olmalıdır.

İstisnalar. --noproxy "localhost,.internal.example" ya da NO_PROXY değişkeni bu host'lara doğrudan bağlanır. Bir ad alt alan adlarını da kapsar, 192.168.0.0/16 gibi CIDR aralıkları çalışır ve tek joker karakter yalnız başına yazılmış *'tır. NO_PROXY, -x kullanıldığında da geçerlidir.

cURL'ün JavaScript motoru olmadığı için PAC dosyalarını çalıştıramaz. Ağınız PAC dosyası kullanıyorsa dosyayı okuyun (PAC Dosyası Nedir ve Nasıl Yazılır?) ve döndürdüğü proxy'yi -x ile verin.

cURL'ün proxy kullandığı nasıl kontrol edilir?

curl https://api.ipify.org komutunu önce -x olmadan, sonra -x ile çalıştırın: ikinci komut farklı bir adres döndürüyorsa ve bu adres beklediğiniz ülkedeyse proxy çalışıyordur. HTTP proxy üzerinden sorunsuz giden bir HTTPS isteğinde -v çıktısında şu satırlar görünür:

text
* Establishing HTTP proxy tunnel to httpbin.org:443
> CONNECT httpbin.org:443 HTTP/1.1
> Proxy-Authorization: Basic dXNlcjpwYXNz
< HTTP/1.1 200 Connection Established
* CONNECT tunnel established, response 200

Proxy-Authorization değeri yalnız Base64 ile kodlanmıştır, şifreli değildir; çıktıyı paylaşmadan önce silin. Betiklerde -w sonucu tek satırda verir:

bash
curl -s -o /dev/null -x "http://user:pass@pr.proxynet.io:8000" \
  -w "%{http_code} connect=%{http_connect} proxy_used=%{proxy_used}\n" https://httpbin.org/ip

http_connect proxy'nin CONNECT isteğine verdiği cevaptır; proxy_used (curl 8.7 ve sonrası) proxy kullanıldıysa 1 olur. Konum, hız ve sızıntı kontrolleri için Proxy Nasıl Test Edilir? yazısına bakın.

Örnek: URL listesini proxy üzerinden yeniden denemeyle indirmek

Bu betik urls.txt dosyasındaki URL'leri proxy üzerinden aynı anda dörder dörder indirir, geçici hataları yeniden dener ve her isteğin durum kodunu ve süresini yazar. cURL ve bir POSIX shell (Linux, macOS ya da Git Bash) yeterlidir:

bash
#!/usr/bin/env bash
# fetch.sh: urls.txt içindeki her URL'yi proxy üzerinden, aynı anda 4 tane indirir
set -u
PROXY="${PROXY:-http://user:pass@pr.proxynet.io:8000}"

sed 's/^/url = /' urls.txt | curl \
  --parallel --parallel-max 4 \
  --proxy "$PROXY" \
  --connect-timeout 10 --max-time 30 \
  --retry 3 --retry-connrefused \
  --fail --silent --show-error \
  --create-dirs --output-dir pages --remote-name-all \
  --write-out "%{http_code} %{time_total}s %{url}\n" \
  --config -
  • --config -, sed'in ürettiği url = … satırlarını okur ve en sonda durmalıdır, çünkü --remote-name-all yalnız kendisinden sonra eklenen URL'lere uygulanır.
  • --retry 3 zaman aşımlarını ve HTTP 408, 429, 500, 502, 503, 504, 522 ve 524 cevaplarını yeniden dener; araya 1, 2 ve 4 saniye koyar ve Retry-After başlığına uyar.
  • --max-time takılan bir aktarımı durdurur; --fail HTTP hatalarını 22 numaralı çıkış koduna çevirir.
  • Tüm URL'ler aynı sitedeyse --parallel-max değerini düşük tutun; çok fazla paralel istek 429 cevaplarına yol açabilir.

Testimizde dört sayfa kaydedildi, 503 dönen URL üç kez yeniden denendi ve betik 22 koduyla çıktı.

Gateway'inizin IP değiştirip değiştirmediğini görmek için api.ipify.org'a aynı isteği birkaç kez gönderin: rotating gateway her seferinde yeni bir IP döndürür, sticky oturum ise Proxynet'te 1-60 dakika boyunca aynı IP'yi korur. Hangisinin ne zaman kullanılacağını IP Rotasyonu Nedir ve Nasıl Çalışır? yazısı anlatıyor; Residential Proxy ikisini de destekler.

Sık görülen cURL proxy hataları ve çözümleri

Mesajlar, testlerimizde curl 8.21'in yazdığı hâliyle:

  • curl: (5) Could not resolve proxy: … Proxy host adı yanlış: yazımını ve fazladan tırnak olup olmadığını kontrol edin.
  • curl: (7) Failed to connect to … over proxy … O portta cevap veren yok (ya da port yazılmadığı için cURL varsayılan bir porta gitti) veya bir güvenlik duvarı bağlantıyı engelliyor.
  • curl: (7) CONNECT tunnel failed, response 407 Kullanıcı adı ya da parola yanlış, özel karakterler kodlanmamış ya da IP adresiniz whitelist'te yok. Eski sürümler curl: (56) Received HTTP code 407 from proxy after CONNECT yazar; http:// hedeflerde ise doğrudan 407 durum kodunu alırsınız. Bkz. Scraping'de HTTP Hata Kodları.
  • curl: (56) Proxy CONNECT aborted Proxy bağlantıyı kapattı; testimizde http:// adres bir SOCKS5 portuna yönelmişti.
  • curl: (97) Received invalid version in initial SOCKS5 response. socks5:// adres bir HTTP portunu gösteriyor. User was rejected by the SOCKS5 server mesajı SOCKS kimlik bilgilerinin yanlış olduğunu söyler.
  • curl: (28) Connection timed out after … milliseconds Süre içinde cevap gelmedi; bkz. Proxy Sunucusu Yanıt Vermiyor.
  • curl: (35) … ya da SSL_ERROR_SYSCALL TLS el sıkışması başarısız oldu: düz bir proxy portuna https:// ile bağlanılmış ya da aradaki bir cihaz TLS bağlantılarını kesiyor.
  • curl: (60) SSL certificate problem: unable to get local issuer certificate Çoğunlukla TLS trafiğini inceleyen bir şirket proxy'si vardır. -k kullanmak yerine o proxy'nin CA sertifikasını kurun.
  • Proxy yok sayılıyor. NO_PROXY, büyük harfli HTTP_PROXY ya da başka bir .curlrc olup olmadığına bakın; -v cURL'ün önce hangi adrese bağlanmaya çalıştığını gösterir. Aynı hataların Python'daki karşılığı Max Retries Exceeded With URL yazısında.

Karar rehberi

İhtiyaçÖneri
Yeni bir proxy'yi bir kez test etmekcurl -x "http://user:pass@host:port" https://httpbin.org/ip
Parolada @, : ya da # var-U "user:pass" ya da yüzde kodlaması
DNS'in proxy tarafında çözülmesisocks5:// değil, socks5h://
FTP, SMTP ya da HTTP dışı başka bir protokolSOCKS5 ya da HTTP proxy ile -p
Bir shell oturumu boyunca proxyexport https_proxy=… ve küçük harfli http_proxy
Her çalıştırmada proxy~/.curlrc içinde proxy = "…"
Betiklerde parola olmasınPanelde IP whitelist
Giriş akışı için aynı IPEndpoint Oluşturucu'dan sticky oturum

Sıkça sorulan sorular

cURL, Windows ya da macOS'taki sistem proxy ayarlarını kullanır mı?

Hayır. cURL proxy'yi yalnız -x seçeneğinden, ortam değişkenlerinden ve .curlrc dosyasından alır. Windows'ta Ayarlar'dan ya da macOS'ta Sistem Ayarları'ndan tanımlanan proxy cURL'ü etkilemez.

cURL'ün tek bir istekte proxy'yi atlaması nasıl sağlanır?

Komuta --noproxy "*" ya da -x "" ekleyin. https_proxy ya da .curlrc proxy tanımlasa bile ikisi de o komutu doğrudan gönderir.

cURL proxy komutum PowerShell'de neden çalışmıyor?

Windows PowerShell 5.1'de curl, -x seçeneğini tanımayan Invoke-WebRequest komutunun takma adıdır. Gerçek cURL'ü çalıştırmak için curl.exe yazın. PowerShell 7'de bu takma ad artık yok.

cURL'de socks5 ile socks5h arasındaki fark nedir?

socks5:// ile host adını sizin makineniz çözer; socks5h:// ile proxy çözer, böylece DNS sorgusu da proxy'nin konumundan yapılır.

PHP'de cURL ile proxy kullanılabilir mi?

Evet. PHP'nin cURL fonksiyonları libcurl'ü kullanır: CURLOPT_PROXY adresi, CURLOPT_PROXYUSERPWD kimlik bilgilerini, CURLOPT_PROXYTYPE SOCKS türünü belirler. Örnekler PHP ile Siteden Veri Çekme yazısında.

cURL her istekte proxy'yi değiştirebilir mi?

cURL her komutta tek bir proxy kullanır. Rotating gateway her bağlantıya yeni bir çıkış IP'si atadığı için komutları döngüyle çalıştırdığınızda her seferinde farklı bir IP alırsınız. Tek komuttaki birden çok URL ise genellikle aynı bağlantıyı kullanır ve aynı IP'yi paylaşır.

Özet

cURL ile proxy kullanmak için komuta -x seçeneğini ve tam adresi ekleyin: şema, kimlik bilgileri, host ve port. İşlerin çoğunda http://, uzak DNS'li SOCKS5 için socks5h:// kullanın; proxy her komutta gerekiyorsa onu https_proxy değişkenine ya da .curlrc dosyasına yazın, -k'yi testlerle sınırlı tutun. Bir komut hata verdiğinde çıkış kodu ve -v çıktısı sorunun adreste mi, kimlik bilgilerinde mi yoksa hedef sitede mi olduğunu gösterir. Bu komutlarla çalışan residential, mobil ve SOCKS5 uç noktaları için Proxynet proxy'lerine göz atabilirsiniz.

ChatGPT'ye sorClaude'a sor