Proxy-Server Squid
Squid soll bei uns zwei Dinge erledigen: Einen Cache aufbauen und nutzen sowie eine grundsätzliche Content-Filterung erlauben. Wie die entsprechenden Einstellungen sind, wird hier beschrieben.
Proxy-Chain
Es werden auf dem Router zwei Squids gestartet: squid und squid2.
Dazu ist zunächst im File /etc/init.d/squid die Zeile NAME=squid zu ersetzen durch:
NAME=`basename $0` NAME=${NAME#[SK][0-9][0-9]}
Sodann wird ein Hardlink namens /etc/init.d/squid2 auf squid erzeugt. In den rc-Startverzeichnissen wird der zweite squid entsprechend verlinkt:
lrwxrwxrwx 1 root root 15 Jan 24 21:11 rc0.d/K30squid -> ../init.d/squid lrwxrwxrwx 1 root root 16 Mar 8 09:38 rc0.d/K31squid2 -> ../init.d/squid2 lrwxrwxrwx 1 root root 15 Jan 24 21:11 rc1.d/K30squid -> ../init.d/squid lrwxrwxrwx 1 root root 16 Mar 8 09:39 rc1.d/K31squid2 -> ../init.d/squid2 lrwxrwxrwx 1 root root 15 Jan 24 21:11 rc2.d/S30squid -> ../init.d/squid lrwxrwxrwx 1 root root 16 Mar 8 09:39 rc2.d/S31squid2 -> ../init.d/squid2 lrwxrwxrwx 1 root root 15 Jan 24 21:11 rc3.d/S30squid -> ../init.d/squid lrwxrwxrwx 1 root root 16 Mar 8 09:39 rc3.d/S31squid2 -> ../init.d/squid2 lrwxrwxrwx 1 root root 15 Jan 24 21:11 rc4.d/S30squid -> ../init.d/squid lrwxrwxrwx 1 root root 16 Mar 8 09:39 rc4.d/S31squid2 -> ../init.d/squid2 lrwxrwxrwx 1 root root 15 Jan 24 21:11 rc5.d/S30squid -> ../init.d/squid lrwxrwxrwx 1 root root 16 Mar 8 09:40 rc5.d/S31squid2 -> ../init.d/squid2 lrwxrwxrwx 1 root root 15 Jan 24 21:11 rc6.d/K30squid -> ../init.d/squid lrwxrwxrwx 1 root root 16 Mar 8 09:40 rc6.d/K31squid2 -> ../init.d/squid2
Das Entscheidende bei der Sache aber ist, dass mit den beiden squids eine Proxy-Kette (proxy-chain) aufgebaut wird. Dies wird erreicht, indem /etc/squid/squid.conf auf /etc/squid/squid2.conf mit nachfolgenden Änderungen kopiert wird:
http_port 3129 transparent icp_port 3131 cache_peer localhost parent <parent-port> <parent-icp-port> proxy-only cache_dir ufs /var/spool/squid2 100 16 256 access_log /var/log/squid/access2.log squid cache_log /var/log/squid/cache2.log cache_store_log /var/log/squid/store2.log pid_filename /var/run/squid2.pid # # squidGuard redirect_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf redirect_children 5
(Die beiden Ports des parent-Proxys habe ich hier nicht explizit aufgeführt, man wird vielleicht später sehen, warum.
Transparenter Proxy
Nun sollen aber alle nach draußen gehenden Verbindungen über den Port 3129 gehen. Der Proxy soll also transparent (oder unsichtbar) für die Nutzer sein.
Die Transpararenz wird erreicht durch die NAT-te Firewall, die ich mit shorewall aufbaue. Der passende Eintrag in /etc/shorewall/rules lautet daher:
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ # PORT PORT(S) DEST LIMIT GROUP REDIRECT loc 3129 tcp www - !172.31.0.0/16 ACCEPT $FW net tcp www
Der Zustand bis hier (und nach dem Neustart von squid/shorewall): Jede im Heimnetz angeforderte Webseite wird über den Proxy squid2 gelenkt. Die Nutzer merken davon nichts und können wie gehabt weiter surfen. Ggf. haben wir sogar einen kleinen Geschwindigeitseffekt. Aber der ist nicht mein Hauptanliegen. Worum es geht, folgt nun.
Web-Filterung
Wie man in der Konfiguration des squid2 sieht, wird dort mittels squidGuard der Webverkehr gefiltert. Daher wird bei uns im lokalen Netz automatisch krummes Internet-Zeugs blockiert.
Filter-Umgehung
Wie umgeht man aber den Web-Filter, wenn man muss? Allzu genau beschreibe ich das hier nicht, aber die Idee sollte klar sein: Wer in seinem Browser einen Proxy einstellt (und zwar den Parent-Proxy) aus obiger Verkettung, der kann....