Weblog

Automatische Proxy Konfiguration

13.09.2025 2 Min. Lesezeit

In modernen Netzwerkumgebungen spielt die automatische Konfiguration von HTTP-Proxys eine zentrale Rolle für die Skalierbarkeit, Sicherheit und Benutzerfreundlichkeit. Eine etablierte Methode zur Umsetzung dieser Automatisierung ist das Web Proxy Auto-Discovery Protocol (WPAD), das in Kombination mit sogenannten Proxy Auto-Config-Dateien (proxy.pac) eingesetzt wird.

WPAD ermöglicht es Clients, ohne manuelle Eingriffe die passende Proxy-Konfiguration für ihr Netzwerkumfeld zu ermitteln. Dies ist insbesondere in großen, dynamischen Netzwerken von Vorteil, in denen sich Netzwerktopologien oder Sicherheitsrichtlinien häufig ändern.

Die zugrunde liegende Idee besteht darin, daß ein Client beim Netzwerkbeitritt automatisch eine URL ermittelt, unter der eine proxy.pac-Datei bereitgestellt wird. Diese Datei enthält eine JavaScript-Funktion namens FindProxyForURL(), die auf Basis von Ziel-URL, Hostname oder IP-Adresse entscheidet, ob und über welchen Proxy ein bestimmter Request geleitet werden soll.

Die Verteilung der proxy.pac-Datei erfolgt typischerweise über HTTP, wobei Clients standardisierte Pfade wie http://wpad./wpad.dat abfragen.

Leider verhalten sich nicht alle Clients exakt gleich, manch Client fragt wpad.dat an, andere Clients fragen nach proxy.pac. Glücklicherweise erwarten beide Client-Typen die Datei im gleichen Format, ein einfacher symlink kann das Dilemma lösen.

Die Kombination aus WPAD und proxy.pac bietet damit eine flexible, zentral steuerbare Lösung, die sowohl einfache als auch komplexe Routing-Entscheidungen erlaubt - etwa das Umgehen des Proxys für lokale Adressen oder das gezielte Weiterleiten bestimmter Domains über spezialisierte Gateways.

Als Web-Server kann jede beliebige Software eingesetzt werden, ein minimaler Web-Server im Docker Container z.B. reicht vollkommen aus. Einzig die folgende Datei wird wpad.dat und zusätzlich per symlink als proxy.pac bereitgestellt.

function FindProxyForURL(url,host)
{
    // direct access for local resources
    if (dnsDomainIs(host, ".wdein.de")) {
        return "DIRECT";
    }

    // direct access for special resources
    if (dnsDomainIs(host, ".example.net")) {
        return "DIRECT";
    }

    // No proxy for private (RFC 1918) IP addresses (intranet sites)
    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";
    }

    // No proxy for localhost
    if (isInNet(dnsResolve(host), "127.0.0.0", "255.0.0.0")) {
        return "DIRECT";
    }

    // Clean-up rule. Everything else uses a proxy. Note semi-colon delimiter between strings.
    return "PROXY hal9000.wdein.de:3128; DIRECT";

    // do not use the proxy - never
    // return "DIRECT";
}

Notwendige Anpassungen an Domain-Namen, IP-Ranges und am Proxy-Server bitte entsprechend durchführen. Dieses Script ist examplarisch aus meiner Umgebung entnommen.

Trotz ihrer Vorteile birgt die WPAD-Implementierung auch sicherheitstechnische Herausforderungen, insbesondere wenn Clients ungesicherte Netzwerke betreten und potenziell manipulierte wpad.dat-Dateien laden könnten.

Daher ist es absolut zu empfehlen, WPAD nur in kontrollierten Umgebungen zu aktivieren und gegebenenfalls durch zusätzliche Sicherheitsmechanismen wie DNSSEC oder HTTPS-Hosting der Konfigurationsdateien abzusichern.

π