Linux als Proxy-Server

26.07.2004 von STEFAN RUBNER 
Ein Proxy-Server eignet sich nicht nur zur Vermeidung von unnötigem Traffic und den damit verbundenen Kosten. Richtig konfiguriert sorgt er auch für zusätzliche Sicherheit und höhere Produktivität der Anwender.

Während der Einsatz einer Firewall zum Schutz des lokalen Netzes vor Angriffen aus dem Internet mittlerweile Standard ist, winken viele Administratoren beim Gedanken an einen Proxy -Server dankend ab. Vielen sind diese, ähnlich einer Firewall zwischen Firmennetz und Internet arbeitenden Zwischenspeicher noch in schlechter Erinnerung. Aufwändig zu konfigurieren, schwer zu verwalten und unzuverlässig seien Proxy-Server, so die häufige Aussage. Zugegeben: ganz einfach ist die richtige Konfiguration eines Proxy nicht, machbar aber alle Mal. Und als Lohn der Mühe winken Funktionen, die über das reine Vorhalten bereits abgerufener Web-Inhalte weit hinausgehen.

So lassen sich Zugriffe auf unerwünschte Web-Seiten sperren, Benutzergruppen mit unterschiedlichen Rechten einrichten und sogar die verfügbare Bandbreite effektiv reglementieren. Ganz nebenbei sorgt der Proxy-Server natürlich trotzdem für ein verringertes Transfervolumen, da er Anfragen nach bereits im Cache gespeicherten Informationen lokal bedient. Das spart nicht nur Übertragungszeit und schafft freie Bandbreite für andere Anwendungen. Bei nach Volumen abgerechneten Internet-Anschlüssen schlägt sich das oft auch in deutlich reduzierten Kosten nieder. Günstig ist auch der Proxy selbst - sofern man einen unter Linux laufenden Rechner besitzt. Für dieses ist mit Squid ein leistungsfähiger Proxy-Server verfügbar, der als Open-Source-Projekt entwickelt wird und unter den Bedingungen der GNU Public License (GPL) kostenfrei einsetzbar ist.

Da die Version 3.0 von Squid derzeit noch in Entwicklung und daher gelegentlich etwas instabil ist, verwenden wir für die folgenden Beispiele das aktuelle Release 2.5-Stable5. Mit seiner Hilfe richten wir einen Proxy-Server ein, der allen Anwendern des lokalen Netzes zur Verfügung steht, wobei er gleichzeitig den Zugriff auf bekannte Sex- und Warez-Seiten sperrt. Für spezielle Benutzergruppen soll zudem ein unlimitierter Zugang ins Internet möglich sein. Da viele Angebote - speziell im Business-Umfeld - mittlerweile eine per SSL -Verschlüsselung geschützte Kommunikation fordern, ist auch dies zu unterstützen.

Squid installieren

Nur wer Suse Linux 9.1 besitzt, bekommt Squid 2.5-Stable5 gleich mit seiner Distribution geliefert. Allerdings haben die Entwickler bei Suse nicht alle Funktionen in die bereitgestellte Version übernommen. Neben einigen Authentifizierungsmodulen fehlen vor allem die moderneren virtuellen Dateisysteme sowie die diversen Methoden zur Cache-Verwaltung in RAM und auf der Festplatte.

Kurz: Am besten übersetzen Sie die Software gleich mithilfe des Quellcode-Archivs. Das bietet nicht nur den Vorteil, dass die Software vom Compiler gleich für den Prozessor Ihres Rechners optimiert wird. Zusätzlich lässt sich auch das Verzeichnis-Layout den eigenen Wünschen anpassen. Im weiteren Verlauf gehen wir davon aus, dass Sie - soweit nicht ausdrücklich anders vermerkt - alle angegebenen Schritte als User "root" auf der Kommandozeile ausführen.

Laden Sie zunächst das Archiv mit den Quelldateien herunter und entpacken es beispielsweise im Verzeichnis /root/soft:

cd ~
mkdir -p sof
cd softt
wget http://www.squid-cache.org/Versions/v2/2.5/squid-2.5.STABLE5.tar.gz
tar xvzf squid-2.5.STABLE5.tar.gz

Installation konfigurieren

Squid bietet eine ganze Reihe von Optionen, die schon beim Übersetzen der Quellen festzulegen sind. Sie sollten zur Konfiguration daher besser eine Batchdatei verwenden. Dies hat den Vorteil, dass sich Änderungen schnell durchführen und testen lassen, ohne dass Sie ständig schier endlos lange Kommandozeilen eingeben müssen. Eine solche Batchdatei, die alle Optionen frei schaltet, sieht zum Beispiel so aus:

#!/bin/bash
cd squid-2.5.STABLE5

if [ -f config.cache ]; then rm -f config.cache;
fi
./configure --prefix=/opt/squid \\
--sysconfdir=/etc/squid \\
--bindir=/opt/squid/sbin \\
--sbindir=/opt/squid/sbin \\
--libexecdir=/opt/squid/sbin \\
--with-dl \\
--enable-auth="basic digest ntlm" \\
--enable-basic-auth-helpers="LDAP MSNT NCSA PAM SMB YP getpwnam multi-domain-NTLM" \\
--enable-digest-auth-helpers="password" \\
--enable-ntlm-auth-helpers="SMB no_check" \\
--enable-external-acl-helpers="ip_user ldap_group unix_group wbinfo_group" \\
--enable-ntlm-fail-open \\
--enable-arp-acl \\
--enable-async-io \\
--enable-cache-digests \\
--enable-carp \\
--enable-delay-pools \\
--enable-htcp \\
--enable-icmp \\
--enable-referer-log \\
--enable-removal-policies="lru heap" \\
--enable-snmp \\
--enable-ssl \\
--with-openssl \\
--enable-useragent-log \\
--enable-underscores \\
--enable-stacktraces \\
--enable-x-accelerator-vary \\
--disable-hostname-checks \\
--disable-internal-dns

Wie Sie sehen: es gibt ziemlich viele Einstellungen, die Sie bei Squid vornehmen können. Wahrscheinlich werden Sie nie alle hier aktivierten Einstellungen benötigen. Warum wir hier trotzdem fast jede Option frei schalten, ist schnell erklärt: Sollten Sie über den Rahmen dieses Artikels hinaus mit Squid experimentieren wollen, dann stehen Ihnen sofort alle Module zur Verfügung. Klappt also einmal etwas nicht, liegt es ziemlich sicher nicht an einer deaktivierten Option oder einem fehlenden Hilfsprogramm.

Erster Start der Konfiguration

Am besten legen Sie das Skript im zuvor angelegten Verzeichnis /root/soft ab und nennen es cfg-squid. Damit es ausführbar ist, müssen Sie ihm per chmod 777 cfg-squid die richtigen Attribute zuweisen. Rufen Sie es jetzt per./cfg-squid auf, um einen ersten Konfigurationsversuch der Quelldateien zu starten.

Allerdings ist die Wahrscheinlichkeit hoch, dass die Konfigurationsroutine einige fehlende Linux-Komponenten bemängelt. Diese müssen Sie über den Paketmanager Ihrer Distribution nachinstallieren, bevor Sie Squid schlussendlich übersetzen können. Da die fehlenden Pakete je nach vorhandener Linux-Installation variieren, können wir keine Liste der benötigten Archive liefern. Zu beachten ist, dass für die jeweils angeforderten Pakete meist die Development-Version (gekennzeichnet durch <paketname>-devel-<versionsnummer>) zu installieren ist.

Läuft das Konfigurations-Skript einwandfrei durch, können Sie Squid nun einrichten:

cd squid-2.5.STABLE5
make
make install

Grundkonfiguration

Nach der Installation finden sich die ausführbaren Programme von Squid im Verzeichnis /opt/squid/sbin. Ursache dafür ist, dass wir in der Konfigurationsdatei die Pfade für das Squid-Wurzelverzeichnis (--prefix) und die ausführbaren Dateien (--bindir, --sbindir, --libexecdir) abweichend vom normalen Standard definiert haben. Lediglich die Konfigurationsdaten finden sich in außerhalb dieser Struktur in /etc/squid. Dort hat die Installationsroutine bereits die zentrale Konfigurationsdatei squid.conf abgelegt, die Sie nun an Ihre Bedürfnisse anpassen. Fürs Erste reicht ein funktionierender Proxy-Server. Da beim Übersetzen die meisten Parameter mit passenden Vorgabewerten belegt wurden, ist das nicht viel Arbeit. Suchen Sie nach folgenden beiden Zeilen und entfernen Sie die vorangestellten Kommentarzeichen.

#acl our_networks src 192.168.1.0/24 192.168.2.0/24
#http_access allow our_networks

Zusätzlich sind noch die Netzwerkadressen auf die in Ihrem lokalen Netz gültigen Bereiche anzupassen. Damit sind die Vorarbeiten aber noch nicht abgeschlossen. Aus Sicherheitsgründen arbeitet Squid unter einem eigenen User-Account, voreingestellt ist hier "nobody". Sauberer und sicherer ist es aber, squid unter einer eigenen Kennung laufen zu lassen. Dazu legen Sie zunächst ein Benutzerkonto namens "squid" an. Der Befehl dazu lautet:

mkdir -p /etc/empty
useradd -m -d /opt/squid/var/cache -u 31 -g 65534 -G 65534 -k /etc/empty -s /bin/false squid

Erster Start

Durch die Angabe des Verzeichnisses /opt/squid/var/cache als Heimat-Directory erreichen Sie, dass dem User-Account gleich die richtigen Zugriffsrechte auf seinen Cache-Bereich gegeben werden. Sein künftig gültiges Benutzerkonto teilen Sie Squid über die Konfigurationsdatei mit. Suchen Sie das Schlüsselwort cache_effective_user und tragen statt der Vorgabe "nobody" den Wert "squid" ein. Vergessen Sie nicht, das Kommentarzeichen am Anfang der Zeile zu löschen.

Nun geht es an die Initialisierung des Cache-Speichers auf der Festplatte. Diese Aufgabe erledigt Squid für Sie, wenn Sie das Programm mit dem Parameter -z aufrufen:

/opt/squid/sbin/squid -z

Jetzt ist Squid beinahe einsatzbereit. Einzig die Rechte für den Schreibzugriff auf sein Protokollverzeichnis fehlen ihm noch. Diese teilen Sie ihm via chown zu:

chown squid /opt/squid/var/logs

Beim ersten Start ist es ratsam, Squid nicht zu erlauben, sich als Dämon im Hintergrund zu verstecken. Eventuell auftretende Fehler werden in diesem Fall nämlich nicht auf der Konsole ausgegeben. Starten Sie Squid daher zunächst als Vordergrundprozess:

/opt/squid/sbin/squid -N

Wenn Sie jetzt nichts außer einem blinkenden Cursor sehen, dann geht Squid seiner Arbeit nach, und Sie können den ersten Client auf die Zusammenarbeit mit Squid vorbereiten.

Proxy-Clients konfigurieren

Damit die Clients im Netzwerk ab sofort keine direkte Verbindung mit dem Internet herstellen sondern Ihre Anfragen über den Proxy leiten, müssen Sie ihnen mitteilen, wo der Proxy-Server zu finden ist. Dazu benötigen Sie die IP-Adresse des Rechners auf dem Squid läuft sowie den Port, auf dem er Anfragen entgegen nimmt. Letzerer ist in der Standardkonfiguration 3128, im Beispiel arbeitet Squid auf dem Rechner mit der IP-Adresse 192.168.1.250.

Unter Windows 2000 und XP nehmen Sie die Einstellung für alle Microsoft-Produkte zentral über die Systemsteuerung vor. Ein Doppelklick auf den Eintrag "Internetoptionen" bringt das entsprechende Register zum Vorschein. Unter dem Reiter Verbindung finden sich die Konfigurationsoptionen für den Proxy-Server - gut verborgen hinter der Schaltfläche "Einstellungen" unter der Rubrik "LAN-Einstellungen". Hier tragen Sie die IP-Adresse des Proxy-Servers und den Port 3128 ein und setzen das Häkchen bei "Proxyserver für lokale Adressen umgehen".

Unter Suse Linux findet sich der Dialog zum Einstellen der Proxy-Parameter in Yast2 unter der Rubrik Netzwerkdienste. Dort ist die Schaltfläche Proxy der Zugang zur Parametereingabe. Um lokale Ziele direkt anzusprechen, müssen Sie hier entweder die Domain oder das verwendete IP-Subnetz in das Feld unter "Keine Proxy Domains" eintragen.

Sowohl unter Linux wie auch unter Windows ist jedoch zu beachten, dass sich keineswegs alle Applikationen an die Einstellungen des Betriebssystems gebunden fühlen. Speziell alternative Browser wie etwa Mozilla, aber auch diverse FTP-Programme und andere Tools vertrauen lieber auf ihre eigenen Settings und sind daher manuell anzupassen. Damit findige Anwender nicht auf die Idee kommen, den Proxy einfach zu umgehen, sollten Sie zudem Ihre Firewall so konfigurieren, dass nur der Proxy mit Systemen im Internet kommunizieren darf.

Einen Gag besonderer Art erlaubt sich hierbei übrigens Microsoft selbst. Der Internet Explorer 6 schert sich nämlich beim Zugriff auf FTP-Server nicht im Geringsten um die Proxy-Einstellungen, sondern verwendet stets den direkten Wert. Dem Anwender bleibt also bei einer geschlossenen Firewall nichts anderes übrig, als einen alternativen FTP-Client zu verwenden, da er einen eventuell für FTP freigeschalteten Proxy gar nicht nutzen kann.

Einfache Authentifizierung aktivieren

In der bislang beschriebenen Konfiguration arbeitet Squid für die Anwender im LAN als offener Proxy: Jede Station im lokalen Netz kann seine Dienste in Anspruch nehmen. Um zu vermeiden, dass beispielsweise Besucher oder gar ungebetene Gäste die Dienste des Proxy nutzen, führt kein Weg an der Authentifizierung der Benutzer vorbei. Squid bietet dazu mehrere Möglichkeiten. Die einfachste Form der Authentifizierung entspricht der, die auch der Apache Web-Server standardmäßig benutzt. Sie bedient sich des Moduls ncsa_auth, das bei der Übersetzung der Squid-Quellen gleich mit erzeugt und im Verzeichnis /opt/squid/sbin abgelegt wurde.

Die NCSA-Authentifizierung bezieht die Informationen über erlaubte Benutzerkennungen und deren zugehörige Passwörter aus einer Textdatei. Diese lässt sich leicht über das im Apache-Paket vorhandene Hilfsprogramm htpasswd (htpasswd2 unter Suse Linux mit installiertem Apache 2.0.x) erzeugen:

cd /etc/squid
htpasswd -bc proxy_users testuser passwort

Dieser Befehl erzeugt die Datei /etc/quid/proxy_users und fügt dieser gleich ein Konto für den Benutzer "testuser" mit dem Passwort "passwort" hinzu. Aktivieren Sie nun die Authentifizierung, indem Sie in der Datei /etc/squid/squid.conf den Block von Schlüsselworten für die Basic-Authentication wie folgt abändern:

auth_param basic program /opt/squid/sbin/ncsa_auth /etc/squid/proxy_users
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

Es genügt dabei, die erste Zeile vom vorangestellten Kommentar zu befreien und um die Parameter zum Aufruf des Moduls ncsa_auth sowie den Pfad zur Datei mit den Benutzerkonten zu ergänzen.

Scharf schalten der Authentifizierung

Nun ist zwar die Authentifizierung scharf geschaltet, sie wird aber von Squid noch nicht verwendet. Damit nicht authentifizierte Anwender wirklich abgewiesen werden, sind noch zwei Modifikationen an der Konfiguration notwendig. Dies erfolgen an der Stelle, an der Sie zuvor Ihr lokales Netz für den Zugriff per Proxy frei geschaltet hatten:

acl our_networks src 192.168.1.0/24
acl auth_users proxy_auth REQUIRED
http_access allow our_networks auth_users

Die neu eingefügte Zeileacl auth_users ... bewirkt, dass sich die Benutzer beim Proxy anmelden müssen. Die Erweiterung der nachfolgenden Zeile um den Parameter auth_users legt fest, dass nur diejenigen Anwender Proxy-Zugriff erhalten, die authentifiziert sind und deren Adresse aus dem angegebenen IP-Pool stammt.

Ein neu konfiguriertes Authentifizierungsverfahren erkennt Squid erst nach einem Neustart. Daher ist es bei einem Wechsel der Authentifizierungsmethode stets notwendig, den Proxy-Server zu stoppen und neu zu starten.

Authentifizierung über Windows-Domain

Nun ist es aber nicht wirklich effektiv, die User-Zugänge direkt auf dem Proxy-Server zu verwalten. Schließlich ist in den meisten Netzen bereits ein zentrales Benutzerverzeichnis vorhanden, meist in Form einer Windows-Domäne. Auch diese kann Squid zur Authentifizierung der Anwender heranziehen.

Dazu ersetzen Sie einfach den Authentifizierung-Helfer ncsa_auth durch das Modul msnt_auth. Der Eintrag in der Konfigurationsdatei /etc/squid/squid.conf lautet dann:

auth_param basic program /opt/squid/sbin/msnt_auth

Zusätzlich ist die Datei /etc/squid/msntauth.conf zu editieren oder anzulegen, falls sie noch nicht existiert. Maximal drei Zeilen genügen für ein funktionsfähiges Setup:

server <fqdn.des.pdc> <fqdn.des.bdc> <domainname>
allowusers /etc/squid/allowed_users
denyusers /etc/squid/denied_users

Für die Paramter <fqdn...> ist jeweils der komplette Name des Rechners inklusive Domain anzugeben, also beispielsweise nt-pdc.meinedomain.de. Es genügt nicht, nur den Hostnamen einzutragen und auch IP-Adressen sind nicht erlaubt. Ist in Ihrem Netz kein Backup Domain Controller vorhanden, tragen Sie einfach den PDC ein weiteres Mal ein.

Spezielle Bedeutung kommt den beiden genannten Dateien allowed_users und denied_users zu. Ist erstere nicht vorhanden oder leer, werden grundsätzlich alle dem Domain-Controller bekannten User zugelassen - es sei denn, der betroffene Account ist in der Datei denied_users aufgeführt. Enthält allowed_users jedoch Einträge, dann bekommen nur die dort genannten Benutzer Zugriff auf den Proxy. Ist ein Account in beiden Dateien vorhanden, erhält der jeweilige Anwender keinen Zugang, da die Deny-Liste Vorrang vor der Allow-Liste hat.

Beschränkung nach Ziel und Zeit

Sicher ist Ihnen schon aufgefallen, dass bei der Kontrolle der Zugriffsrechte das Schlüsselwort acl eine zentrale Rolle spielt. Seine Aufgabe ist es, diverse von Squid bereit gestellte Access Control Lists (ACLs) mit Inhalten zu belegen, die später von den Access-Befehlen ausgewertet werden. Leider ist das ACL-System von Squid so komplex wie es leistungsfähig ist.

Ein Beispiel verdeutlich das. Nehmen wir an, Sie möchten für alle Anwender lediglich den Zugriff auf Web-Inhalte frei schalten, dies aber nur während der normalen Arbeitszeit. Zusätzlich sollen bestimmte Anwender auch die Möglichkeit haben, Daten per FTP abzurufen. Als erstes müssen Sie dazu die Standardvorgabe für die sicheren Ports ändern. Sie finden diese in der Squid-Konfiguration durch die Suche nach der Zeichenkette "acl Safe_ports". Hier sind alle Einträge mit Ausnahme des Ports 80 auszukommentieren. Zusätzlich ist ein Eintrag für FTP vorzunehmen. Das Ergebnis sieht also so aus:

acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl FTP_ports port 21 # ftp
# acl Safe_ports port 443 563 # https, snews
# acl Safe_ports port 70 # gopher
# acl Safe_ports port 210 # wais
# acl Safe_ports port 1025-65535 # unregistered ports
# acl Safe_ports port 280 # http-mgmt
# acl Safe_ports port 488 # gss-http
# acl Safe_ports port 591 # filemaker
# acl Safe_ports port 777 # multiling http

Festlegen der User und Zeiten

Zusätzlich benötigen Sie weitere ACL-Definitionen, um die für FTP berechtigten Anwender zu ermitteln und die erlaubten Uhrzeiten festzulegen, sowie erweiterte Filterregeln:

acl our_networks src 192.168.1.0/24
acl inet_time time 08:00-18:00
acl auth_users proxy_auth REQUIRED
acl ftp_users proxy_auth user1 user2 user3
http_access allow FTP_Ports ftp_users our_networks inet_time
http_access deny FTP_Ports all
http_access allow our_networks auth_users inet_time
http_access deny all

Was haben wir da nun genau festgelegt? Zunächst definiert die ACL FTP_Ports einen eigenen Port-Bereich, damit dieser später selektiert werden kann. Die zusätzliche Definition in der Gruppe Safe_Ports verhindert, dass eine in der Standardkonfiguration enthaltene ACL-Klausel den Zugriff auf den FTP-Port sperrt. Die ACL ftp_users legt eine Untergruppe der authentifizierten Anwender fest, die ACL inet_time bestimmt die Zeiten, zu denen Internet-Zugang überhaupt gewährt wird. Als erstes greift nun der Filter, der prüft, ob ein Zugriff auf den FTP-Port zu gewähren ist. Falls nein sperrt die nächste Regel den FTP-Ports komplett. Die restlichen Regeln sorgen dafür, dass nur authentifizierte Nutzer Zugriff auf die verbleibenden Ports - in unserem Fall also den Port 80 für HTTP-Requests - erhalten.

Ausblick

Mit den hier vorgestellten Verfahren und Einstellungen sind Sie ausreichend gewappnet, einen funktionierenden Proxy-Server für Ihr Netz aufzusetzen. Allerdings bietet Squid wesentlich mehr Funktionen als sich in einem einzigen Beitrag beschreiben lassen. Speziell ACLs und Authentifizerung sind Gebiete, die deutlich mehr Optionen bieten als hier angerissen. Weiterführende Dokumentation zu diesen Bereichen finden Sie auf der Homepage von Squid. Besonders die dort enthaltene FAQ liefert nicht nur Antworten auf häufig gestellte Fragen sondern beinhaltet auch interessante Beispiele für Dinge, die man mit Squid noch anstellen kann. Wie Sie Squid mithilfe einiger Parameter und Zusatzprogramme noch besser auf Ihre Bedürfnisse anpassen, erfahren Sie im Beitrag "Proxy-Tuning: Feinschliff für Squid", den wir in der nächsten Woche online stellen. (mha)