ubuntuusers.de

Squid als normalen oder transparenten Proxy einrichten?

Status: Gelöst | Ubuntu-Version: Server 8.04 (Hardy Heron)
Antworten |

xadm

Anmeldungsdatum:
13. August 2006

Beiträge: 399

Hallo,

Ich bin zur Zeit dabei, ein kleines Netzwerk mit ca. 15 Windows-Clients aufzubauen. Um die Sicherheit der Clients zu erhöhen, sollen alle Clients nur über Squid ins Internet gehen und sich vorher authentifizieren. So könnte man beispielsweise verhindern bzw. zumindest erschweren, dass mit Viren infizierte Clients automatisch Schadcode aus dem Internet nachladen können.
Mit Squid stelle ich mir das so vor:
Der Server besitzt zwei Netzwerkkarten, eth0 und eth1. Am eth0 (IP-Bereich 10.0.0.1 bis 10.0.0.255) hängen Switches, an denen wiederum die Clients hängen und eth1 (statische IP 192.168.0.11) ist mit dem DSL-Router und somit dem Internet verbunden. Da ich auf dem Server kein Routing zwischen den beiden IP-Bereichen/Netzen eingerichtet habe, können die Clients überhaupt nicht ins Internet - das ist bis hierhin erstmal Absicht. Denn wenn die Clients ins Internet möchten, sollen sie ja über den Proxy ins Internet gehen und der Benutzer dabei einen Benutzernamen und ein Passwort eingeben.

Jetzt meine Frage: Wie bekomme ich es hin, dass ein Client, der sich erfolgreich bei Squid authentifiziert hat, ins Internet kommt - also nur für erfolgreich authentifizierte Clients ein Routing zwischen den beiden IP-Bereichen/Netzen stattfindet? Ich habe mir dazu mal den Wiki-Artikel durchgelesen. Dem entnehme ich, dass bei einem transparenten Proxy mittels IP-Tabels geroutet wird. Allerdings sei dann keine Authentifizierung möglich. Aber gerade so eine "zwangsweise Authentifizierung" möchte ich ja haben...

Kennt jemand eine Lösung für mein Problem oder kann mir Tipps geben, in welche Richtung ich mal "forschen" sollte?

Vielen Dank im Voraus!

hänsel88

Avatar von hänsel88

Anmeldungsdatum:
9. Juli 2009

Beiträge: 354

Wohnort: Kempen

hab sowas vor 1-2 Wochen eingerichtet. Wie soll durch das Masquerading keine Authentifizierung möglich sein?

Also bei mir klappts wunderbar

Richte dir ipmasq und evtl. dnsmasq ein

und tippe danach folgendes in die Konsole

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Wie das beim Squid geht mit der Authentifizierung weisst du?

xadm

(Themenstarter)

Anmeldungsdatum:
13. August 2006

Beiträge: 399

Dass die Authentifizerung bei einem transparenten Proxy nicht möglich ist, hatte ich aus dem Wiki-Artikel zu Squid. Dort steht unter dem Abschnitt "Authentifizierung" folgender Hinweis:

Die Authentifizierung funktioniert nur mit einem Proxy, der normal angesprochen wird. Richtet man Squid als transparenten Proxy ein, so ist eine Authentifizierung nicht möglich, da der Proxy ja nicht direkt vom Client aus angesprochen wird.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Sehe ich das richtig, dass durch das Masquerading prinzipiell das Routing zwischen den beiden Netzen ermöglicht, aber nicht automatisch durchgeführt wird? D.h. in meinem Fall würde Squid das Routing durchführen, und ohne Squid wird nicht geroutet, sodass die Clients nur mit Squid ins Internet kommen?
Für die Einrichtung der Authentifizierung an Squid wollte ich mich am Wiki-Artikel orientieren.

hänsel88

Avatar von hänsel88

Anmeldungsdatum:
9. Juli 2009

Beiträge: 354

Wohnort: Kempen

Wenn ich dich richtig verstehe. D musste die iptables entsprechend anpassen. Das nur durch Port 3128 oder 8080 etwas rausdarf und nicht durch den 80er.

Da bin ich gerade auch dabei^^

otzenpunk Team-Icon

Avatar von otzenpunk

Anmeldungsdatum:
17. Oktober 2005

Beiträge: 8691

Wohnort: Hamburg-Altona

xadm schrieb:

Sehe ich das richtig, dass durch das Masquerading prinzipiell das Routing zwischen den beiden Netzen ermöglicht, aber nicht automatisch durchgeführt wird?

Masquerading brauchst du nicht. Damit würdest du im Gegenteil dem Subnetz den Zugang zum Internet öffnen.

xadm

(Themenstarter)

Anmeldungsdatum:
13. August 2006

Beiträge: 399

Hm, jetzt bin ich etwas verwirrt - soll ich den Befehl

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ausführen oder besser nicht?

Wenn ja, wird dann automatisch (auch ohne Squid) schon zwischen den Netzen geroutet (was für meinen Zweck nicht gut wäre)?

Wenn ich den Befehl nicht ausführen sollte, wie routet dann Squid zwischen den beiden Netzen?

otzenpunk Team-Icon

Avatar von otzenpunk

Anmeldungsdatum:
17. Oktober 2005

Beiträge: 8691

Wohnort: Hamburg-Altona

xadm schrieb:

Hm, jetzt bin ich etwas verwirrt - soll ich den Befehl

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ausführen oder besser nicht?

Nein, der Befehl trägt in keiner Weise zur Lösung deines Problems bei.

Wenn ja, wird dann automatisch (auch ohne Squid) schon zwischen den Netzen geroutet (was für meinen Zweck nicht gut wäre)?

Das kommt drauf an. Es gibt eine Kernelvariable namens ip_forward. Wenn diese auf 0 steht, was standardmäßig der Fall ist, findet gar keine Weiterleitung von Paketen statt, so dass der Befehl komplett wirkungslos bleibt.

Wenn ich den Befehl nicht ausführen sollte, wie routet dann Squid zwischen den beiden Netzen?

Squid routet gar nicht. Routing findet auf Netzwerkebene statt. Der Netzwerkstack untersucht ein Paket, und wenn es nicht an die eigene IP adressiert ist, wird es in die Richtung weitergeleitet, wo das Ziel vermutet wird.

Squid arbeitet dagegen auf Applikationsebene. Es lauscht als Serverdienst auf Verbindungen, nimmt diese an, und baut dann als Client wiederum eine eigene Verbindung zum Zielhost auf. Es handelt sich also um zwei völlig unterschiedliche Datenverbindungen, einmal vom Client zum Squid, und zum anderen vom Squid zum Server.

xadm

(Themenstarter)

Anmeldungsdatum:
13. August 2006

Beiträge: 399

Das heißt, um Squid für das oben geschilderte Szenario nutzen zu können, muss ich erstmal das Routing (entsprechend Router) zwischen meinen beiden Netzen einrichten, weil sonst Squid auch nicht ins Internet kommt?

Und wenn das Routing eingerichtet ist, muss ich es mit iptables hinbekommen, dass nur der Port 3128 (oder da wo Squid lauscht) zunächst an Squid weitergeleitet und dann ins Internet geroutet wird?

otzenpunk Team-Icon

Avatar von otzenpunk

Anmeldungsdatum:
17. Oktober 2005

Beiträge: 8691

Wohnort: Hamburg-Altona

xadm schrieb:

Das heißt, um Squid für das oben geschilderte Szenario nutzen zu können, muss ich erstmal das Routing (entsprechend Router) zwischen meinen beiden Netzen einrichten, weil sonst Squid auch nicht ins Internet kommt?

Nein. Da ja keine Datenverbindung zwischen den Netzen nötig ist. Stell dir das ganze wie einen Bahnhof vor, an dem zwei verschiedene Netzbereiche aneinander stoßen. Routing bedeutet in diesem Zusammenhang, dass die Gleise miteinander verbunden sind, und die "Züge" durch den Bahnhof von einem Netz ins nächste fahren können. Sind die Gleise nicht miteinander verbunden, müssen die Güter im Bahnhof umgeladen werden. (Und können dabei einer genaueren Kontrolle unterzogen werden.) Das ist das, was der Proxy macht.

Und wenn das Routing eingerichtet ist, muss ich es mit iptables hinbekommen, dass nur der Port 3128 (oder da wo Squid lauscht) zunächst an Squid weitergeleitet und dann ins Internet geroutet wird?

Wenn du den Proxy einfach so verwenden möchtest, brauchst du überhaupt keine iptables. Stell einfach die Clients so ein, dass sie den Proxy verwenden. Iptables brauchst du nur, wenn du einen transparenten Proxy benutzen willst, weil du dann alle Pakete, die an Port 80 irgendwo im Netz gerichtet sind, auf den Proxy umleiten musst. Allerdings funktioniert dann die Proxy-Authentifizierung nicht.

xadm

(Themenstarter)

Anmeldungsdatum:
13. August 2006

Beiträge: 399

otzenpunk schrieb:

Wenn du den Proxy einfach so verwenden möchtest, brauchst du überhaupt keine iptables. Stell einfach die Clients so ein, dass sie den Proxy verwenden.

Im Prinzip möchte ich den Proxy einfach so benutzen, d.h. dass der Proxy in den Clients explizit eingetragen ist. Aber der Server soll eben auch so konfiguriert werden, dass man ohne Proxy nicht ins Internet kommt.

Sind die Gleise nicht miteinander verbunden, müssen die Güter im Bahnhof umgeladen werden. (Und können dabei einer genaueren Kontrolle unterzogen werden.) Das ist das, was der Proxy macht.

Hierbei verstehe ich noch nicht ganz, wie Squid die Güter umlädt, also die Pakete zunächst kontrolliert und dann ins andere Netz schickt. Ich gehe mal davon aus, dass Squid das interne Netz und somit die entsprechende Netzwerkkarte (eth0) kennt, weil dort die Pakete ankommen. Aber woher weiß Squid dann, dass es noch das externe Netz und die dazu passende Netzwerkkarte (eth1, zum Internet) gibt, wenn ich es nirgendwo eingetragen habe?

otzenpunk Team-Icon

Avatar von otzenpunk

Anmeldungsdatum:
17. Oktober 2005

Beiträge: 8691

Wohnort: Hamburg-Altona

xadm schrieb:

Im Prinzip möchte ich den Proxy einfach so benutzen, d.h. dass der Proxy in den Clients explizit eingetragen ist. Aber der Server soll eben auch so konfiguriert werden, dass man ohne Proxy nicht ins Internet kommt.

Solange du ip_forward nicht auf 1 setzt, ist das automatisch der Fall. Kannst du so überprüfen:

sysctl net.ipv4.ip_forward 

Sind die Gleise nicht miteinander verbunden, müssen die Güter im Bahnhof umgeladen werden. (Und können dabei einer genaueren Kontrolle unterzogen werden.) Das ist das, was der Proxy macht.

Hierbei verstehe ich noch nicht ganz, wie Squid die Güter umlädt, also die Pakete zunächst kontrolliert und dann ins andere Netz schickt. Ich gehe mal davon aus, dass Squid das interne Netz und somit die entsprechende Netzwerkkarte (eth0) kennt, weil dort die Pakete ankommen. Aber woher weiß Squid dann, dass es noch das externe Netz und die dazu passende Netzwerkkarte (eth1, zum Internet) gibt, wenn ich es nirgendwo eingetragen habe?

Das Betriebssystem weiß (außer bei grober Fehlkonfiguration) selber, über welche Schnittstelle es Pakete schicken muss, damit sie ankommen. Darum muss Squid sich nicht kümmern. Vereinfacht gesagt schickt es alle Pakete, die zum selben Netz wie eine der eigenen Schnittstellen gehören, über genau diese Schnittstelle, und alles andere an das Default-Gateway.

hänsel88

Avatar von hänsel88

Anmeldungsdatum:
9. Juli 2009

Beiträge: 354

Wohnort: Kempen

hatte bei mir das

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE + sysctl net.ipv4.ip_forward

eingegeben.

Kann man den ersten Eintrag rückgängig machen? Wenn ich das richtig verstehe, kann der dann nur über den Proxy raus und sich z.B. mit dem SSH-Server verbinden...

xadm

(Themenstarter)

Anmeldungsdatum:
13. August 2006

Beiträge: 399

otzenpunk schrieb:

Das Betriebssystem weiß (außer bei grober Fehlkonfiguration) selber, über welche Schnittstelle es Pakete schicken muss, damit sie ankommen. Darum muss Squid sich nicht kümmern. Vereinfacht gesagt schickt es alle Pakete, die zum selben Netz wie eine der eigenen Schnittstellen gehören, über genau diese Schnittstelle, und alles andere an das Default-Gateway.

Achso, das hört sich doch gut an. Dann werde ich es morgen mal ausprobieren und mich melden obs geklappt hat.

xadm

(Themenstarter)

Anmeldungsdatum:
13. August 2006

Beiträge: 399

Der Datenverkehr über Squid klappt soweit, vielen Dank für die Hilfe! ☺

Allerdings habe ich jetzt ein Problem mit der Authentifizierung: Wenn sich die Benutzer über pam_auth anmelden, läuft alles problemlos - mit smb_auth funktioniert das allerdings nicht und ich bekomme einen Fehler.
Der Übersicht halber habe ich ein neues Thema aufgemacht: http://forum.ubuntuusers.de/topic/squid-mit-smb-auth/

Antworten |