• Proxy Auto Config - Proxy Server per Skript setzen

    Jeder Laptop-User, der im Firmennetzwerk einen Proxy Server verwenden muss, kennt die Problematik: Die Arbeit ist vorbei - man geht nach Hause und will übers heimische WLAN - proxyserverfrei - ins Internet. Im Firefox gibt es ja die Möglichkeit mehrere Profile zu verwenden, aber der Internet Explorer zwingt einen dazu sich durch das Menü zu hangeln und den Proxyserver manuell zu deaktivieren.

    Wäre es nicht schön, wenn der Proxy Server über ein Skript konfiguriert werden könnte? Und wenn dieses Skript dann auch auf dem Mac vom Cheffe funktioniert?

    Moderne Browser können ihre Proxy Server Konfiguration aus der sog. Proxy Auto Config (PAC-) Datei beziehen. Dabei handelt es sich um eine normale Textdatei, die eine JavaScript-Funktion FindProxyForURL(url, host) enthält. Diese hat als Rückgabewert einen Proxy Server - mit der Möglichkeit Failover Proxys anzugeben.
    Die PAC-Datei wird im Firmennetzwerk auf einen beliebigen Webserver abgelegt - vorausgesetzt die Clients können diesen ohne Proxyserver erreichen.

    Eine PAC-Datei könnte wir folgt aussehen:
    Code:
    function FindProxyForURL(url, host) { 
        // lokale Netwerknamen -> kein Proxy
        if ( isPlainHostName(host) || dnsDomainIs(host, ".company.com")) &&  !localHostOrDomainIs(host, "www.company.com") ) 
         return "DIRECT";
    
        // wenn der Client aus dem 192.168.1.0 / 26 Bereich kommt
        if ( shExpMatch(host, "192.168.1.*" )) 
         return "DIRECT";
    
        // Alle anderen Anfragen -> Proxy benutzen
        // wenn Proxy nicht erreichbar -> direkter Zugriff
        return "PROXY 192.168.1.1:8080; DIRECT"; 
    }
    Das Script sollte so einfach wie möglich gehalten werden - allzu kreativer Zugriff auf JavaScript Object Model Objekte, Methoden oder Funktionen (window.open(), alert(), ...) führen dazu, dass das Skript nicht ausgeführt wird ...

    Code:
    return "PROXY 192.168.1.1:8080; DIRECT";
    In diesem Fall werden zwei Proxyeinstellungen zurückgegeben. Zunächst würde der Browser versuchen eine Verbindung über den Proxy Server 192.168.1.1 aufzubauen. Ist dieser Server nicht erreichbar, z.B. weil der Laptop in ein proxyfreies Netzwerk gewechselt hat, wird versucht die direkt eine Verbindung aufzubauen.

    Code:
    if ( isPlainHostName(host) || dnsDomainIs(host, ".company.com")) &&  !localHostOrDomainIs(host, "www.company.com") ) 
      return "DIRECT";
    Für lokale Server wird im Regelfall kein Proxyserver benötigt.
    isPlainHostName(host) prüft ob im Hostname ein Punkt vorkommt. Kommt kein Punkt vor gibt die Funktion true zurück.
    dnsDomainIs(host, domain) gibt true zurück wenn der Hostname Teil der angegebenen Domain.
    dnsDomainIs("www.company.com", ".company.com") -> true
    dnsDomainIs("intranet.company.com", ".company.com") -> true
    dnsDomainIs("www.web.de", ".company.com") -> false
    localHostOrDomainIs(host, domain) gibt nur true zurück, wenn der Hostname exakt der Domain entspricht oder der Hostname keine Domainnamen enthält und dem unqualifizierten Teil der Domain (Subdomain) entspricht.
    localHostOrDomainIs("www.company.com", "www.company.com") -> true : Exakte Übereinstimmung
    localHostOrDomainIs("www", "www.company.com") -> true : der Host enthält keine Domainnamen und stimmt mit der Subdomain überein
    localHostOrDomainIs("intranet.company.com", "www.company.com") -> false : Keine Übereinstimmung
    Code:
    if (url.substring(0, 5) == "http:") 
       return "PROXY httpproxy:80";
    
    if (url.substring(0, 6) == "https:") 
     return "PROXY secureproxy:8080";
    
    if (url.substring(0, 4) == "ftp:") 
       return "SOCKS sockproxy:1080";
    Möchte man bei der Proxy Server Konfiguration das verwendete Protokoll miteinbeziehen, kann man sich der substring() Funktion bedienen, um das Protokoll aus der URL zu ermitteln.

    Code:
    if (myIpAddress() == "192.168.1.123")
      return "DIRECT";
    Zum Schluss noch der gute "ich bin Admin ich darf das" Modus: Benutze kein Proxy wenn die IP Adresse der IP Adresse meines Laptops entspricht


    Die PAC-Datei muss im lokalen Netzwerk auf einem Webserver (IIS, Apache, ...) bereitgestellt werden, welcher sich ohne Proxy Server erreichen lässt. Beim Hinzufügen muss darauf geachtet werden, dass man der Dateiendung ".pac" den MIME-Type "application/x-ns-proxy-autoconfig" zuweist.

    Der Browser selbst muss noch so konfiguriert werden, dass er die Proxy Auto Config verwendet.
    Im Falle des Internet Explorers im Firmennetzwerk lässt sich dies relativ einfach über eine Gruppenrichtlinie umsetzen.

    Unter Benutzerkonfiguration > Richtlinien > Windows-Einstellungen > Internet Explorer-Wartung > Verbindung > Automatische Browserkonfiguration wird die AutoProxy-URL angegeben.
    Eine weitere Möglichkeit wäre das Web Proxy Autodiscovery (WPAD-) Protocol, auf das wir hier aber (zunächst) nicht weiter eingehen werden.
    Comments 2 Comments
    1. Benutzerbild von James Blond
      Warum überhaupt den IE noch nutzen?
    1. Benutzerbild von Pip
      PAC funktioniert auch beim FireFox