20. Mai 2015

Raspberry PI als Proxy Server - Maßgeschneiderte Internetzensur

Wenn man von einem Proxy Server spricht, meint man damit ein Computer oder ein Dienst der den Zugriff auf das Internet regelt.

Jedoch nicht ganz so stumpf wie "Ja" und "Nein". Ein Proxy kann eine einzelne Seite durch Mechanismen bewerten und diese anschließend den Benutzern anzeigen oder eben auch nicht.

Dabei ist der eigentliche Computer, der die Anfrage gesendet hat, für den Ziel Webserver unbekannt.

Kleine Analogie des Proxy Servers

Jedes mal, wenn du einkaufen gehst, bist du ein Proxy für deine Familie.

Du bekommst ein entsprechenden Einkaufszettel in die Hand gedrückt und musst alle Sachen darauf besorgen.

Dein Sohn hat jetzt "Gummibärchen" drauf geschrieben. Leider gibt es aber keine mehr und du besorgst stattdessen andere Weingummis (Paketmanipulation).

Zwischenzeitig hattest du noch "Eis" auf den Einkaufszettel geschrieben. Entscheidest dich aber spontan beim Einkauf doch kein Eis zu kaufen (Filter).

Deine Familie hat jetzt den kompletten Wocheneinkauf, der Kassierer weiß aber nicht wer zu deiner Familie gehört oder wie groß deine Familie ist. Anhand der Größe deines Einkaufswagens kann er es höchstens mutmaßen. Während des Einkaufs warst du der einzige, der sich öffentlich gezeigt hat.

Was genau macht ein Proxy Server?

Ein Proxy Server hat die tolle Eigenschaft die bereits geladenen Dateien zwischenzuspeichern und diese dann direkt an den Benutzer auszuliefern ohne noch einmal auf das Internet zugreifen zu müssen.

Wenn man jetzt eher die gleichen Webseiten besucht, wird man schon allein dadurch ein deutlichen Vorteil beim Seitenaufbau merken. Gefühlt geht es viel, viel schneller 😃

So kann es sogar möglich sein, dass man Webseiten besuchen kann ohne überhaupt eine Internetverbindung zu haben. Vorausgesetzt ist natürlich, das man Zugriff auf den Proxy selbst hat.

Wie funktioniert ein Proxy Server?

Die Grundlegende Funktionsweise kann man der folgenden Skizze entnehmen:

Zugriff von mehreren Clients auf Webserver über einen Proxy Server

Client 1 möchte eine auf Webserver 3 zugreifen. Dabei sendet er dem Proxy Server eine Anfrage und dieser wiederum greift auf den Webserver 3 zu.

Client 2 möchte auf Webserver 2 zugreifen. Es wird ebenfalls eine Anfrage an den Proxy gesendet. Der Proxy verbietet jetzt aber den Zugriff, weil es sich um eine gesperrte Webseite handelt und sendet keine Anfrage an den Webserver 2.

Zum Schluss möchte Client 3 auf den Webserver 1 zugreifen. Der Proxy Server ruft alle Dateien ab und liefert diesem dem Client.

Wenn Client 3 noch einmal eine Abfrage sendet, überprüft der Proxy das Ablaufdatum und stellt die bereits gespeicherten Dateien zur Verfügung ohne diese noch einmal herunterzuladen.

In einem Netzwerk kann ein Proxy Server verschiedenen Funktionen übernehmen und auch auf verschiedenen Wegen eingesetzt werden. Dazu gehören unter anderem:

  1. Schutz der ClientsDiese Methode wird häufig in privaten Netzwerken eingesetzt. Die eigentlichen Clients bleiben für den Server unbekannt. Für den Server selbst, sieht es so aus als ob der Proxy die Pakete haben möchte und nicht der Client dahinter.So wird der Angriff unterbunden oder zumindest erschwert.
  2. Schutz der ServerDas gleiche nur andersherum. Wenn man ein Webserver aufsetzt und die Daten schützen möchte, stellt man ein Proxy Server vor den Webserver und lässt diesen angreifen.Wenn der Angreifer es dann schlussendlich geschafft hat, hat er lediglich den Proxy "abgeschossen". Der Webserver bleibt immer noch heile 😃
  3. BandbreitenkontrolleMit einem Proxy ist es theoretisch sogar möglich bestimmten Benutzern nur eine bestimmte Bandbreite zu liefern.Beispielsweise schaltet man ein öffentliches WLAN und reduziert die Bandbreite für seine Gäste auf ca. 500 kbit/s was immer noch über dem 2G (EDGE) liegt.
  4. Aufbereitung von DatenEin Proxy Server kann direkt nach dem herunterladen der Daten, diese auch direkt verarbeiten und in ein gewisses Format bringen.Sinnvoll kann es sein, wenn man beispielsweise alle heruntergeladenen Bilder aufbereiten möchte oder auch für eine Datenkonvertierung.
  5. InhaltskontrolleIm Grunde genommen ganz einfach. Webseiten mit gewaltverherrlichenden, nicht jugendfreien Inhalten etc. werden gesperrt. Alles andere darf angezeigt werden 😃
  6. Proxy zur AnonymisierungEin Anonymisierungs-Proxy wird sehr häufig verwendet um seine IP Adresse zu verschleiern. Dies funktioniert natürlich nur, wenn der Ziel Proxy keinerlei Daten sammelt und IP Adresse speichert.
  7. Andere Aufgaben...;Dies waren natürlich nur ein paar Beispiele. Ein Proxy Server lässt sich auch als eine Art Lastverteilung einsetzen oder um Statistiken für die Datenzugriffe etc. zu generieren oder, oder, oder ...;

Proxy Server auf einem Raspberry PI einrichten

Kommen wir jetzt endlich zum praktischen Teil 😃

Zunächst werden die benötigten Pakete heruntergeladen und die jeweiligen Konfigurationen gesichert:

$ apt-get install squid3 squidguard
$ cp /etc/squid3/squid.conf /etc/squid3/squid.conf.bak
$ cp /etc/squidguard/squidGuard.conf /etc/squidguard/squidGuard.conf.bak

Die Konfiguration für SQUID ist sehr umfangreich (~5780 Zeilen). Dafür ist die aber auch sehr gut Dokumentiert und bereits mit den verschiedenen Optionen ausgestattet, die man bei Bedarf aktivieren kann.

Trotzdem werde ich nur auf die Punkte eingehen, die für unsere Einsatzzwecke notwendig sind:

$ nano /etc/squid3/squid.conf

Schritt 1: Netzwerke bekannt geben

Als erstes müssen alle verfügbaren Netzwerke dem Proxy bekannt gemacht werden. Also suchen wir mal die passende Stelle dafür heraus:

^ ist laut nano notation ein STRG. ^W ist also die Tastenkombination für [STRG]+[W]
^W acl manager

an einer geeigneten Stelle werden dann alle verfügbaren Netzwerke registriert

acl mw_lan src 172.26.32.0/20
acl mw_wifi src 172.26.48.0/20

und Anschließend freigeschaltet:

^W http_access
http_access allow mw_lan
http_access allow mw_wifi

Damit hast du schon ein funktionsfähigen Proxy.

Schritt 2: Client IP verbergeben

Allerdings wird jetzt die IP von dem eigentlichen Rechner im header mitgesendet, was eigentlich nicht Sinn uns Zweck eines Proxy Servers ist 😃

^W TAG: forward

hier einfach die Raute (#) entfernen

forwarded_for on

Schritt 3: RAM-Disk erzeugen und verwenden

Für ein wenig mehr Performance, empfiehlt es sich eine RAM-Disk anzulegen. Diese lagert den kompletten Cache in den Arbeitsspeicher aus.

mkdir /mnt/ramdisk
nano /etc/fstab

Am ende der Datei, fügst du folgendes ein:

tmpfs /mnt/ramdisk tmpfs nodev,nosuid,noexec,nodiratime,size=200M 0 0

Jetzt noch die Ramdisk einhängen und noch einmal kontrollieren ob alles die auch da ist:

mount -a
df -h

Jetzt muss das ganze dem Squid noch beigebracht werden:

^W #cache_dir

Die ursprüngliche Zeile wird dann wie folgt abgeändert:

cache_dir ufs /mnt/ramdisk 192 16 256

Zuletzt noch den Zwischenspeicher etwas reduzieren:

^W cache_mem 256
cache_mem 192 MB

Bleiben wir in der Cache Sektion und ändern ein paar weitere Parameter:

maximum_object_size_in_memory 128KB
memory_replacement_policy heap GDSF
cache_replacement_policy heap LFUDA
maximum_object_size 4096 KB

Schritt 4: Squid als Web Filter

Am Ende der squid.conf kommt noch folgendes hinzu:

url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
url_rewrite_children 5

Das deutsche Unternehmen "Shalla Secure Services" pflegt und klassifiziert seit mittlerweile fast 10 Jahre eine Liste von verschiedenen URLs. Im laufe der Zeit sind bereits über 1,7 Millionen Einträge zustande gekommen.

Das coole an dieser Liste ist, sie ist direkt für squidGuard aufbereitet und kann entsprechend mit wenigen Handgriffen verwendet werden.

Natürlich wollen wir nicht auf diese grandiose Liste verzichten:

$ cd /tmp
$ wget http://www.shallalist.de/Downloads/shallalist.tar.gz
$ tar -xzf shallalist.tar.gz -C /var/lib/squidguard/db
$ chown -R proxy:proxy /var/lib/squidguard/db

Wenn ich ehrlich bin, ist der Inhalt der Standard Konfiguration von squidGuard genauso hilfreich wie Schraubendreher im Zoo. Schön zu haben, aber absolut nutzlos.

Der komplette Inhalt kann also bedenkenlos gelöscht werden und stattdessen folgender Inhalt hinzugefügt werden:

dbhome /var/lib/squidguard/db
logdir /var/log/squidguard
src mw_network {
ip 172.26.32.0/20 172.26.48.0/20
}
dest adv {
domainlist BL/adv/domains
urllist BL/adv/urls
redirect http://upload.wikimedia.org/wikipedia/commons/c/c0/Blank.gif
}
dest chat {
domainlist BL/chat/domains
urllist BL/chat/urls
}
dest porn {
domainlist BL/porn/domains
urllist BL/porn/urls
}
dest spyware {
domainlist BL/spyware/domains
urllist BL/spyware/urls
}
dest tracker {
domainlist BL/tracker/domains
urllist BL/tracker/urls
redirect http://upload.wikimedia.org/wikipedia/commons/c/c0/Blank.gif
}
dest dating {
domainlist BL/dating/domains
urllist BL/dating/urls
}
dest fortunetelling {
domainlist BL/fortunetelling/domains
urllist BL/fortunetelling/urls
}
dest costtraps {
domainlist BL/costtraps/domains
urllist BL/costtraps/urls
}
dest aggressive {
domainlist BL/aggressive/domains
urllist BL/aggressive/urls
}
acl {
mw_network {
pass !adv !porn !chat !spyware !tracker !dating !fortunetelling !costtraps !aggressive all
}
default {
pass none
redirect http://localhost/cgi-bin/squidGuard.cgi?clientaddr=%a&clientname=%n&clientuser=%i&srcclass=%s&targetclas
}
}
view raw squidGuard.conf hosted with ❤ by GitHub

Bevor die Einstellungen aktiv werden, muss die Blacklist kompiliert und eine Datenbank erstellt werden. Dies geschieht mit dem folgenden Befehl (das kann jetzt erst einmal ein Weilchen dauern):

$ squidGuard -C all

Nach einer Wartezeit (bei mir waren es ca. 30 Minuten wegen der p*rn Blacklist) müssen die Datenbanken noch einmal die benötigten Rechte erhalten:

$ chown -R proxy:proxy /var/lib/squidguard/db

Wenn du jetzt squid einmal neu startest, sollten alle regeln aktiv sein und du kannst werbefrei surfen:

$ /etc/init.d/squid3 restart

Schritt 5: Blacklist up-to-date halten

Es kommen täglich neue Websites, die gesperrt werden sollen. Die Blacklist wird auch ständig gepflegt und erweitert.

Bevor man sich aber jede Woche oder jeden Monat die Blacklist manuell aktualisiert, bietet Linux da ein schönes Werkzeug, welches das das ganze automatisiert abbildet: CRON

$ touch /etc/squidguard/fetchShalla.sh
$ chmod +x /etc/squidguard/fetchShalla.sh
$ ln -s /etc/squidguard/fetchShalla.sh /etc/cron.weekly/fetchShalla.sh
$ nano /etc/squidguard/fetchShalla.sh
#! /bin/sh
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Holt sich die aktuelle Shallalist Blacklist
# Description: Holt sich die aktuelle Shallalist Blacklist
### END INIT INFO
echo "+-------------------------------------------------------------------+"
echo "| ______ _ |"
echo "| (_____ \ (_) |"
echo "| _____) )___ _ _ _ _ _ _ _ |"
echo "| | ____/ ___) | | | | | | ( \ / ) |"
echo "| | | | | | |\ V /| |_| |) X ( |"
echo "| |_| |_| |_| \_/ \____(_/ \_) |"
echo "| |"
echo "+-------------------------------------------------------------------+"
log() {
echo "$(date '+%b %d %H:%M:%S') $(hostname) shalla: $1"
echo "$(date '+%b %d %H:%M:%S') $(hostname) shalla: $1" >> /etc/squidguard/shalla.log
}
cd /tmp
log 'Lade Blacklist runter...'
wget -q http://www.shallalist.de/Downloads/shallalist.tar.gz
log 'Extrahiere Daten...'
tar -xzf shallalist.tar.gz -C /var/lib/squidguard/db
chown -R proxy:proxy /var/lib/squidguard/db
log 'Erstelle Datenbanken...'
squidGuard -C all
chown -R proxy:proxy /var/lib/squidguard/db
log 'Datenbanken wurden erstellt...'
rm -rf /tmp/shallalist.tar.gz
exit 0
view raw fetchShalla.sh hosted with ❤ by GitHub

Jetzt wird die Liste automatisch immer aktuell gehalten.

Fazit – Proxy Server

Ein Proxy Server im privaten Netzwerk kann im ersten Augenblick zwar etwas für überraschung sorgen und übertrieben wirken, jedoch spart man sich dadurch am Ende doch schon etwas an Bandbreite und hat ein merklichen Performancegewinn.

Der wesentliche Punkt jedoch ist, der Web Filter.

Durch ein paar kleine Handgriffe ist es zum Beispiel möglich in sein komplettes Netzwerk werbefrei zu kriegen. Man kann sich jetzt darüber streiten wie Sinnig das ganze ist.

Sinnvoll ist es auf jeden Fall, ungewollte Webseiten aus seinem Netzwerk komplett auszusperren. Es muss dir aber auch bewust sein, dass das der erste Schritt in Richtung Internetzensur ist 😃

Im nächsten Kapittel sperren wir dann noch etwas mehr vom Internet mithilfe von eines DNS Server. Das macht durchaus Sinn, wenn man sich z.B. gegen Viren wehren möchte.

Alle hier erstellten Konfiguration habe ich natürlich auf github hochgeladen und können hier angesehen werden.

Wenn dir das gefallen hat, wirst du diese Artikel lieben!

Die neuesten Artikel, die du gelesen haben musst!

teilen

Noch mehr privux?

Verpasse keine spannende Beiträge & Tutorials mehr!

Jetzt kostenlosen Newsletter abonieren!

Jetzt newsletter abonieren