weidner/computer/netz/

Mit pacparser die Proxy-Konfiguration testen

Webbrowser können auf das Internet direkt oder über Proxies zugreifen. Dabei können letztere verschiedene Funktionen übernehmen. Sie können Inhalte zwischenspeichern, filtern und auf Schadcode untersuchen. Manchmal sind Proxies der einzige Weg, eine URL zu erreichen.

Bei einem einzelnen Proxy und einer einfachen Netzstruktur ist die Konfiguration im Webbrowser schnell erledigt. Adresse und Portnummer eintragen, eventuell noch ein paar Ausnahmen und schon kann es losgehen.

Im Laufe der Zeit stellt sich dann manchmal heraus, dass ehemals einfache Strukturen viel komplexer geworden sind. Weitere Ausnahmen sind hinzugekommen und auf einmal werden noch andere Proxies benötigt, zwischen denen hin- und hergeschaltet werden muss.

Für diese Fälle gibt es mit Proxy Auto Configuration (PAC), ein Verfahren, dem Browser komplexe Entscheidungen über den zu verwendenden Proxy im Voraus mitzuteilen. Das funktioniert im Wesentlichen mit einer Datei, die eine JavaScript-Funktion namens FindProxyForURL() enthält, welche die URL und den Hostnamen daraus übergeben bekommt und einen String zurückliefert, der dem Browser mitteilt, ob er die URL direkt oder über einen Proxy ansteuern soll. Hilfreiche Informationen zur Proxy Auto Configuration bietet unter anderem die Website https://findproxyforurl.com/.

Die Funktion FindProxyForURL() kann ihrerseits selbst wiederum sehr komplex werden, so dass der Wunsch aufkommt, sie zu testen.

FindProxyForURL() testen

In älteren Webbrowser-Versionen, war es möglich, den aktuellen Zustand oder den Inhalt von Variablen mit der JavaScript Funktion alert() auszugeben. Das funktioniert seit September 2015 jedoch in keinem der größeren Webbrowser mehr, wie man auf findproxyforurl.com nachlesen kann.

Mit Google Chrome kann ich die Proxy-Auswahl über die URL 'chrome://net-internals/#proxy' debuggen. Ein Artikel auf arctica-proxy.com zeigt auf, wie das geht. Allerdings muss ich dazu vor Ort am Clientrechner sein, und dieser muss Google Chrome installiert haben.

Gerade beim Entwickeln von komplexen PAC-Files möchte ich die Auswirkungen von Änderungen sehen, bevor ich die Datei auf die Client-Rechner kopiere. Dafür gibt es verschiedene Tools, auf die ich zurückgreifen kann.

App::proxyforurl

Das Perl-Modul App::proxyforurl ist ein einfacher Online PAC File Parser, bei dem ich über ein HTML-Formular mein PAC-File, die URL und den Host angebe und als Ergebnis den Proxy-String zurückbekomme. Für einen schnellen Test eines nicht allzu komplizierten PAC-Files kann das durchaus ausreichend sein.

Ich kann App::proxyforurl online testen und, wenn mir die Funktionalität reicht, das Modul - und die Module, von denen es abhängt - auf meinem Rechner installieren.

Ist das PAC-File etwas komplizierter, zum Beispiel, weil die zu verwendenden Proxies auch von der IP-Adresse des Clients abhängen, dann komme ich an die Grenzen von App::proxyforurl. In diesem Fall kann mir die Bibliothek pacparser von Manu Garg weiterhelfen, beziehungsweise das dazugehörige Programm pactester.

pacparser

Pacparser nutzt den JavaScript-Interpreter SpiderMonkey von Mozilla um das PAC-File zu verarbeiten und den Proxy-String zu ermitteln. Ich kann die URL, den Host und die IP-Adresse des Clients übergeben um das Ergebnis zu beeinflussen.

Damit kann ich pacparser nutzen, um mein PAC-File syntaktisch (auf Fehler im JavaScript) und semantisch (auf Fehler in der Logik) zu testen.

Installation

Um pacparser zu installieren schaue ich im Release-Verzeichnis auf GitHub nach dem letzten Release, lade dieses auf meinen Rechner und entpacke es. Als ich den Artikel schrieb, war das Version 1.3.7.

$ RELEASES=https://github.com/pacparser/pacparser/releases
$ wget ${RELEASES}/download/1.3.7/pacparser-1.3.7.tar.gz
$ tar xzf pacparser-1.3.7.tar.gz

Um die Bibliothek und das Kommandozeilenprogramm pactester zu übersetzen brauche ich im ausgepackten Verzeichnis nur make -C src aufrufen. Da ich das Programm lieber mit stow im System installiere, gebe ich zusätzlich noch den PREFIX an.

$ cd pacparser-1.3.7/
$ make -C src PREFIX=/usr/local/stow/pacparser-1.3.7

Das Installieren des Programms und der Bibliothek ist ähnlich einfach, normalerweise make -C src install, bei mir kommt wieder der PREFIX dazu und anschließlich installiere ich es in den Systemverzeichnissen mit stow.

# make -C src PREFIX=/usr/local/stow/pacparser-1.3.7 install
# cd /usr/local/stow/
# stow pacparser-1.3.7

Da pactester die Bibliothek libpacparser.so dynamisch einbindet und die Bibliothek gerade erst installiert wurde, muss ich danach noch ldconfig aufrufen, damit die Bibliothek beim Programmstart gefunden wird.

# ldconfig /usr/local/lib

Nun kann kann ich das Programm verwenden.

$ pactester --help

Usage:  pactester <-p pacfile> <-u url> [-h host] [-c client_ip] [-e]
        pactester <-p pacfile> <-f urlslist> [-c client_ip] [-e]

Options:
  -p pacfile   : PAC file to test (specify '-' to read from standard input)
  -u url       : URL to test for
  -h host      : Host part of the URL
  -c client_ip : client IP address (as returned by myIpAddres() function
                 in PAC files), defaults to IP address on which it is running.
  -e           : Deprecated: IPv6 extensions are enabledby default now.
  -f urlslist  : a file containing list of URLs to be tested.
  -v           : print version and exit

Damit habe ich eine einfache Möglichkeit, modifizierte PAC-Files zu testen, bevor ich sie auf die Client-Rechner verteile.

Richtig interessant wird es, wenn ich Regressionstests mit pactester zur Qualitätssicherung verwende. Darauf werde ich in einem anderen Artikel zurückkommen.

Posted 2017-10-06
Tags: