Eine Proxy-Auto-Konfigurationsdatei (PAC-Datei) ist eine JavaScript-Datei, die Webbrowser und andere Benutzeragenten ausführen, um zu bestimmen, welcher Proxyserver, falls überhaupt, für eine gegebene URL verwendet werden soll. Dieser Mechanismus ermöglicht eine dynamische und granulare Kontrolle darüber, wie der Client-Traffic durch eine Proxy-Infrastruktur geleitet wird.
PAC-Dateien verstehen
Eine PAC-Datei zentralisiert die Proxy-Konfigurationslogik auf einem Webserver, wodurch manuelle clientseitige Proxy-Einstellungen überflüssig werden. Wenn ein Client für die Verwendung einer PAC-Datei konfiguriert ist, lädt er das Skript vor jeder HTTP/HTTPS-Anfrage herunter und führt es aus. Die primäre Funktion des Skripts, FindProxyForURL(url, host), gibt eine Zeichenfolge zurück, die angibt, ob direkt verbunden, ein spezifischer Proxy oder ein SOCKS-Proxy verwendet werden soll.
Vorteile der Verwendung von PAC-Dateien
Die Implementierung von PAC-Dateien bietet mehrere betriebliche Vorteile:
- Granulare Kontrolle: Definieren Sie spezifische Routing-Regeln basierend auf URL-Mustern, Hostnamen, IP-Adressen, Tageszeit oder Netzwerkstandort.
- Lastverteilung: Verteilen Sie den Traffic auf mehrere Proxyserver, um eine Überlastung zu verhindern.
- Failover: Geben Sie alternative Proxyserver an, falls der primäre nicht verfügbar ist, um die Zuverlässigkeit zu erhöhen.
- Spezifischen Traffic umgehen: Leiten Sie bestimmte interne oder vertrauenswürdige Domänen so, dass sie den Proxy vollständig umgehen, wodurch Latenz und Ressourcenverbrauch reduziert werden.
- Vereinfachte Client-Konfiguration: Clients benötigen nur die URL der PAC-Datei, was die Bereitstellung und Updates vereinfacht. Änderungen an der Proxy-Logik werden einmal auf dem Server vorgenommen, nicht auf jedem Client.
PAC-Dateistruktur und -Syntax
Eine PAC-Datei ist eine reine Textdatei, die in JavaScript geschrieben ist und typischerweise proxy.pac oder wpad.dat genannt wird. Der Kern einer PAC-Datei ist die Funktion FindProxyForURL(url, host), die vorhanden sein muss.
FindProxyForURL(url, host) Funktion
Diese Funktion nimmt zwei Argumente entgegen:
* url: Die vollständige URL des angeforderten Objekts (z. B. http://www.example.com/index.html).
* host: Der Hostname, der aus der URL extrahiert wurde (z. B. www.example.com).
Die Funktion muss einen Zeichenfolgenwert zurückgeben:
DIRECT: Direkt mit dem Ziel verbinden, ohne einen Proxy zu verwenden.PROXY <host>:<port>: Den angegebenen HTTP-Proxyserver verwenden.SOCKS <host>:<port>: Den angegebenen SOCKS-Proxyserver verwenden.- Mehrere Optionen: Trennen Sie mehrere Proxyserver oder eine Proxy- und direkte Verbindung mit Semikolons (z. B.
PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080; DIRECT). Der Client versucht Verbindungen in der angegebenen Reihenfolge.
Gängige JavaScript-Funktionen innerhalb von PAC-Dateien
Standard-JavaScript-Funktionen sind verfügbar, neben mehreren browserspezifischen Funktionen, die für die Proxy-Auto-Konfiguration entwickelt wurden:
isPlainHostName(host): Gibttruezurück, wennhostkeinen Domänennamen enthält (z. B.localhost,intranet-server).dnsDomainIs(host, domain): Gibttruezurück, wennhostzudomaingehört (z. B.dnsDomainIs("www.example.com", ".example.com")).shExpMatch(str, pattern): Gibttruezurück, wennstrdempatternunter Verwendung von Shell-Ausdrucks-Matching entspricht (z. B.shExpMatch("http://www.example.com/index.html", "http://*.example.com/*")).isInNet(host, pattern, mask): Gibttruezurück, wenn die IP-Adresse vonhostinnerhalb des angegebenen IP-Netzwerkspatternundmaskliegt (z. B.isInNet(host, "192.168.1.0", "255.255.255.0")).hostkann ein Hostname oder eine IP-Adresse sein.myIpAddress(): Gibt die IP-Adresse des Computers zurück, auf dem der Browser läuft. Nützlich für standortbasierte Proxy-Entscheidungen.dnsResolve(host): Löst den Hostnamenhostin eine IP-Adresse auf. Gibt eine leere Zeichenfolge zurück, wenn die Auflösung fehlschlägt.weekdayRange(wd1, wd2, gmt): Gibttruezurück, wenn der aktuelle Wochentag im angegebenen Bereich liegt.wd1,wd2sind Abkürzungen (z. B. "MON", "FRI").gmtist optional für GMT-Zeit.dateRange(day1, month1, year1, day2, month2, year2, gmt): Gibttruezurück, wenn das aktuelle Datum im angegebenen Bereich liegt.timeRange(hour1, min1, sec1, hour2, min2, sec2, gmt): Gibttruezurück, wenn die aktuelle Uhrzeit im angegebenen Bereich liegt.
Beispiel-PAC-Datei
Dieses Beispiel demonstriert das Umgehen interner Domänen, das Leiten spezifischen Traffics und das Implementieren von Failover.
function FindProxyForURL(url, host) {
// Define your proxy servers
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. Direct connection for local hosts and internal domains
// Bypass proxy for plain hostnames (e.g., "localhost", "intranet-server")
if (isPlainHostName(host)) {
return "DIRECT";
}
// Bypass proxy for specific internal domain
if (dnsDomainIs(host, ".internal-domain.com")) {
return "DIRECT";
}
// Bypass proxy for specific internal IP ranges
// Note: myIpAddress() returns the client's IP. This checks if the *destination* is internal.
// For checking client's IP, use myIpAddress() and isInNet.
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. Use SOCKS proxy for specific applications or protocols
// Example: Route all FTP traffic through a SOCKS proxy
if (url.substring(0, 4) == "ftp:") {
return SOCKS_PROXY;
}
// 3. Route specific external domains through a primary proxy with failover
// Example: Route traffic to partner-site.com through the primary proxy,
// with a fallback to a secondary proxy.
if (dnsDomainIs(host, ".partner-site.com")) {
return PRIMARY_PROXY + "; " + SECONDARY_PROXY;
}
// 4. Block specific URLs (by returning a non-existent proxy or an error)
// Note: Some browsers might treat "PROXY 0.0.0.0:0" as a block.
// A more robust blocking mechanism is typically handled by the proxy itself.
if (shExpMatch(url, "*bad-site.com*")) {
// Return a non-existent proxy to effectively block, or use a specific blocking proxy
return "PROXY 127.0.0.1:1"; // Or a dedicated blocking proxy
}
// 5. Default rule: All other traffic goes through the primary proxy with failover
return PRIMARY_PROXY + "; " + SECONDARY_PROXY + "; DIRECT";
}
Bereitstellung und Verteilung
Damit Clients eine PAC-Datei verwenden können, müssen sie so konfiguriert werden, dass sie diese abrufen.
Über HTTP/HTTPS-Server
Die gängigste Methode ist, die PAC-Datei auf einem Standard-Webserver (Apache, Nginx, IIS) zu hosten und Client-Browser oder Betriebssysteme mit ihrer URL zu konfigurieren.
* Serverkonfiguration: Stellen Sie sicher, dass der Server die PAC-Datei mit dem korrekten MIME-Typ bereitstellt: application/x-ns-proxy-autoconfig.
* Client-Konfiguration: Geben Sie in den Browsereinstellungen (oder OS-Netzwerkeinstellungen) die Option "Skript für automatische Proxykonfiguration verwenden" an und geben Sie die vollständige URL ein (z. B. http://proxyconfig.example.com/proxy.pac).
Web Proxy Auto-Discovery Protocol (WPAD)
WPAD ermöglicht es Clients, die PAC-Datei-URL automatisch zu entdecken, ohne manuelle Konfiguration. Dies beinhaltet typischerweise:
1. DNS: Erstellen eines DNS-Eintrags für wpad.<domain>, der auf den Webserver zeigt, der wpad.dat hostet.
2. DHCP: Konfigurieren einer DHCP-Option (Option 252), um die PAC-Datei-URL bereitzustellen.
Obwohl praktisch, hat WPAD Sicherheitsimplikationen (z. B. Potenzial für bösartige WPAD-Server) und wird oft deaktiviert oder vorsichtig verwendet. Direkte URL-Konfiguration wird im Allgemeinen für Sicherheit und explizite Kontrolle bevorzugt.
Gruppenrichtlinienobjekte (GPO) für Windows
In Windows-Domänen können PAC-Datei-URLs zentral über Gruppenrichtlinien an Client-Maschinen verteilt werden:
* Navigieren Sie zu Benutzerkonfiguration > Richtlinien > Windows-Einstellungen > Internet Explorer-Wartung > Verbindung > Proxy-Einstellungen.
* Aktivieren Sie "Automatische Konfiguration" und geben Sie die PAC-Datei-URL an.
Fehlerbehebung bei PAC-Dateien
Probleme mit PAC-Dateien resultieren oft aus Syntaxfehlern, Caching oder Netzwerkproblemen.
- Syntaxfehler: Selbst kleinere JavaScript-Fehler können die Funktion der PAC-Datei beeinträchtigen. Verwenden Sie einen JavaScript-Linter oder einen dedizierten PAC-Datei-Validator. Browser können Fehler in ihrer Entwicklerkonsole protokollieren (z. B. F12 in Chrome/Firefox).
- Falscher MIME-Typ: Wenn der Webserver die PAC-Datei mit einem falschen MIME-Typ bereitstellt, verarbeiten Clients sie möglicherweise nicht korrekt. Überprüfen Sie
application/x-ns-proxy-autoconfig. - Caching-Probleme: Browser cachen PAC-Dateien aggressiv. Leeren Sie bei Änderungen den Browser-Cache oder erzwingen Sie eine Aktualisierung (z. B.
Strg+F5). Einige Browser bieten eine Option zum Deaktivieren des PAC-Datei-Cachings für Debugging-Zwecke. - Netzwerkzugänglichkeit: Stellen Sie sicher, dass der Client den Webserver erreichen kann, der die PAC-Datei hostet. Überprüfen Sie die DNS-Auflösung und Firewall-Regeln.
FindProxyForURL-Funktion: Bestätigen Sie, dass die FunktionFindProxyForURL(url, host)korrekt definiert ist und gültige Proxy-Strings zurückgibt.- Testwerkzeuge: Browser-Entwicklertools (Netzwerk-Tab) können anzeigen, welcher Proxy für eine Anfrage verwendet wurde. Online-PAC-Datei-Tester können Anfragen gegen Ihr Skript simulieren.
PAC-Datei vs. andere Proxy-Konfigurationsmethoden
| Merkmal | PAC-Datei | Direkte Proxy-Einstellungen | WPAD |
|---|---|---|---|
| Konfigurationsmethode | JavaScript-Skript-URL | Manuelle IP/Port-Eingabe | Auto-Discovery via DNS/DHCP |
| Granulare Kontrolle | Hoch (logikbasiert) | Niedrig (gesamter Traffic geht an einen Proxy oder direkt) | Hoch (verwendet PAC-Datei) |
| Failover/Lastverteilung | Ja (in Skriptlogik integriert) | Nein (einzelner Proxy) | Ja (in PAC-Dateilogik integriert) |
| Umgehungsregeln | Ja (in Skriptlogik integriert) | Manuelle Ausschlussliste | Ja (in PAC-Dateilogik integriert) |
| Bereitstellungskomplexität | Moderat (Datei auf Webserver hosten, URL konfigurieren) | Niedrig (manuell pro Client) | Hoch (DNS/DHCP-Konfiguration, Webserver) |
| Wartung | Zentralisiert (Skript auf Server bearbeiten) | Dezentralisiert (manuell pro Client) | Zentralisiert (Skript auf Server bearbeiten, DNS/DHCP) |
| Sicherheitsaspekte | Skript-Injection, unverschlüsselte Verteilung | Basic | DNS/DHCP-Spoofing (höheres Risiko), Skript-Injection |
Sicherheitsaspekte
- Integrität: PAC-Dateien enthalten sensible Routing-Informationen. Stellen Sie sicher, dass die PAC-Datei auf einem sicheren, vertrauenswürdigen Webserver gehostet und über HTTPS bereitgestellt wird, um Manipulation oder Abfangen während des Downloads zu verhindern.
- Bösartige Skripte: Eine kompromittierte PAC-Datei kann Client-Traffic an bösartige Proxys umleiten, was Man-in-the-Middle-Angriffe, das Abfangen von Anmeldeinformationen oder Datenexfiltration erleichtern kann. Verwenden Sie PAC-Dateien nur aus vertrauenswürdigen Quellen.
- Offenlegung von Informationen: Vermeiden Sie es, sensible interne Netzwerkdetails in öffentlich zugänglichen PAC-Dateien einzuschließen. Obwohl die Datei selbst Code ist, kann ihre Logik die Netzwerktopologie offenbaren.
- WPAD-Schwachstellen: Der automatische Erkennungsmechanismus von WPAD kann ausgenutzt werden, wenn ein Angreifer DNS- oder DHCP-Antworten kontrollieren kann, wodurch Clients zu einem bösartigen WPAD-Server geleitet werden. Verwenden Sie WPAD mit Vorsicht und angemessenen Sicherheitsmaßnahmen.