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....