Update: Die angegebene Lösung scheint bei mir nicht mehr zu funktionieren.
Durch irgend ein Update von Seiten Apples wird die PAC-Datei ignoriert.
Hier findet sich ein neuer Lösungsweg.

– -

LittleSnitch gehört für mich nun schon seit einigen Jahren zum unverzichtbaren Repertoire. Wer LittleSnitch selbst nicht einsetzt, für den ist dieses Tutorial überflüssig.

Ebenfalls überflüssig ist dieses Tutorial, sollte man GlimmerBlocker nicht einsetzen.

Ebenso überflüssig: Nutzt man Firefox, Chrome oder einen anderen Browser für sein persönliches Web-Erlebnis, bei welchem man separate Proxy-Einstellungen tätigen kann, und trägt statt in den System-Proxy-Einstellungen nur in diesem Browser GlimmerBlocker als Proxy ein, so erledigt sich dieses Tutorial ebenfalls.

Sowohl GlimmerBlocker wie auch LittleSnitch sind schon seit einiger Zeit ein unverzichtbares Must-Have geworden. Allerdings...oder zum Glück?...ist mir aufgefallen, dass LittleSnitch und GlimmerBlocker zusammen nicht so ihren Dienst verrichten, wie sie eigentlich sollten. 

Wieso? Es ist die Art ihrer Funktion: LittleSnitch überwacht jedes aktive Programm, beziehungsweise jeden aktiven Prozess, ob dieser eine Internetverbindung zu einem Server herstellen will und meldet dies in jenem Fall dem Nutzer, der darüber entscheidet, ob dieses Programm das darf oder nicht.

Volle Kontrolle darüber, welches Programm sich wohin verbindet.

GlimmerBlocker ist eine Proxy-Software, die sich einfach erklärt zwischen Programm und Internet (und vor LittleSnitch) schaltet. Für LittleSnitch gibt es nach der Installation von GlimmerBlocker nur noch ein Programm, das eine Internetverbindung sucht: Nämlich GlimmerBlocker. Alle vorher getätigten Regeln "ja, EyeTV darf auf dem Updateserver von Elgato stöbern", "nein, der Adobe Updater darf nicht in's Internet, der nervt" sind nun mehr oder weniger für die Katz'.

Egal, ob man mit Safari die Google-Seite besucht oder ob EyeTV nach einer neuen Version bei seinem Hersteller sucht: Immer meldet LittleSnitch, dass GlimmerBlocker eine Internetverbindung möchte.

Für mich bedeutete das für's Erste, dass ich jedes Mal, wenn ich im Internet surfte, GlimmerBlocker aktivierte und danach gleich wieder deaktivierte. Allerdings lies es mir keine Ruhe, bis ich eine bessere Lösung hatte...und die hatte ich auch schon bald gefunden :-) 

Eine kleine Warnung voraus: Bitte probiert dies nur aus, wenn ihr wisst, für was LittleSnitch und GlimmerBlocker gut sind und wenn ihr ein bisschen Hintergrundwissen zum Thema "Netzwerk" habt. Im schlimmsten Fall könnt ihr eure Netzwerkeinstellungen verkonfigurieren und es geht erstmal garkein Internetzugriff mehr... (Und ohne Internet googelt es sich schwer)

Wir brauchen

  • Wie erwartet: LittleSnitch und GlimmerBlocker
  • Der Apache Webserverdienst inklusive PHP-Modul sollte aktiviert sein

Was ich vor habe

Ich will eine dynamische PAC-Datei erstellen, über die das Programm, das auf das Internet zugreifen will, entweder über GlimmerBlocker geleitet wird (Safari sollte diesen Weg gehen) oder "direkt" ohne GlimmerBlocker in's Internet darf (womit dann LittleSnitch greifen würde).
Sozusagen also eine digitale Weiche.

Eine PAC-Datei ist eigentlich eine statische Text-Datei. Allerdings spricht nichts dagegen, diese mit Hilfe von Perl oder PHP etwas dynamischer zu gestalten.

Da PHP in MacOS X integriert ist und ich mich damit etwas besser auskenne, als mit Perl, möchte ich im Folgenden diesen Weg gehen.

Apache aktivieren

Um zu prüfen, ob PHP aktiv ist, sollte man kurz zum Terminal greifen und einen Blick in die Apache-Konfiguration werfen:

MacOS X 10.4.x und älter:

sudo pico /etc/httpd/httpd.conf 

MacOS X 10.5.x und neuer:
sudo pico /etc/apache2/httpd.conf

Apache Konfiguration
Nach der Eingabe wird man nach seinem Administrator-Kennwort gefragt. Dieses bitte eingeben und mit Enter bestätigen. Schon ziemlich am Anfang der Konfigurations-Datei erscheinen die verfügbaren Module, die geladen werden. Interessant ist die Zeile, in der das Modul PHP5 (oder in MacOS X 10.4.x einfach nur PHP) geladen wird. Dieser Zeile sollte wie im Screenshot zu sehen kein # vorangestellt sein. Ist dieser Zeile (wie in der Zeile darunter zu sehen) ein # vorangestellt, so ist diese Zeile inaktiv. Lösche das # und speichere mit ctrl-O. Nun können Datei und Texteditor mit ctrl-X wieder geschlossen werden. Ebenso die Terminal-Session mit exit beenden.


Webserver starten
Ist der Webserver von MacOS X überhaupt aktiv? Dies ist nach einem Blick in die Systemeinstellungen > Freigaben/Sharing zu sehen: Die Webfreigabe (Bezeichnung kann je nach Systemversion varrieren und "Websharing" heißen) sollte aktiv sein. Wurde im vorherigen Schritt die httpd.conf geändert, empfiehlt es sich allerdings, die Webfreigabe nochmals kurz zu deaktivieren und erneut zu aktivieren, damit der Apache-Dienst mit der neuen Konfiguration startet.
 

Erstellen wir nun die .pac-Datei

Erstelle in TextEdit (oder einem anderen Texteditor. Ich liebe ja immer TextWrangler, den Freeware-Bruder von BBEdit, für solche Aktionen) ein neues Dokument. Bei der Verwendung von TextEdit bitte zuerst im Menü "Format" den Befehl "In reinen Text umwandeln" wählen. Wir wollen in unserer Datei keine Formatierungen wie fetten und kursiven Text ;-)

Man kopiere folgenden Text in das Dokument...

<?php
header("Content-type: application/x-ns-proxy-autoconfig");
header("Date: " . gmdate('D, d M Y H:i:s GMT', time()));
header("Last-Modified: " . gmdate('D, d M Y H:i:s GMT', time()));
header("Expires: " . gmdate('D, d M Y H:i:s GMT', time()+60*30));
$proxy = (strpos($_SERVER['HTTP_USER_AGENT'], "Safari" && strpos($_SERVER['HTTP_USER_AGENT'], "WebProcess") === false && strpos($_SERVER['HTTP_USER_AGENT'], "PluginProcess") === false) ? "DIRECT" : "PROXY 127.0.0.1:8228";
?>
function FindProxyForURL(url, host) {
   return '<?= $proxy =>';
   }

...und speichere dieses unter

/Library/Webserver/Documents/proxy.php
.
Das Verzeichnis
/Library/Webserver/Documents
ist sozusagen das Root-Verzeichnis des Webservers. Alle Dateien, die darin liegen, sind im Browser unter
http://127.0.0.1/
.... abrufbar (wobei 127.0.0.1 für den eigenen Computer, den localhost, steht). Diese Datei wäre also mit http://127.0.0.1/proxy.php aufrufbar.
Die Portangabe
:8228
sollte sich mit dem Port decken, der in den GlimmerBlocker-Einstellungen vergeben ist (siehe Screenshot im folgenden Abschnitt).

Öffne einfach mal diesen Link http://127.0.0.1/proxy.php in Safari und lasse Dich vom Ergebnis überraschen ;-)
Sollte Safari hier denselben Text anzeigen, den wir vorhin in das Dokument kopiert haben, dann ist PHP nicht aktiv und kann das Skript nicht verarbeiten! Eine richtige Ausgabe sollte sein:

function FindProxyForURL(url, host) {
  return 'PROXY 127.0.0.1:8228';
  }

Was macht das Skript überhaupt?

Alles zwischen
<?php
und
?>
 ist PHP-Skriptcode.

In den Zeilen, die mit 'header' beginnen, wird zuerst eine Kopfinformation zurückgesendet, was das Dokument ist, wann es erstellt wurde, etc. Diese Information ist später nicht sichtbar. Danach Schauen wir, ob die Anfrage von Safari oder irgendwem anderen kommt. Kommt sie nicht von Safari, schreiben wir "DIRECT" in unsere Variable (ich gehe mal von dem Fall aus, dass sich nicht noch ein Proxy-Server hinter dem Netzwerk befindet, sonst sollte man statt "DIRECT" die Syntax "PROXY *IP*:*PORT*" nehmen), wenn nicht, schreiben wir "PROXY 127.0.0.1:8228" und sorgen letztendlich dafür, dass die Anfrage an GlimmerBlocker weitergegeben wird, der – damit die Sache funktioniert – auf Port 8228 laufen sollte (siehe Bild rechts). Letztendlich wird der Text 'function.... ' ausgegeben, was einer PAC-Datei entspricht, mit der unser System etwas anfangen kann.

Noch ein kleiner Eingriff in die Systemeinstellungen...

Wir haben viel getippt und konfiguriert, doch es funktioniert noch nichts. Bevor wir unsere kleine Bastelei in die Tat umsetzen, sollten wir vielleicht noch ein paar Punkte prüfen:

  • Bei der Eingabe von http://127.0.0.1/proxy.php im Browser erscheint die oben beschriebene Funktion?
  • GlimmerBlocker ist sowohl installiert, wie auch aktiviert und läuft auf Port 8228? Sollte letzteres nicht zutreffen, muss der Port entweder im Skript oder bei GlimmerBlocker angepasst werden

Gut, dann öffnen wir die Systemeinstellungen, Punkt "Netzwerk". Ich empfehle, die bestehende Einstellung/Umgebung erstmal zu duplizieren, damit man – sollte etwas nicht wie gewünscht funktionieren – schnell wieder zum aktuellen Stand zurückkommt.
Also: Im Aufklappmenü "Umgebungen" auf "Umgebungen bearbeiten..." klicken, dort die aktuelle Umgebung auswählen und im Zahnradmenü "Umgebung duplizieren" auswählen. Wählen wir vielleicht einen sinnigen Namen wie "GlimmerBlocker".

Diese neu erstellte Umgebung wählen wir dann auch gleich aus und klicken in der linken Leiste auf den verwendeten Netzwerkanschluss (Ethernet 1 oder Ethernet 2 oder AirPort – im Beispiel rechts bin ich nur via Kabel verbunden und wähle Ethernet 1). Danach ein Klick auf "Weitere Optionen..." und einen Klick auf den Reiter "Proxies".

Alle Häkchen unter "zu konfigurierendes Protokoll" sollten deaktiviert sein. Nur die "Autom. Proxy-Konfiguration" brauchen wir. Diese aktivieren und anklicken.

Achtung: Dies gilt für MacOS X 10.5 und 10.6 – bei MacOS X 10.4 sieht der Dialog etwas anders aus...

Bei Proxy-Konfigurations-Datei wählen wir keine lokale Datei aus, sondern geben unsere Adresse von vorhin ein: http://127.0.0.1/proxy.php Einmal auf "OK" geklickt und einmal auf "Anwenden" und die ganze Sache sollte wie gewünscht funktionieren.

 

Ob's funktioniert...?

Die Probe auf's Exempel machen kann man ganz einfach: Man öffne die LittleSnitch-Konfiguration und entferne sämtliche GlimmerBlocker-Regeln, die man findet, dazu entferne man die Regeln irgendeines anderen Programmes, das öfters mal nach dem Internet schreit (z.B. Mail).

Öffnet man nun letzteres Programm und führt dort eine Aktion aus, die einer Internetverbindung bedarf – und hoffen wir, die Internetverbindung funktioniert auch noch weiterhin – sollte sich nun erstmal LittleSnitch melden und sagen, dass das benutzte Programm (und nicht wie zu Anfang unserer Problemstellung GlimmerBlocker!) eine Internetverbindung benötigt. Man lasse es zu oder nicht...weiter zum nächsten Test.

In Safari eine Website öffnen – nun sollte LittleSnitch melden, dass GlimmerBlocker eine Internetverbindung möchte. Es wird empfohlen, sämtliche Server und sämtliche Ports (oder zumindest Port 80) für immer zu erlauben. Funktioniert alles wie beschrieben? Viel Spaß beim Surfen :-)

Neue Stolpersteine

Neuere Safari-Versionen gliedern wie es scheint einige Anfragen an einen "WebProcess" und "PluginProcess" aus. So kommt die Internet-Anfrage nicht von Safari selbst, sondern von "WebProcess" beziehungsweise "PluginProcess". Die pac-Datei sollte man dementsprechend anpassen:

$proxy = (strpos($_SERVER['HTTP_USER_AGENT'], "Safari" && strpos($_SERVER['HTTP_USER_AGENT'], "WebProcess") === false && strpos($_SERVER['HTTP_USER_AGENT'], "PluginProcess") === false) ? "DIRECT" : "PROXY 127.0.0.1:8228";

Neu hierbei:

&& strpos($_SERVER['HTTP_USER_AGENT'], "WebProcess") === false && strpos($_SERVER['HTTP_USER_AGENT'], "PluginProcess") === false

Ich habe dies bereits beim Haupt-Quelltext weiter oben auf der Seite berücksichtigt.

Darüberhinaus kann dieses Problem nun auch in neueren Versionen von GlimmerBlocker direkt mit Hilfe von GlimmerBlocker gelöst werden. Wie das geht, steht hier.

Auch hier wird mit einer pac-Datei gearbeitet. Diese wird allerdings von GlimmerBlocker selbst "gehostet".  Apache muss auf dem eigenen Computer also nicht aktiviert werden.