PAC Datei erstellen
Eine Proxy Auto-Config-Datei (PAC Datei) ist eine nicht mehr wegzudenkende Datei, vor allem bei Unternehmen. Sie ist dafür zuständig, dass Webbrowser und andere Software automatisch den passenden Proxy Server für eine gewünschte URL finden können. Diese proxy.pac kann sehr einfach, aber auch sehr komplex sein. Es gibt viele Möglichkeiten eine PAC Datei zu bauen. Wir geben hier einige Anregungen und PAC Datei Beispiele.
PAC Datei erstellen / PAC Datei Beispiele
In einem früheren Beitrag wird erklärt, wie man eine proxy.pac per IIS Webserver bereitstellen kann. Aber davor brauchen wir natürlich erst einmal eine PAC Datei. Hier zeigen wir einige Beispiele für PAC Dateien.
Information: PAC Dateien basieren auf JavaScript.
Direktes Verbinden bei lokalem Host
Hier kann der Host eine direkte Verbindung herstellen, wenn es sich um einen lokalen Host handelt. Wenn er nicht lokal ist, muss er über den Proxy gehen. Mit der Funktion isPlainHostName
wird geprüft, ob der Hostname Punkte “.” enthält. Wenn der Host Punkte enthält, ist er NICHT lokal.
function FindProxyForURL(url, host) { if (isPlainHostName(host)) return "DIRECT"; else return "PROXY proxy:80"; }
Direktes Verbinden bei einem Host innerhalb der Firewall
In diesem Fall kann der Host eine direkte Verbindung herstellen, wenn der Host sich innerhalb der Firewall befindet. Falls nicht, muss über den Proxy gegangen werden. Die Funktion localHostOrDomainIs
wird nur für eine URL in der lokalen Domäne ausgeführt.
function FindProxyForURL(url, host) { if ((isPlainHostName(host) || dnsDomainIs(host, ".yourcompany.com")) && !localHostOrDomainIs(host, "www.yourcompany.com") && !localHostOrDoaminIs(host, "intranet.yourcompany.com")) return "DIRECT"; else return "PROXY proxy:80"; }
Direktes Verbinden bei auflösbarem Hostnamen
Wenn der Hostname aufgelöst werden kann, wird eine direkte Verbindung hergestellt. Wenn nicht -> PROXY. Die Funktion isResolvable
fragt bei einem DNS Server an.
function FindProxyForURL(url, host) { if (isResolvable(host)) return "DIRECT"; else return "PROXY proxy:80"; }
Direktes Verbinden, wenn sich der Host in einem angegebenen Subnetz befindet
Hier kann der Host sich direkt verbinden, falls er sich ein einem angegebenen Subnetz befindet. Die Funktion isInNet
gibt “true” zurück, wenn die IP des Hosts mir dem angegebenen Muster übereinstimmt. Die Vorlage gibt an, welche IP Blöcke verglichen werden soll. In diesem Beispiel ist “255” eine Übereinstimmung, die “0” wird ignoriert.
function FindProxyForURL(url, host) { if (isInNet(host, "999.99.9.9", "255.0.255.0")) return "DIRECT"; else return "PROXY proxy:80"; }
Verbindungstyp anhand des Protokolls
Hier wird geprüft welches Protokoll angefordert ist. Egal ob http, https, ftp, etc. Falls keine Übereinstimmung statt findet, wird direkt verbunden. Die Funktion substring
extrahiert die angegebene Anzahl von Zeichen aus der Zeichenfolge. (Beispiel: http = 5, https = 6)
function FindProxyForURL(url, host) { if (url.substring(0, 5) == "http:") { return "PROXY proxy:80"; } else if (url.substring(0, 4) == "ftp:") { return "PROXY fproxy:80"; } else if (url.substring(0, 6) == "https:") { return "PROXY secureproxy:8080"; } else { return "DIRECT"; } }
Verbindungstyp anhand der Domäne
In diesem Fall wird nachgesehen, welche Domainendung die angesurfte Seite hat. die Funktion shExpMatch
prüft dies.
function FindProxyForURL(url, host) { if (isPlainHostName(host)) return "DIRECT"; else if (shExpMatch(host, "*.com")) return "PROXY comproxy:80"; else if (shExpMatch(host, "*.edu")) return "PROXY eduproxy:80"; else return "PROXY proxy"; }
Verbinden, wenn bestimmter Wochentag
Es kann sogar geprüft werden, an welchem Wochentag wie verbunden wird. weekdayRange
definiert die Tage. Der Parameter “GMT” besagt, dass die Zeitwerte der Greenwich Mean Time und nicht der lokalen Zeitzone entsprechen.
function FindProxyForURL(url, host) { if(weekdayRange("WED", "SAT", "GMT")) return "PROXY proxy:80"; else return "DIRECT"; }
Zum Schluss noch eine relativ komplexe PAC Datei, in der viele Dinge kombiniert werden und viele Werte überprüft werden. Hier wird sogar mit Variablen gearbeitet 🙂
function FindProxyForURL(url, host) { // variable strings to return var proxy_yes = "PROXY 10.4.5.20:8080"; var proxy_no = "DIRECT"; var resolved_ip = dnsResolve(host); // If a specific URL needs to bypass the proxy then send traffic direct. if (shExpMatch(url, "*.domain.local*")) { return proxy_no; } if (shExpMatch(url, "*.dmshm.local*")) { return proxy_no; } if (shExpMatch(url, "*rms.domain.com.au*")) { return proxy_no; } if (shExpMatch(url, "*.domain.net.au*")) { return proxy_no; } if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0")) { return proxy_no; } // If the source IP is in VIC then send traffic via the proxy if (isInNet(myIpAddress(), "10.3.0.0", "255.255.0.0"))return proxy_yes; // If the source IP is in NSW then send traffic via the proxy if (isInNet(myIpAddress(), "10.2.0.0", "255.255.0.0"))return proxy_yes; // If the proxy fails or the request doesn't meet any of the above criteria then send the traffic direct elsereturn "DIRECT"; }