Squid als normalen oder transparenten Proxy einrichten?
Anmeldungsdatum: 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! |
![]() Anmeldungsdatum: 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? |
(Themenstarter)
Anmeldungsdatum: 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:
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? |
![]() Anmeldungsdatum: 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^^ |
![]() Anmeldungsdatum: Beiträge: 8691 Wohnort: Hamburg-Altona |
xadm schrieb:
Masquerading brauchst du nicht. Damit würdest du im Gegenteil dem Subnetz den Zugang zum Internet öffnen. |
(Themenstarter)
Anmeldungsdatum: 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? |
![]() Anmeldungsdatum: Beiträge: 8691 Wohnort: Hamburg-Altona |
xadm schrieb:
Nein, der Befehl trägt in keiner Weise zur Lösung deines Problems bei.
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.
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. |
(Themenstarter)
Anmeldungsdatum: 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? |
![]() Anmeldungsdatum: Beiträge: 8691 Wohnort: Hamburg-Altona |
xadm schrieb:
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.
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. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 399 |
otzenpunk 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.
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? |
![]() Anmeldungsdatum: Beiträge: 8691 Wohnort: Hamburg-Altona |
xadm schrieb:
Solange du ip_forward nicht auf 1 setzt, ist das automatisch der Fall. Kannst du so überprüfen: sysctl net.ipv4.ip_forward
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. |
![]() Anmeldungsdatum: 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... |
(Themenstarter)
Anmeldungsdatum: Beiträge: 399 |
otzenpunk schrieb:
Achso, das hört sich doch gut an. Dann werde ich es morgen mal ausprobieren und mich melden obs geklappt hat. |
(Themenstarter)
Anmeldungsdatum: Beiträge: 399 |
Der Datenverkehr über Squid klappt soweit, vielen Dank für die Hilfe! ☺ |