AA_kein-durchgang_123rf-13956990_OleksandrPlakhotniuk.jpg

© Oleksandr Plakhotniuk, 123RF

Kein Durchgang

Squid als Spiel- und Social-Network-Bremse

09.01.2013
Mit Squid kontrollieren Sie den HTTP-Datenverkehr schnell und einfach, ohne die Nutzer allzusehr einzuschränken.

Der Sohn erledigt allnächtlich Monster in den virtuellen Welten diverser Online-Rollenspiele, die Tochter postet rund um die Uhr auf Facebook, die Mitarbeiter verschleudern Arbeitszeit auf Ebay, Amazon, Twitter oder noch viel schlimmeren Seiten – nimmt solch unerwünschtes Verhalten Überhand, ist guter Rat oft teuer. Pures Verbieten erzeugt Heimlichkeit und zieht möglicherweise unangenehmere Folgen nach sich, als ein kontrolliertes Erlauben. Da trifft es sich gut, dass sich mit dem freien Proxy Squid schnell und einfach Grenzen setzen lassen.

Bei Squid [1] handelt es sich um einen Fork des 1994 gegründeten Harvest-Projects (Harvest Cache Daemon), der 1996 von Duane Wessels ins Leben gerufen wurde. Die Version 1.0 erschien bereits im Juli 1996. Der Proxy-Server steht unter der GPLv2 und wird von den Entwicklern in erster Linie als Caching Proxy bezeichnet. Tatsächlich eignet sich Squid hervorragend, um Webseiten zwischenzuspeichern, den Verbrauch von Bandbreiten zu verringern, lahmen Webservern zu einem Performance-Schub zu verhelfen oder die Last zwischen mehreren Webservern zu verteilen. Doch neben diesen Haupteinsatzgebieten bietet Squid etliche andere interessante Funktionen, mit deren Hilfe sich elegant steuern lässt, wer wann welche Webseiten ansurfen darf.

Squid installieren

Squid findet sich in den Repositories aller gängigen Distributionen und lässt sich daher in der Regel mithilfe der distributionseigenen Paketwerkzeuge installieren.

Es gilt dabei zu beachten, dass einige Distributionen noch auf ältere Squid-Versionen vor 3.2 setzen, die HTTP 1.1 noch nicht unterstützen. Wer auf die aktuelle Version des HTTP-Protokolls angewiesen ist, muss in dem Fall ebenfalls manuell installieren oder prüfen, ob sich nicht ein anderer Web-Proxy (Privoxy, Tinyproxy) besser eignet.

Möchten Sie die aktuellste Version (zu Redaktionsschluss Squid 3.2.5 vom 10.12.2012) nutzen oder selbst bestimmen, wo der Proxy installiert wird und welche Features er beinhalten soll, dann greifen Sie zum Quellcode. Sie entpacken der Tarball in ein beliebiges Verzeichnis, wechseln dorthin und übersetzen Squid mit dem klassischen Dreischritt configure, make und (als root) make install.

Mit ./configure --help lässt sich eine Liste aller verfügbaren Features ausgeben. Interessante Kandidaten für selbst kompilierte Squid-Instanzen stellen beispielsweise --enable-linux-netfilter oder --with-openssl=/usr/bin/openssl dar. Es gibt zudem ein Languagepack [2], mit dem sich Squid in 44 Sprachen lokalisieren lässt.

Theorie …

Sie konfigurieren Squid über die Datei /etc/squid/squid.conf. Für gewöhnlich nimmt der Proxy seine Anfragen am Port 3128 entgegen, diesen Wert gilt es auch in den Proxy-Einstellungen des Webbrowsers anzugeben. Möchten Sie einen anderer Port verwenden, setzen Sie diesen in der Anweisung http_port Port in der squid.conf.

Für diesen Artikel betrachten wir nur die Access Control Lists (ACLs), lassen das Caching komplett außen vor und übernehmen hier die Einstellungen der Distribution beziehungsweise der Entwickler. Über die ACLs und die damit verknüpften _access-Direktiven steuern Sie, wer wann auf welche Webseiten zugreifen darf. Dazu bilden Sie ACLs nach dem Schema acl Name Typ Werte, wobei Sie die Werte direkt angegeben oder mittels einer Datei übergeben. Bei letzterer Variante geht Squid von einem Wert pro Zeile aus. Squid unterscheidet bei den ACL-Namen zwischen Groß- und Kleinschreibung. Geben Sie mehrere ACLs mit dem gleichen Namen und unterschiedlichen Werten an, behandelt Squid diese additiv, also wie eine einzige ACL mit mehreren Werten.

Bei den ACL-Typen sind verschiedene Möglichkeiten erlaubt. So lassen sich beispielsweise IP-Adressen und Domainnamen für Quell- und Zielrechner ebenso angeben wie MAC-Adressen, Zeiten, reguläre Ausdrücke [3] in Domainnamen, URLs oder Referers, Ports, Protokolle oder HTTP-Request-Methoden. Die Tabelle "ACL-Typen" gibt einen Überblick über die wichtigsten Typen, mit denen sich unser Vorhaben realisieren lässt. In der Tabelle finden sich zusätzlich Hinweise, ob es sich um einen "schnellen" oder "langsamen" ACL-Typ handelt. Schnelle Typen kann Squid sofort abarbeiten, während er bei langsamen noch zusätzliche Informationen einholen muss – etwa über eine DNS-Abfragen oder eine Nutzerauthentifizierung.

ACL-Typen

Typ Beschreibung fast/slow
arp MAC-Adressen fast
browser Regulärer Ausdruck, um anfragende Browser zu identifizieren fast
dst Server-IP-Adresse slow
dstdomain Domainname des Servers fast
dstdom_regex Regulärer Ausdruck in Server-Domainname fast
myip | localip IP-Adresse am Squid-Proxy, mit der sich ein Client verbunden hat, ab Squid 3.2 localip fast
myport | localport Port am Squid-Proxy, mit dem sich ein Client verbunden hat, ab Squid 3.2 localport fast
port Port-Nummer am Server fast
proto Übertragungsprotokoll (http, https, ftp, gopher) fast
random Pseudozufälliger Typ ab Squid 3.2, der auf einer angegebenen Wahrscheinlichkeit basiert fast
rep_header Regulärer Ausdruck für Regeln, die Response-Header auswerten fast
rep_mime_type Regulärer Ausdruck, um Content-Type in Antwort zu identifizieren fast
req_header Regulärer Ausdruck, um Regel auf Header in Anfrage anzuwenden fast
req_mime_type Regulärer Ausdruck, um Content-Type in Anfrage zu identifizieren fast
src Client-IP-Adresse fast
srcdomain Domainname des Clients slow
srcdom_regex Regulärer Ausdruck im Client-Domainname slow
time Zeitangabe, Tag und Stunde fast
url_regex Regulärer Ausdruck in URL fast
urlpath_regex Regulärer Ausdruck in URL-Pfad, berücksichtigt Protokoll und Hostname nicht fast

Die ACLs allein bringen jedoch noch nicht viel. Um ihr Potenzial zu entfalten, müssen Sie sie mit den Access-Control-Directives kombinieren, also den Angaben, was nun erlaubt ist und was nicht. Diese Direktiven haben die Form

Direktive allow|deny [!]ACL

Hier dürften http_access und http_reply_access die interessantesten Anweisungen sein, die Tabelle "Direktiven" nennt weitere. Die Access-Direktiven lassen sich mit mehreren ACLs verknüpfen, was recht komplexe Regeln ermöglicht. Die Direktiven arbeitet Squid von oben nach unten ab. Enthält eine Zugriffsregel mehr als eine ACL, so greift sie nur, falls alle ACLs zutreffen. Findet Squid eine nicht zutreffende ACL, verwirft er die komplette Anweisung.

Direktiven

Direktive Beschreibung
http_access Erlaubt oder verbietet HTTP-Requests auf Basis der angegebenen ACLs.
http_reply_access Erlaubt oder verbietet Antworten (Replies) eines Servers auf Client-Anfragen.
log_access Legt fest, welche Requests Squid protokolliert.
request_header_access Regeln für bestimmte Header, beispielsweise User-Agent, Link, Server, Referer oder From. Header, für die Sie ein Deny gesetzt haben, entfernt Squid.
reply_header_access Wie request_header_access, jedoch für Reply-Header.

Squid arbeitet die Direktiven solange ab, bis er eine findet, die er auf die aktuelle Anfrage anwenden kann. Erkennt er keine passende Regel, verhält sich Squid recht interessant: Er wendet dann das Gegenteil der letzten Anweisung in der Kette an. Um hier keine Überraschungen zu erleben und sicherzugehen, dass Squid wirklich nur das Erlaubte zulässt, ist es sinnvoll, http_access deny all als letzte Regel anzuwenden.

… und Praxis

Schreiten wir zur Tat. Wie bei allen Vorhaben hilft es auch bei der Squid-Konfiguration, die Probleme vorher einzukreisen und dann gezielt abzuarbeiten. In Listing 1 bis Listing 3 finden sie eine Beispielkonfiguration, die browserbasierte MMORPGs und Social Networks im heimischen Netz nur zu festen Zeiten zulässt. So kommen die Kurzen auf ihre Kosten, aber trotzdem rechtzeitig zum Essen und ins Bett.

Listing 1

# ---- /etc/squid/squid.conf
acl all src 0.0.0.0/0.0.0.0
#lokales Heimnetzwerk
acl localnet src 192.168.10.0/24
#Rechner der Eltern
acl eltern_rechner src 192.168.10.5/32 192.168.10.11
# Definition der zu ueberwachenden Spiele und Social
# Networks. Ausgelagert in leicht zu ergaenzende
# Extra-Dateien, da es hier haeufig Aenderungen gibt
#
# Browserbasierte MMORPGs
acl mmorpgs dstdomain "/etc/squid/mmorpgs.txt"
# Social Networks
acl social_networks dstdomain "/etc/squid/soc_nets.txt"
# Spiel- und Social-Network-freie Zeiten
# Mittagessen am Wochenende
acl spielfrei time AS 12:00-15:00
# Abendessen an allen Tagen
acl spielfrei time DAS  19:00-21:00
# Nachtruhe Sonntag bis Donnerstag
acl spielfrei time SMTWH        23:00-23:59 0:00-7:00
# FTP-Anfragen
acl ftp_reqs proto ftp
# HTTP-Anfragen an soziale Netze und Browser-MMORPGs
# zu bestimmten Zeiten verbieten
http_access deny localnet !eltern_rechner social_networks spielfrei
http_access deny localnet !eltern_rechner mmorpgs spielfrei
# alle FTP-Anfragen verbieten
http_access deny ftp_reqs
# für lokales Netz vieles erlauben
http_access allow localnet
# Deny-Direktive für alle sonstigen Fälle
http_access deny all
# Logging für Eltern ausschalten
log_access deny eltern_rechner

Listing 2

# ---- /etc/squid/mmorpgs.txt
.gilforstales.com
.juggergame.com
.gaiaonline.com
.playomg.com
.gunshine.net
.aq.com
.bigpoint.com
.kabam.com
.r2games.com
.callofgods.com
.drakensang.de
.wsgame.com

Listing 3

# ---- /etc/squid/soc_nets.txt
.facebook.com
.schuelervz.net
.jappy.de
.netlog.com
.tumblr.com
plus.google.com
.pferde.de
.youtube.com

Diese Konfiguration sollte ein komfortables Surfen erlauben, mit den von uns gewünschten Einschränkungen. Wir haben bewusst auf portbasierte Filterungen und Ähnliches verzichtet und gehen davon aus, dass im Netzwerk nur "gewöhnliche" Nutzer agieren, die meist mit dem Browser arbeiten und auf zusätzliche spezielle Anwendungen wie FTP-Clients verzichten. Für ausgebuffte Früchtchen müssen Sie sich neben der Squid-Filterung sicherlich auch noch mit wasserdichten Firewall-Regeln und zusätzliche Filterprogramme wie Dansguardian beschäftigen.

Beim Betrachten von Listing 2 und Listing 3 fällt auf, dass bei den dstdomain-ACLs viele Werte mit einem Punkt beginnen. Damit sorgen Sie dafür, dass auch alle Subdomains in der ACL berücksichtigt werden. Würden Sie auf den Punkt verzichten, müssten die Domains exakt den Anfragen entsprechen, um in der Access-Control-Direktive einen Treffer zu erzielen.

Bei den zeitbasierten ACLs dürfen Sie entweder Zeitspannen oder Tage angeben. Auch Kombinationen sind erlaubt, aber mindestens eine Angabe müssen Sie machen. Tage notieren Sie dabei in abgekürzter Form (siehe Tabelle "Tage"), bei den Zeiten sollte der erste Wert kleiner sein als der zweite.

Tage

Tag Abkürzung
Montag M
Dienstag T
Mittwoch W
Donnerstag H
Freitag F
Samstag A
Sonntag S
Alle Tage D

Mit squid -k parse testen Sie erst einmal, ob die Konfiguration formal stimmt: Bei Fehlern verweigert Squid sonst beim nächsten Start den Dienst. Wie bei so vielen Linux-Kommandos ist alles gut, wenn das Kommando durchläuft, ohne eine Meldung zu erzeugen. Erst jetzt lassen Sie Squid die neue Konfiguration mittels /etc/init.d/squid reload oder squid reconfigure neu einlesen.

Browser konfigurieren

Läuft Squid einmal, muss der Proxy nur noch in der Browserkonfiguration angegeben werden. Beim Opera findet sich die entsprechende Einstellung unter Einstellungen | Netzwerk | Proxyserver, bei Firefox finden Sie die Eingabemaske unter Einstellungen | Erweitert | Netzwerk | Verbindung (Abbildung 1).

Abbildung 1: Läuft Squid, müssen Sie den Proxy nur noch in der Browserkonfiguration angeben.

Ob die Konfiguration jetzt auch dort greift, wo sie soll, lässt sich in der Praxis ausprobieren. Schneller geht es jedoch mit dem kleinen, zum Squid-Fundus zählenden Werkzeug Squidclient, das über die Kommandozeile Anfragen an den Proxy sendet und so wertvolle Dienste leistet. Vorausschauend haben wir bereits alle Problem-Domains in Extra-Dateien ausgelagert, sodass wir unsere Access-Control-Direktiven jetzt automatisiert testen können. Bei Squidclient handelt es sich um ein Kommandozeilenprogramm, das Sie in der einfachsten Form mittels squidclient URL aufrufen. Das setzt jedoch voraus, dass Squid auf dem lokalen Rechner läuft.

In aller Regel will man sich aber um eine ganze Reihe von Rechnern kümmern, auf denen jeweils die selben Regeln gelten sollen, weswegen der Squid-Proxy auf einem eigenen Rechner läuft. In diesem Fall gilt es beim Aufruf von Squidclient den zusätzlichen Schalter -h IP-Squid anzugeben. Läuft Squid auch noch auf einem anderen Port als 3128, müssen Sie diesen mit -p Port ebenfalls angeben.

Für den Test selbst schreiben Sie am besten ein kleines Skript, dem Sie einfach eine Datei mit den zu testenden URLs übergeben. Unsere Skript aus Listing 4 ist ein wenig aufgebohrt: Es erweitert alle Domainnamen mit führenden Punkten – also alle, die auch für Subdomains gelten sollen – um ein www, da die URL ansonsten fehlerhaft wäre. Ferner wollen wir auf das Output-Geraschel verzichten. Uns genügt eine Status-Meldung, die zeigt, ob die zu filternden Domains es bis in den Browser schaffen.

Listing 4

#! /bin/bash
URLFILE=$1
while read url;
do
  echo $url
  squidclient -h 192.168.10.111 -p 3128 http://${url/^./www.} | grep "HTTP/"
done < URLFILE
exit 0

Abbildung 2 zeigt einen Testlauf, bei dem die Access-Control-Direktiven wie gewünscht greifen und anstelle lustiger Multiplayer-Spielchen ein Forbidden im Browser auftaucht.

Abbildung 2: Squidclient prüft, ob alle URLs wie geplant gesperrt wurden.

Transparenter Abfangjäger

Nun ist es für den Admin wenig erbaulich, wenn er einen hübschen Proxy samt sämtlicher ACLs aufsetzt, der gemeine Nutzer das aber umgeht, indem er schlicht die Proxy-Einstellungen des Browsers ändert. Hier hilft es, die Nutzer mithilfe eines separaten, als Squid-Proxy genutzten Rechners unter Assistenz durch Iptables zu zwingen, den Web-Zugriff über Squid abzuwickeln. Squid lässt sich so im "Interception"-Modus betreiben und bleibt in dieser Konfiguration für Clients völlig transparent.

Im Interception-Modus können Sie also darauf verzichten, jeden Client einzeln zu konfigurieren. Stattdessen weisen Sie ein zentrales Netzwerkgerät ( in der Regel den Router) an, alle Webanfragen über den Proxy zu leiten. So fällt es dem findigen Nachwuchs deutlich schwieriger, den Proxy zu umgehen: Dazu muss die Brut schon zu Tunneln oder zusätzlichen Hilfsprogramme greifen.

In Heimnetzwerken kommen oft Router mit integriertem DSL-Modem zu Einsatz, die eine Umleitung von HTTP-Anfragen über einen Proxy nicht unterstützen. Deshalb schummeln Sie in so einem Fall einfach und leiten die Anfragen erst einmal zum Squid-Proxy und erst anschließend zum Router. Der Squid-Proxy fungiert hier als Bridge, die den HTTP-Traffic an Squid durchreicht und alles andere ohne Umwege an den Router weiterleitet.

Um das zu erreichen, richten Sie auf dem Squid-Proxy eine kleine Firewall ein (Listing 5). Diese lässt sich später noch erweitern, um unliebsame andere Ports zu blocken, wie sie "echte" MMORPGs benötigen. Sie können freilich auch auf allen Clients die Firewall entsprechend einrichten, aber an zentraler Stelle lässt sie sich leichter pflegen. Um die Firewall-Einstellungen auch über Neustarts hinweg zu erhalten, packen Sie sie in ein Skript, das beim Systemstart aufgerufen wird – etwa in der /etc/rc.local beziehungsweise /etc/rc.d/rc.local.

Listing 5

# Squid-IP und Port
SQUIDIP=192.168.10.111
SQUIDPORT=3129
# Forwarding ein
echo 1 > /proc/sys/net/ipv4/ip_forward
# HTTP-Traffic über Squid-Proxy leiten
iptables -t nat -A PREROUTING -s $SQUIDIP -p tcp --dport 80 -j ACCEPT
# Umwege über andere Proxys/Programme berücksichtigen
iptables -A FORWARD -p tcp -m multiport --dport 3128,8080,6543,6544,7544,9050 -j DROP
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination $SQUIDIP:$SQUIDPORT
iptables -t nat -A POSTROUTING -j MASQUERADE

Zu guter Letzt teilen Sie Squid noch mit, dass Sie den Interception-Modus verwenden möchten. Dazu fügen Sie in der squid.conf die Direktive http_port 3129 intercept hinzu (beziehungsweise transparent für Squid-Versionen bis 3.1). Jetzt tragen Sie auf allen Client-Rechnern noch den Squid-Proxy als Gateway ein – beziehungsweise geben dem Proxy die IP-Adresse des Routers und dem Router eine neue IP-Adresse. Anschließend sollten alle HTTP-Anfragen vorbildlich gefiltert werden.

Der Interception-Modus vereinfacht zwar vieles, bringt aber auch einige Probleme mit sich. So gelingen dabei beispielsweise weder Proxy-Authentifizierung noch IP-Filterung. Zudem verletzten Sie TCP/IP-Standards, denn der Proxy empfängt Pakete, die eigentlich nicht für ihn bestimmt sind. Obendrein kann Squid nur HTTP-Pakete abfangen – kommen HTTPS oder FTP ins Spiel, reicht Squid entsprechende Anfragen direkt weiter.

Perfide Proxies

Noch kann es passieren, dass durchtriebene Nutzer in ihrer Gier nach Webseiten auf Web-Proxies zurückgreifen. Hier helfen ebenfalls wieder simple Access-Control-Direktiven, in denen reguläre Ausdrücke zum Einsatz kommen. Ein Beispiel zeigt Listing 6.

Listing 6

acl webprox_1 urlpath_regex -i \?u=
acl webprox_2 dstdom_regex -i prox
http_access deny webprox_1
http_access deny webprox_2

Das perfide an den Webproxies: Zwar nehmen viele davon die URL über den Parameter u (\?u=) entgegen, aber bei weitem nicht alle. Etliche Proxies verschlüsseln gar die Parameter in der URL, was die Jagd nicht leichter macht. Zudem könnten sich Anwender über zusätzliche Dienste wie Anon-Proxies (JAP, Jondonym), Socks-Proxies, Tor und VPN mogeln. Da hilft nur ordentliches Monitoring, um festzustellen, ob jemand den Squid-Proxy zu umgehen versucht.

Fazit

Squid eignet sich nur für Web-Inhalte, die sich im Browser darstellen lassen. Möchten Sie andere Protokolle sperren, kommen Sie um eine entsprechende Firewall-Konfiguration nicht herum. Iptables erlaubt auch zeitbasierte Regeln, diese sind jedoch etwas aufwändiger zu konfigurieren.

Mit Squid kontrollieren Sie den HTTP-Datenverkehr schnell und einfach, ohne die Nutzer zu sehr einzuschränken. Gewiefte Surfer werden allerdings immer wieder Lücken finden, durch die sie schlüpfen können. Daher sollten Sie auch nach dem Einrichten von Squid den Netzverkehr hin und wieder genau beobachten. 

Infos

[1] Squid: http://www.squid-cache.org

[2] Languagepack: http://www.squid-cache.org/Versions/langpack/

[3] Reguläre Ausdrücke: Frank Hofmann, "Schnipseljagd", LU 09/2011, S. 84, http://www.linux-community.de/24091

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Related content

Kommentare