Nachdem ich länger geknobelt und gegoogelt habe, wie das funktioniert, musste ich mal wieder an diesen xkcd-Comic denken.
Das Problem
Für eine Hotspot-Lösung im schulischen Einsatzumfeld wollten wir es ermöglichen, dass optional alle aufgerufenen Seiten der Clients geloggt werden. Es lag nahe, dies mit einem lokalen Proxyserver zu erledigen, der das Logging erledigt, nachdem sich die Clients sich am CoovaChilli, der auf dem selben Host installiert sein sollte, authentifiziert haben.
Das Problem lässt sich also zusammenfassen als „Transparenter Proxy auf einem CoovaChilli-Host“, Google findet viele Treffer und wenige Lösungen, auf die richtige Spur gebracht hat mich dieser Treffer.
Eine Lösung
Zunächst habe ich den Filterproxy ffproxy installiert und diesen so konfiguriert, dass er als Proxy funktioniert. Damit das trotz CoovaChilli funktioniert, muss in der Konfiguration von CoovaChilli in der Datei
/etc/chilli/config
Der Proxy-Port 8080 durch die folgende Option erlaubt werden:
HS_TCP_PORTS="80 443 8080"
Nun ist es allerdings den Clients des Hotspot-Netzes möglich, durch Verwendung von http://<HotSpot-IP>:8080 als Proxy ihres Browsers ohne Anmeldung zu surfen.
Dies wird durch eine entsprechende iptables-Regeln in
/etc/chilli/ipup.sh
unterbunden:
# This rule prevents hosts on the subscriber network to
#reach the local proxy directly via port 8080
$IPTABLES -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -d 192.168.0.1 --dport 8080 -j DROP
Alle Pakete aus dem Tunnel Interface, welches nach der Authentifizierung benutzt wird, werden allerdings über den Proxy geschoben:
# This rule forwards all port 80 traffic to the local ffproxy for logging
$IPTABLES -I PREROUTING -t nat -i $TUNTAP -p tcp -s 192.168.0.0/24 ! -d 192.168.0.1 --dport 80 -j REDIRECT --to 8080
Nun kann man ffproxy nach Wunsch konfigurieren: loggen und filtern nach Belieben.
Die IP-Adressen müssen dabei natürlich an die lokalen Gegebenheiten angepasst werden.