Proxy Auto-Configuration (PAC) dosyası, web tarayıcılarının ve diğer user agent'ların belirli bir URL için hangi proxy sunucusunun (varsa) kullanılacağını belirlemek üzere çalıştırdığı bir JavaScript dosyasıdır. Bu mekanizma, istemci trafiğinin proxy altyapısı üzerinden nasıl yönlendirileceği konusunda dinamik ve ayrıntılı kontrol sağlar.
PAC dosyalarını anlamak
PAC dosyası, proxy yapılandırma mantığını bir web sunucusunda merkezileştirerek istemci tarafında manuel proxy ayarları yapma ihtiyacını ortadan kaldırır. Bir istemci PAC dosyası kullanacak şekilde yapılandırıldığında, her HTTP/HTTPS isteğinden önce betiği indirir ve çalıştırır. Betiğin ana fonksiyonu olan FindProxyForURL(url, host), doğrudan bağlanılacağını, belirli bir proxy kullanılacağını veya bir SOCKS proxy kullanılacağını belirten bir string döndürür.
PAC dosyası kullanmanın faydaları
PAC dosyalarını uygulamak birkaç operasyonel avantaj sunar:
- Ayrıntılı kontrol: URL desenlerine, hostname'lere, IP adreslerine, günün saatine veya ağ konumuna göre özel yönlendirme kuralları tanımlayın.
- Yük dengeleme: aşırı yüklenmeyi önlemek için trafiği birden fazla proxy sunucusuna dağıtın.
- Failover: birincil sunucu erişilemez olduğunda alternatif proxy sunucuları belirtin; böylece güvenilirlik artar.
- Belirli trafiği atlama: belirli iç veya güvenilir alan adlarını proxy'yi tamamen atlayacak şekilde yönlendirin; bu gecikmeyi ve kaynak tüketimini azaltır.
- Basitleştirilmiş istemci yapılandırması: istemcilerin yalnızca PAC dosyasının URL'sine ihtiyacı vardır; bu da dağıtımı ve güncellemeleri kolaylaştırır. Proxy mantığındaki değişiklikler her istemcide değil, sunucuda bir kez yapılır.
PAC dosyasının yapısı ve söz dizimi
PAC dosyası, JavaScript ile yazılmış düz metin bir dosyadır ve genellikle proxy.pac veya wpad.dat olarak adlandırılır. PAC dosyasının çekirdeği, mutlaka bulunması gereken FindProxyForURL(url, host) fonksiyonudur.
FindProxyForURL(url, host) fonksiyonu
Bu fonksiyon iki argüman alır:
* url: istenen nesnenin tam URL'si (örneğin http://www.example.com/index.html).
* host: URL'den çıkarılan hostname (örneğin www.example.com).
Fonksiyon bir string değer döndürmelidir:
DIRECT: proxy kullanmadan doğrudan hedefe bağlanır.PROXY <host>:<port>: belirtilen HTTP proxy sunucusunu kullanır.SOCKS <host>:<port>: belirtilen SOCKS proxy sunucusunu kullanır.- Birden fazla seçenek: birden fazla proxy sunucusunu ya da bir proxy ile doğrudan bağlantıyı noktalı virgülle ayırın (örneğin
PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT). İstemci bağlantıları belirtilen sırayla dener.
PAC dosyalarında sık kullanılan JavaScript fonksiyonları
Standart JavaScript fonksiyonlarının yanı sıra, proxy otomatik yapılandırması için tasarlanmış tarayıcıya özgü çeşitli fonksiyonlar da kullanılabilir:
isPlainHostName(host):hostbir alan adı içermiyorsatruedöndürür (örneğinlocalhost,intranet-server).dnsDomainIs(host, domain):host,domainalanına aitsetruedöndürür (örneğindnsDomainIs("www.example.com", ".example.com")).shExpMatch(str, pattern):str, shell ifadesi eşleştirmesiylepatterndesenine uyuyorsatruedöndürür (örneğinshExpMatch("http://www.example.com/index.html", "http://*.example.com/*")).isInNet(host, pattern, mask):hostadresinin IP'si,patternvemaskile belirtilen IP ağının içindeysetruedöndürür (örneğinisInNet(host, "192.168.1.0", "255.255.255.0")).hostbir hostname veya IP adresi olabilir.myIpAddress(): tarayıcının çalıştığı makinenin IP adresini döndürür. Konum tabanlı proxy kararları için kullanışlıdır.dnsResolve(host):hosthostname'ini bir IP adresine çözümler. Çözümleme başarısız olursa boş string döndürür.weekdayRange(wd1, wd2, gmt): geçerli hafta günü belirtilen aralıktaysatruedöndürür.wd1,wd2kısaltmalardır (örneğin "MON", "FRI").gmtisteğe bağlıdır ve GMT saati içindir.dateRange(day1, month1, year1, day2, month2, year2, gmt): geçerli tarih belirtilen aralıktaysatruedöndürür.timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt): geçerli saat belirtilen aralıktaysatruedöndürür.
Örnek PAC dosyası
Bu örnek; iç alan adlarını atlamayı, belirli trafiği yönlendirmeyi ve failover uygulamayı gösterir.
function FindProxyForURL(url, host) {
// Proxy sunucularinizi tanimlayin
var PRIMARY_PROXY = "PROXY proxy.example.com:8080";
var SECONDARY_PROXY = "PROXY backup-proxy.example.com:8080";
var SOCKS_PROXY = "SOCKS socks.example.com:1080";
// 1. Yerel host'lar ve ic alan adlari icin dogrudan baglanti
// Duz hostname'ler icin proxy'yi atla (or. "localhost", "intranet-server")
if (isPlainHostName(host)) {
return "DIRECT";
}
// Belirli bir ic alan adi icin proxy'yi atla
if (dnsDomainIs(host, ".internal-domain.com")) {
return "DIRECT";
}
// Belirli ic IP araliklari icin proxy'yi atla
// Not: myIpAddress() istemcinin IP'sini dondurur. Burada *hedefin* ic olup olmadigi kontrol edilir.
// Istemcinin IP'sini kontrol etmek icin myIpAddress() ve isInNet kullanin.
if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")) {
return "DIRECT";
}
// 2. Belirli uygulamalar veya protokoller icin SOCKS proxy kullan
// Ornek: tum FTP trafigini bir SOCKS proxy uzerinden yonlendir
if (url.substring(0, 4) == "ftp:") {
return SOCKS_PROXY;
}
// 3. Belirli dis alan adlarini failover ile birincil proxy uzerinden yonlendir
// Ornek: partner-site.com trafigini birincil proxy uzerinden,
// ikincil proxy'ye geri donus ile yonlendir.
if (dnsDomainIs(host, ".partner-site.com")) {
return PRIMARY_PROXY + "; " + SECONDARY_PROXY;
}
// 4. Belirli URL'leri engelle (var olmayan bir proxy veya hata dondurerek)
// Not: bazi tarayicilar "PROXY 0.0.0.0:0" degerini engelleme olarak yorumlayabilir.
// Daha saglam bir engelleme mekanizmasi genellikle proxy'nin kendisi tarafindan saglanir.
if (shExpMatch(url, "*bad-site.com*")) {
// Fiilen engellemek icin var olmayan bir proxy dondur veya ozel bir engelleme proxy'si kullan
return "PROXY 127.0.0.1:1"; // Veya ozel bir engelleme proxy'si
}
// 5. Varsayilan kural: diger tum trafik failover ile birincil proxy uzerinden gider
return PRIMARY_PROXY + "; " + SECONDARY_PROXY + "; DIRECT";
}
Dağıtım ve yayma
İstemcilerin bir PAC dosyasını kullanabilmesi için onu alacak şekilde yapılandırılmaları gerekir.
HTTP/HTTPS sunucusu üzerinden
En yaygın yöntem, PAC dosyasını standart bir web sunucusunda (Apache, Nginx, IIS) barındırmak ve istemci tarayıcılarını veya işletim sistemlerini bu URL ile yapılandırmaktır.
* Sunucu yapılandırması: sunucunun PAC dosyasını doğru MIME type ile sunduğundan emin olun: application/x-ns-proxy-autoconfig.
* İstemci yapılandırması: tarayıcı ayarlarında (veya işletim sistemi ağ ayarlarında) "Otomatik proxy yapılandırma betiği kullan" seçeneğini belirtin ve tam URL'yi girin (örneğin http://proxyconfig.example.com/proxy.pac).
Web Proxy Auto-Discovery Protocol (WPAD)
WPAD, istemcilerin PAC dosyası URL'sini manuel yapılandırma olmadan otomatik olarak keşfetmesini sağlar. Bu genellikle şunları içerir:
1. DNS: wpad.dat dosyasını barındıran web sunucusuna işaret eden bir wpad.<domain> DNS kaydı oluşturmak.
2. DHCP: PAC dosyası URL'sini sağlamak için bir DHCP seçeneği (seçenek 252) yapılandırmak.
WPAD kullanışlı olsa da güvenlik açısından riskler taşır (örneğin kötü niyetli WPAD sunucuları olasılığı) ve genellikle devre dışı bırakılır veya dikkatle kullanılır. Güvenlik ve açık kontrol açısından doğrudan URL yapılandırması genellikle tercih edilir.
Windows için Group Policy Objects (GPO)
Windows etki alanlarında PAC dosyası URL'leri, Group Policy kullanılarak istemci makinelere merkezî olarak dağıtılabilir:
* User Configuration > Policies > Windows Settings > Internet Explorer Maintenance > Connection > Proxy Settings yolunu izleyin.
* "Automatic configuration" seçeneğini etkinleştirin ve PAC dosyası URL'sini girin.
PAC dosyalarında sorun giderme
PAC dosyalarındaki sorunlar genellikle söz dizimi hatalarından, önbellekten veya ağ problemlerinden kaynaklanır.
- Söz dizimi hataları: küçük JavaScript hataları bile PAC dosyasının çalışmasını engelleyebilir. Bir JavaScript linter'ı veya özel bir PAC dosyası doğrulayıcısı kullanın. Tarayıcılar hataları geliştirici konsoluna kaydedebilir (örneğin Chrome/Firefox'ta F12).
- Yanlış MIME type: web sunucusu PAC dosyasını yanlış MIME type ile sunarsa istemciler dosyayı doğru işleyemeyebilir.
application/x-ns-proxy-autoconfigdeğerini doğrulayın. - Önbellek sorunları: tarayıcılar PAC dosyalarını agresif şekilde önbelleğe alır. Değişiklik yaptığınızda tarayıcı önbelleğini temizleyin veya zorla yenileyin (örneğin
Ctrl+F5). Bazı tarayıcılar hata ayıklama için PAC dosyası önbelleğini kapatma seçeneği sunar. - Ağ erişilebilirliği: istemcinin PAC dosyasını barındıran web sunucusuna ulaşabildiğinden emin olun. DNS çözümlemesini ve güvenlik duvarı kurallarını doğrulayın.
FindProxyForURLfonksiyonu:FindProxyForURL(url, host)fonksiyonunun doğru tanımlandığını ve geçerli proxy string'leri döndürdüğünü doğrulayın.- Test araçları: tarayıcı geliştirici araçları (Network sekmesi) bir istek için hangi proxy'nin kullanıldığını gösterebilir. Çevrimiçi PAC dosyası test araçları, betiğinize karşı istekleri simüle edebilir.
PAC dosyası ile diğer proxy yapılandırma yöntemlerinin karşılaştırması
| Özellik | PAC dosyası | Doğrudan proxy ayarları | WPAD |
|---|---|---|---|
| Yapılandırma yöntemi | JavaScript betiği URL'si | Manuel IP/port girişi | DNS/DHCP ile otomatik keşif |
| Ayrıntılı kontrol | Yüksek (mantık tabanlı) | Düşük (tüm trafik tek proxy'ye ya da doğrudan gider) | Yüksek (PAC dosyası kullanır) |
| Failover/yük dengeleme | Evet (betik mantığına gömülü) | Hayır (tek proxy) | Evet (PAC dosyası mantığına gömülü) |
| Atlama kuralları | Evet (betik mantığına gömülü) | Manuel istisna listesi | Evet (PAC dosyası mantığına gömülü) |
| Dağıtım karmaşıklığı | Orta (dosyayı web sunucusunda barındır, URL'yi ayarla) | Düşük (istemci başına manuel) | Yüksek (DNS/DHCP yapılandırması, web sunucusu) |
| Bakım | Merkezî (betiği sunucuda düzenle) | Dağınık (istemci başına manuel) | Merkezî (betiği sunucuda düzenle, DNS/DHCP) |
| Güvenlik değerlendirmeleri | Betik enjeksiyonu, şifresiz dağıtım | Temel | DNS/DHCP spoofing (daha yüksek risk), betik enjeksiyonu |
Güvenlik değerlendirmeleri
- Bütünlük: PAC dosyaları hassas yönlendirme bilgileri içerir. PAC dosyasının güvenli ve güvenilir bir web sunucusunda barındırıldığından ve indirme sırasında değiştirilmesini ya da araya girilmesini önlemek için HTTPS üzerinden sunulduğundan emin olun.
- Kötü niyetli betikler: ele geçirilmiş bir PAC dosyası, istemci trafiğini kötü niyetli proxy'lere yönlendirerek man-in-the-middle saldırılarını, kimlik bilgisi toplamayı veya veri sızdırmayı kolaylaştırabilir. Yalnızca güvenilir kaynaklardan gelen PAC dosyalarını kullanın.
- Bilgi ifşası: herkese açık PAC dosyalarına hassas iç ağ ayrıntıları eklemekten kaçının. Dosyanın kendisi kod olsa da mantığı ağ topolojisini açığa çıkarabilir.
- WPAD güvenlik açıkları: WPAD'ın otomatik keşif mekanizması, bir saldırgan DNS veya DHCP yanıtlarını kontrol edebiliyorsa istismar edilerek istemciler kötü niyetli bir WPAD sunucusuna yönlendirilebilir. WPAD'ı dikkatle ve uygun güvenlik önlemleriyle kullanın.
