PAC Dosyası Nedir ve Nasıl Yazılır? FindProxyForURL Örneği

Yayın tarihi:

12 dk okuma

Acar Diveroli
Yazar: Acar Diveroli
Tek bir karar düğümünden DIRECT, PROXY ve SOCKS5 dallarına açılan çizgi rotalar; hedef alan adına giden PROXY rotası mavi.

Küçük bir fiyat takibi ekibi, bir residential proxy'yi Windows'ta sistem proxy'si olarak tanımlıyor. Birkaç gün sonra kullanım sayfasında, işin gerektirdiğinden çok daha fazla gigabayt görünüyor. Tarayıcı güncellemeleri, görüntülü görüşmeler ve web postası da proxy'den geçmiş; oysa başka bir IP adresinden görülmesi gereken yalnızca iki rakip mağazaydı. Ekibin ihtiyacı, "bu siteler proxy'den, geri kalan her şey doğrudan" diyen bir kuraldı. O kuralın adı PAC dosyası.

Bu yazıda PAC dosyasının (proxy auto-config, yani proxy otomatik yapılandırma dosyası) ne olduğunu, tarayıcının onu nasıl çalıştırdığını ve FindProxyForURL fonksiyonunun neler döndürebileceğini anlatıyoruz. Ardından yardımcı fonksiyonları ve tuzaklarını, yalnızca hedef siteleri proxy'den geçiren denenmiş bir örneği, WPAD'i ve risklerini, dosyanın neden şifre taşıyamadığını ve aynı kuralın proxy trafiğini nasıl azalttığını ele alıyoruz.

PAC dosyası nedir?

PAC dosyası, tek bir fonksiyon tanımlayan düz metin bir JavaScript dosyasıdır: FindProxyForURL(url, host). Fonksiyon, tarayıcının açmak üzere olduğu adresi alır ve isteğin hangi yoldan gideceğini söyleyen bir metin döndürür. Netscape bu özelliği, JavaScript'i de ilk kez getiren Navigator 2.0 sürümüne eklemişti.

PAC'in bir RFC'si ya da resmî bir standardı yoktur. Her tarayıcı kendi uygulamasıyla gelir ve ayrıntılar birbirinden farklıdır. MDN'nin PAC dosyası sayfası ortak noktaları anlatır; application/x-ns-proxy-autoconfig MIME türü de orada yazılıdır. Dosya genellikle .pac uzantısıyla biter; WPAD ile bulunduğunda adı wpad.dat olur.

Elle girilen proxy ayarı bütün trafiği tek bir proxy'ye gönderir. PAC dosyası ise kararı her istek için yeniden verir; böylece aynı tarayıcı bir mağazaya proxy üzerinden, şirketin iç wiki'sine doğrudan bağlanabilir.

Tarayıcı PAC dosyasını nasıl kullanır?

  1. Dosyayı indirir. Tarayıcı dosyayı sizin girdiğiniz adresten ya da WPAD'in bulduğu adresten alır. Chrome dosyayı her zaman doğrudan, hiçbir proxy'ye uğramadan çeker; 30 saniye içinde HTTP 200 yanıtı ve 1 MB'tan küçük bir gövde bekler.
  2. Her istekten önce fonksiyonu çağırır. Chrome, https:// adreslerinde önce yolu ve sorgu dizesini siler; fonksiyon tam adresi değil, https://store.example/ biçimini görür. Chrome bunu 52. sürümde başlattı, 75. sürümden beri de kapatılamıyor.
  3. Cevabı soldan sağa okur. Metin noktalı virgüllerden bölünür. Tarayıcı ilk girdiyi dener ve bir sonrakine yalnızca o proxy'ye ulaşamazsa geçer.
  4. Çalışmayan proxy'yi kenara ayırır. Bu proxy bir süreliğine listenin sonuna gider. Sürenin uzunluğu tarayıcıya göre değişir, bu yüzden kurallarınızı sabit bir süreye göre kurmayın.
  5. Dosya yoksa bir sonraki seçeneğe geçer. Chrome dosyayı alamazsa uyarı vermeden sıradaki ayara, genellikle doğrudan bağlantıya döner. İsteklerin doğrudan gitmek yerine başarısız olması için PAC betiğinin zorunlu (mandatory) olarak işaretlenmesi gerekir. Bizim testimizde sözdizimi hatalı bir dosya da Chrome'u doğrudan bağlantıya düşürdü.

Kuralların tamamı Chromium'un proxy desteği belgesinde yer alıyor.

FindProxyForURL ne döndürebilir?

Fonksiyon tek bir metin döndürür. Her girdi bir anahtar sözcükle başlar; proxy girdilerinde sözcüğün ardından host:port gelir.

Dönüş değeriNe yaparDestek (kaynak)Dikkat
DIRECTProxy'siz bağlanırStandart anahtar sözcük (MDN)Bir hedef kuralında yedek olarak yazılırsa isteği gerçek IP'nizden gönderir
PROXY pr.proxynet.io:8000HTTP proxy kullanırStandart anahtar sözcük (MDN, Chromium)Proxy şifre isterse tarayıcı 407 giriş penceresi açar
SOCKS5 pr.proxynet.io:1080SOCKS5 proxy kullanırChrome ve Firefox (Chromium, MDN)Chrome SOCKS5 kimlik bilgisi göndermez, proxy'nin IP'nize izin vermesi gerekir
HTTPS proxy.example:443TLS ile bağlanılan bir proxy kullanırChrome ve Firefox (Chromium, MDN)Proxy o portta TLS konuşmalıdır
SOCKS proxy.example:1080Bir SOCKS sunucusu kullanırStandart anahtar sözcük (MDN)Chrome yalın SOCKS yazımını SOCKS4 olarak okur

Firefox HTTP host:port ve SOCKS4 host:port yazımlarını da kabul eder, ama Chrome'un ayrıştırıcısı HTTP sözcüğünü tanımaz; her yerde çalışan yazım PROXY'dir. Chrome anahtar sözcüklerde büyük-küçük harf ayrımı yapmaz; MDN onları büyük harfle yazar, biz de öyle yazıyoruz.

"PROXY a.example:8000; PROXY b.example:8000; DIRECT" gibi bir zincirin anlamı şudur: önce birinci proxy'yi dene, sonra ikincisini, ikisi de çalışmıyorsa doğrudan bağlan. Bu son adım genel gezinmede sorun çıkarmaz, veri toplamada ise yanlıştır. İki proxy türü arasındaki protokol farkını SOCKS ve HTTP Proxy Farkı yazımızda anlattık.

PAC dosyasında hangi yardımcı fonksiyonlar kullanılabilir?

Yerleşik fonksiyonlar iki gruba ayrılır.

Metin karşılaştıranlar, hızlı ve güvenli: shExpMatch (kabuktaki gibi * ve ? desenleri), dnsDomainIs, isPlainHostName (adında nokta olmayan host), localHostOrDomainIs, dnsDomainLevels ve zaman fonksiyonları weekdayRange, dateRange ile timeRange.

DNS'e soranlar: dnsResolve, isResolvable ve IP adresi yerine host adı aldığında isInNet. MDN, bu fonksiyonların DNS sunucusuna başvurmak zorunda olduğunu ve nadiren gerektiğini belirtir.

Sık görülen üç tuzağı, PAC dosyalarını QuickJS motorunda çalıştıran pacparser ile denedik:

  • dnsDomainIs(host, "shop.example") yalnızca metnin sonunu karşılaştırır, bu yüzden evilshop.example de eşleşir.
  • dnsDomainIs(host, ".shop.example") bunu düzeltir, ama bu kez yalın shop.example eşleşmez. İkisini birlikte kontrol edin: host === "shop.example" || dnsDomainIs(host, ".shop.example").
  • shExpMatch(host, "*.panel.example"), panel.example adresinin kendisiyle eşleşmez.

myIpAddress() birden fazla ağ arayüzü olan bir makinede yanlış adres döndürebilir. Makinenin kendi IP'sine dayanan kurallardan kaçının.

Yalnızca hedef siteleri proxy'den geçiren PAC dosyası nasıl yazılır?

Girişteki senaryo tek bir dosyada şöyle görünüyor. Fiyat takibi hedefleri ve alt alan adları bir Residential Proxy üzerinden gider. Hep aynı IP adresinden açılması gereken bir panel, önce bir SOCKS5 proxy'den geçer, yedekte bir HTTP proxy bekler. Geri kalan her şey doğrudan bağlanır. .example alan adlarını kendi alan adlarınızla değiştirin.

js
// proxy.pac: yalnızca listedeki siteler proxy kullanır, geri kalan her şey doğrudan gider.
function FindProxyForURL(url, host) {
  host = host.toLowerCase();

  // 1. Noktasız adlar (intranet, yazıcı) ve localhost: her zaman doğrudan.
  if (isPlainHostName(host) || host === "localhost") {
    return "DIRECT";
  }

  // 2. Özel ve loopback IP adresleri: doğrudan. Regex kontrolü sayesinde
  //    isInNet yalnızca IP adresi görür, bu yüzden DNS'e hiç sormaz.
  if (/^\d{1,3}(\.\d{1,3}){3}$/.test(host) &&
      (isInNet(host, "10.0.0.0", "255.0.0.0") ||
       isInNet(host, "172.16.0.0", "255.240.0.0") ||
       isInNet(host, "192.168.0.0", "255.255.0.0") ||
       isInNet(host, "127.0.0.0", "255.0.0.0"))) {
    return "DIRECT";
  }

  // 3. Fiyat takibi hedefleri ve alt alan adları: residential proxy.
  //    Sonda "; DIRECT" yok: proxy çalışmazsa istek sizin IP adresinizden
  //    çıkmak yerine başarısız olur.
  var targets = ["shop.example", "store.example"];
  for (var i = 0; i < targets.length; i++) {
    if (host === targets[i] || dnsDomainIs(host, "." + targets[i])) {
      return "PROXY pr.proxynet.io:8000";
    }
  }

  // 4. Hep aynı IP'yi kullanması gereken panel: önce SOCKS5, yedekte HTTP.
  //    Buraya statik ISP proxy'nizin host ve port bilgilerini yazın.
  if (host === "panel.example" || shExpMatch(host, "*.panel.example")) {
    return "SOCKS5 pr.proxynet.io:1080; PROXY pr.proxynet.io:8000";
  }

  // 5. Geri kalan her şey: doğrudan.
  return "DIRECT";
}

Host önce küçük harfe çevrilir, çünkü yardımcı fonksiyonlar metinleri birebir karşılaştırır. isInNet ancak regex bir IP adresi olduğunu doğruladıktan sonra çalışır; böylece betik hiçbir zaman DNS'i beklemez. Kodda var ve sade döngüler kullandık, çünkü her PAC motoru modern JavaScript çalıştırmaz. PAC dosyasında yeniden deneme mekanizması noktalı virgül zinciridir; kod içindeki yeniden deneme mantığı ise scraper'ın işidir (Scraping'de HTTP Hata Kodları).

Nasıl test ettik?

Dosyayı Python 3.13 üzerinde pacparser 1.5.2 ile on host için çalıştırdık; WWW.Shop.Example (proxy) ve notshop.example (doğrudan) dahil hepsi beklenen yolu döndürdü. Ardından dosyayı application/x-ns-proxy-autoconfig türüyle yerelde sunduk, içindeki proxy adreslerini iki yerel test proxy'sine yönlendirdik ve Chrome 154'ü --proxy-pac-url parametresiyle açtık. Hedef host'lar HTTP proxy'ye ulaştı, diğerleri doğrudan gitti. Panelde Chrome önce SOCKS5'i denedi ve yalnızca "kimlik doğrulama yok" yöntemini önerdi, ardından HTTP yedeğine geçti. Tek bir süslü parantezi eksik bir kopya ise her isteği uyarı vermeden doğrudan gönderdi.

Cihaz ya da tarayıcı PAC dosyasına nasıl yönlendirilir?

Dosyayı bir web sunucusundan, mümkünse HTTPS üzerinden ve MDN'nin istediği Content-Type ile sunun. Ardından adresini girin:

Tek bir tarayıcıda birkaç profil arasında geçiş yapmak için çoğu zaman bir eklenti daha pratiktir (SwitchyOmega). Bir iş bilgisayarında PAC adresiyle karşılaştıysanız proxy sunucu adresi nasıl bulunur yazımıza bakın.

WPAD nedir ve neden risklidir?

WPAD (Web Proxy Auto-Discovery), "Ayarları otomatik olarak algıla" anahtarının arkasındaki mekanizmadır: istemci ağda bir PAC dosyası arar. 1999 tarihli WPAD taslağı birkaç bulma yöntemi sayar; istemciler ise çoğunlukla ikisini kullanır: adresi dağıtan DHCP seçeneği 252 ve wpad adlı bir host için yapılan DNS sorguları. pc1.sales.corp.example adlı bir makine önce wpad.sales.corp.example, sonra wpad.corp.example adını sorar ve yanıt veren ilk addan /wpad.dat dosyasını ister. Chrome DHCP'yi DNS'ten önce dener, ama DHCP yöntemini yalnızca Windows ve ChromeOS'ta destekler. Taslak, RFC olamadan süresini doldurdu.

İstemci, kim yanıt verirse ona güvenir. Otomatik algılaması açık bir dizüstü bilgisayar bir kafenin ağına bağlanırsa ya da WPAD sorgusu genel DNS'e sızarsa, yabancı birinin sunucusu ona bir PAC dosyası verip trafiğini istediği yere yönlendirebilir. CISA'nın TA16-144A uyarısı, yeni üst düzey alan adlarının bu ad çakışmalarını nasıl kolaylaştırdığını anlatır.

Makinelerinizi korumak için:

  • Gerekmeyen yerlerde otomatik algılamayı kapatın, özellikle ofis dışına çıkan dizüstü bilgisayarlarda.
  • PAC adresini HTTPS üzerinden, açıkça yazarak girin.
  • Windows 10 sürüm 1809, Windows Server 2019 ve sonrasında, Microsoft'un belgelediği gibi DisableWpad kayıt defteri değerini 1 yapın. Tarayıcılar Ayarlar'daki algılama anahtarını okuduğu için onu da kapatın.
  • CISA'nın önerdiği gibi, dışarı giden wpad.dat isteklerini güvenlik duvarında kaydedin ve engelleyin (Proxy ve Firewall Farkı).

PAC dosyasına neden kullanıcı adı ve şifre yazılamaz?

PAC dosyası tek bir soruyu cevaplar: bu istek nereye gitmeli? Bir anahtar sözcük, bir host ve bir port döndürür; kimlik bilgisi için bir alanı yoktur.

HTTP proxy şifre isterse 407 yanıtı verir ve tarayıcı bir giriş penceresi açar. Chrome SOCKS5 için hiçbir kimlik doğrulama yöntemini desteklemez, bu yüzden bir SOCKS5 girdisi ancak proxy IP'nize izin veriyorsa çalışır. Otomatik işlerde ve SOCKS5'te pratik yol IP whitelist ile kimlik doğrulamadır: dışarı çıktığınız IP adresini proxy hesabınızdaki izin listesine eklersiniz. Bu sınırı aşmak için kimlik bilgilerini URL'lerin içine yazmayın. İki yöntemi, IP adresiniz değiştiğinde ne olacağı dahil, Proxy Kimlik Doğrulama: User:Pass ve IP Whitelist yazımızda karşılaştırdık.

PAC dosyası proxy trafiğini ve maliyeti nasıl düşürür?

Residential ve mobil proxy'ler gigabayt başına, ISP ve datacenter proxy'ler IP adresi başına faturalanır. Sistem genelinde tanımlanmış bir proxy'de güncellemeler, görüntülü görüşmeler ve indirmeler de faturaya girer. PAC dosyası residential proxy'den yalnızca hedef alan adlarını geçirir; faturalanan gigabaytlar da yalnızca işin kendisini kapsar.

Oturumlar boyunca aynı adreste kalması gereken bir panel için IP başına faturalanan bir ürün daha uygundur: bir ISP Proxy ya da IP'nizin whitelist'e eklendiği bir SOCKS5 Proxy.

Kullanım alanları

  • Fiyat takibi: yalnızca izlediğiniz mağazalar proxy'yi kullanır; bunu sitelerin robots.txt kurallarına uyarak ve ölçülü bir istek hızıyla yaparsınız (rakip fiyat takibi).
  • Ofis ağları: iç adresler doğrudan gider, dış trafik Squid gibi bir şirket proxy'sinden geçer (Squid proxy kurulumu).
  • Ülkeye özel kontroller: her hedef alan adı ihtiyaç duyduğu çıkış türünü alır (residential ve datacenter proxy farkları).
  • Yeni bir proxy'yi denemek: normal gezinme doğrudan sürerken yalnızca bir test alan adı proxy'den geçer (proxy nasıl test edilir).
  • Sızıntı kontrolleri: PAC kuralı tarayıcı isteklerini kapsar, ama WebRTC ve DNS adresinizi yine de açığa çıkarabilir (WebRTC ve DNS sızıntısı).
  • Yerel proxy'ler: 127.0.0.1:8080 üzerindeki bir hata ayıklama proxy'sine yalnızca incelediğiniz alan adları gider (8080 portu).

Sık yapılan hatalar

Bunlar PAC dosyalarına özgü hatalardır; genel bağlantı hataları için Proxy Sunucusu Yanıt Vermiyor yazımıza bakın.

  • Yanlış MIME türü ya da eksik dosya. MDN, sunucuların application/x-ns-proxy-autoconfig göndermesini ister. Chrome ayrıca tam olarak 200 bekler; 404 başarısız bir indirme, yani doğrudan bağlantı demektir.
  • Düzenlemeden sonra değişiklik görmemek. Tarayıcılar yüklenen betiği bellekte tutar. Firefox'un bağlantı ayarlarındaki yeniden yükleme düğmesini ya da chrome://net-internals/#proxy sayfasındaki Re-apply settings düğmesini kullanın veya tarayıcıyı yeniden başlatın.
  • Betikte DNS çağırmak. Host adıyla çağrılan isInNet, dnsResolve ve isResolvable her istekte bir sorgu yapar; yavaş bir DNS sunucusu her sayfayı bekletir.
  • Sözdizimi hatası. Chrome hiçbir mesaj göstermeden doğrudan bağlanır. Dosyayı yayına almadan önce pacparser ile test edin.
  • HTTPS'te yol kuralları. shExpMatch(url, "*/products/*"), Chrome'da bir https:// adresiyle hiçbir zaman eşleşmez, çünkü yol silinir. Testimizde aynı türden bir kural http:// adresinde eşleşti. Bunun yerine host üzerinden eşleştirin.
  • dnsDomainIs'teki nokta. Nokta yoksa benzer görünen alan adları da eşleşir; nokta varsa yalın alan adı eşleşmez.
  • HTTP host:port ya da yalın SOCKS yazmak. Chrome ilkini reddeder, ikincisini SOCKS4 olarak okur.
  • Veri toplama hedeflerinde DIRECT yedeği. Proxy çalışmadığında site sizin kendi IP'nizi görür.

Karar rehberi

İhtiyaçÖneri
Yalnızca birkaç alan adını proxy'den geçirmekBir PAC dosyası: hedefler için PROXY, geri kalanı için DIRECT
Tarayıcı trafiğinin tamamını tek bir proxy'den geçirmekPAC gerekmez; elle girilen sistem proxy'si yeterli (Windows ve Chrome)
Gerçek IP'niz hedef siteye hiçbir zaman ulaşmamalıO site için yalnızca PROXY döndürün, ; DIRECT yedeği eklemeyin
Chrome'da SOCKS5 kullanmakSOCKS5 host:port döndürün ve IP'nizi whitelist'e ekleyin
Ofisteki her bilgisayarda aynı PAC adresiAdresi grup ilkesiyle ya da cihaz yönetimiyle dağıtın; WPAD kullanıyorsanız DHCP ve DNS'i koruyun
Dizüstü bilgisayar kafe ve ev ağlarında da çalışıyorOtomatik algılamayı kapatın; Windows'ta DisableWpad ayarlayın
Panel her oturumda aynı IP'yi istiyorO alan adını statik bir ISP proxy'ye yönlendirin

Sıkça sorulan sorular

PAC dosyası nasıl açılır ya da düzenlenir?

PAC dosyası düz metindir; Not Defteri ya da herhangi bir kod düzenleyiciyle açılır. Adresi bir tarayıcıda açarsanız, tarayıcı MIME türüne göre ya metni gösterir ya da dosyayı indirir. .pac uzantısını başka dosya biçimleri de kullanır; dosya ikili veri gibi görünüyorsa bir proxy yapılandırması değildir.

Windows'ta PAC dosyası nerede?

Çoğu zaman yerel bir dosya değildir. Windows, Kurulum betiğini kullan altına girilen adresi saklar ve dosyayı oradan indirir. Adresi görmenin ya da değiştirmenin adımları Windows ve Chrome'da proxy ayarları yazımızda.

PAC dosyasına kullanıcı adı ve şifre eklenebilir mi?

Hayır. Fonksiyon yalnızca bir anahtar sözcük, bir host ve bir port döndürür. HTTP proxy'de tarayıcı kimlik bilgilerini bir 407 penceresinde sorar; otomatik işlerde ve SOCKS5'te IP whitelist ile kimlik doğrulamayı kullanın.

PAC ile WPAD arasındaki fark nedir?

Kurallar PAC dosyasındadır. WPAD ise yerel ağda DHCP ya da DNS aracılığıyla bir PAC dosyasının adresini bulur. PAC dosyasını WPAD olmadan, adresini kendiniz girerek de kullanabilirsiniz; daha güvenli yol da budur.

PAC dosyası SOCKS5 proxy döndürebilir mi?

Evet, SOCKS5 host:port biçiminde; Chrome da Firefox da bu girdiyi uygular. Chrome SOCKS5 kimlik bilgisi göndermediği için proxy tarafında IP'nizi whitelist'e ekleyin.

PAC dosyamı değiştirdim, tarayıcı neden hâlâ eski kuralları kullanıyor?

Tarayıcı, yapılandırmayı yeniden yükleyene kadar önceden yüklediği sürümü kullanır. Firefox'ta yeniden yükleme düğmesine basın, chrome://net-internals/#proxy sayfasında Re-apply settings düğmesini kullanın ya da tarayıcıyı yeniden başlatın. Her sürüme yeni bir dosya adı vermek (proxy-v2.pac) şüpheyi ortadan kaldırır.

Özet

PAC dosyası, proxy'yi bir aç/kapa anahtarı olmaktan çıkarıp her istek için verilen bir karara dönüştürür: FindProxyForURL host'a bakar ve DIRECT, PROXY ya da SOCKS5 döndürür, tarayıcı da girdileri soldan sağa dener. Eşleştirmeyi host üzerinden yapın, DNS'e soran fonksiyonlardan kaçının ve veri toplama hedeflerinin kurallarına DIRECT yedeği eklemeyin. PAC adresini HTTPS üzerinden kendiniz girin, gerekmeyen yerlerde WPAD'i kapatın. Dosya şifre taşıyamadığı için onu IP whitelist ile kimlik doğrulamayla birlikte kullanın; her kural için uygun proxy türünü proxy hizmetlerimiz arasından seçin.

ChatGPT'ye sorClaude'a sor