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:
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.
-vproxy'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
-xile verilir. - Betik yazmaya uygun. Çıkış kodları,
--retry, zaman aşımları ve--write-outsayesinde bir shell betiği hataları kendisi yönetebilir. PHP'nincurl_*fonksiyonları da aynı seçenekleri kullanır. - Tek komutta birden çok URL.
sayfa[1-20].htmlya 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?
- cURL hedef siteye değil, proxy'ye bağlanır.
- 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. - HTTPS hedef, HTTP proxy: cURL
CONNECT example.com:443gönderir; kimlik bilgisi verdiyseniz yanınaProxy-Authorizationbaşlığını ekler. Proxy200ile 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. - 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. - 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:
-x, --proxy <[protocol://]host[:port]> Use this proxyx'in küçük olduğuna dikkat edin. Proxy ayrıntıları -x ya da --proxy ile verilir, ikisi aynı seçenektir:
curl -x "http://user:pass@pr.proxynet.io:8000" https://httpbin.org/iphttpbin.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şınahttp://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. -xyalnı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:
# 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/ipHTTPS 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-insecureHTTPS proxy'nin sertifika doğrulamasını kapatır.--proxy-cacert dosya.pemdaha 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:
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/ipKimlik 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:
curl -x "socks5h://user:pass@pr.proxynet.io:1080" https://httpbin.org/ip| Şema | Host adını kim çözer | Kullanıcı adı ve parola | Ne için |
|---|---|---|---|
http:// | Proxy | Evet | Scraping, API'ler, çoğu araç |
https:// | Proxy | Evet | TLS konuşan proxy portu |
socks5h:// | Proxy | Evet | Konuma uygun DNS ile SOCKS5 |
socks5:// | Sizin makineniz | Evet | Yalnız sizin DNS'inizin çözebildiği hedefler |
socks4a:// | Proxy | Yalnız kullanıcı kimliği | Eski SOCKS4 sunucuları |
socks4:// | Sizin makineniz | Yalnız kullanıcı kimliği | Eski 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öntem | Kapsam | Örnek |
|---|---|---|
-x | Tek komut | curl -x "http://user:pass@host:port" URL |
| Ortam değişkeni | Shell oturumu | export https_proxy="http://user:pass@host:port" |
.curlrc | O 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):
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:
* 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 200Proxy-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:
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/iphttp_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:
#!/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ğiurl = …satırlarını okur ve en sonda durmalıdır, çünkü--remote-name-allyalnız kendisinden sonra eklenen URL'lere uygulanır.--retry 3zaman 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 veRetry-Afterbaşlığına uyar.--max-timetakılan bir aktarımı durdurur;--failHTTP hatalarını 22 numaralı çıkış koduna çevirir.- Tüm URL'ler aynı sitedeyse
--parallel-maxdeğ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 407Kullanıcı adı ya da parola yanlış, özel karakterler kodlanmamış ya da IP adresiniz whitelist'te yok. Eski sürümlercurl: (56) Received HTTP code 407 from proxy after CONNECTyazar;http://hedeflerde ise doğrudan 407 durum kodunu alırsınız. Bkz. Scraping'de HTTP Hata Kodları.curl: (56) Proxy CONNECT abortedProxy bağlantıyı kapattı; testimizdehttp://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 servermesajı SOCKS kimlik bilgilerinin yanlış olduğunu söyler.curl: (28) Connection timed out after … millisecondsSüre içinde cevap gelmedi; bkz. Proxy Sunucusu Yanıt Vermiyor.curl: (35) …ya daSSL_ERROR_SYSCALLTLS el sıkışması başarısız oldu: düz bir proxy portunahttps://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.-kkullanmak yerine o proxy'nin CA sertifikasını kurun.- Proxy yok sayılıyor.
NO_PROXY, büyük harfliHTTP_PROXYya da başka bir.curlrcolup olmadığına bakın;-vcURL'ü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 etmek | curl -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ülmesi | socks5:// değil, socks5h:// |
| FTP, SMTP ya da HTTP dışı başka bir protokol | SOCKS5 ya da HTTP proxy ile -p |
| Bir shell oturumu boyunca proxy | export https_proxy=… ve küçük harfli http_proxy |
| Her çalıştırmada proxy | ~/.curlrc içinde proxy = "…" |
| Betiklerde parola olmasın | Panelde IP whitelist |
| Giriş akışı için aynı IP | Endpoint 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.




