Hier ist meine Netzwerkkonfiguration:
Meine Netzwerkkonfiguration http://daveden.files.wordpress.com/2013/05/network-configuration.png
Auf dem Proxyserver läuft Ubuntu mit Squid auf Port 3128 und DansGuardian auf Port 8080.
Ich möchte alle Clients zwingen, für jeden HTTP/HTTPS-Zugriff den Proxyserver zu verwenden, insbesondere Port 8080.
Ich möchte jedoch keine transparente Umleitung, da dies bei HTTPS nicht funktioniert. Es macht mir nichts aus, jeden Client einzeln zu konfigurieren, und es macht mir auch nichts aus, dass jeder Client weiß, dass er einen Proxyserver verwendet. Ich möchte nur nicht, dass die Clients ohne die Proxyeinstellungen im Internet surfen können.
Wie mache ich das? Kann ich Pakete einfach verwerfen, wenn der Client nicht für die Verwendung des Proxyservers auf Port 8080 konfiguriert ist?
Ich habe versucht, mit iptables Pakete zu verwerfen, die einen anderen D-Port als 8080 hatten, aber meiner Meinung nach wurden dadurch zu viele abgelehnt, und ich konnte auf nichts mehr zugreifen.
BEARBEITEN
Ich habe diese Frage umgeschrieben, damit sie nicht iptables-spezifisch ist, aber ich bin überhaupt nicht gegen die Verwendung von iptables. Ich möchte nur ein breiteres Spektrum möglicher Lösungen ansprechen.
BEARBEITEN 2
Ich glaube, ich habe bei manchen den falschen Eindruck erweckt. Nur um das klarzustellen: Ich bin überhaupt nicht daran interessiertFilterungHTTPS-Verkehr (d. h. das Aufteilen von Paketen auf dem Proxy und die Überprüfung des Inhalts). Mich interessiert mehrBlockierungSites mit DansGuardian, unabhängig davon, ob es über HTTP oder HTTPS erfolgt (indem Sie sich das Ziel der Pakete ansehen).
BEARBEITEN 3
Basierend auf dem unten stehenden Vorschlag von Alexandru-Florin Vintil mache ich derzeit Folgendes:
# Redirect HTTP traffic to port 8080 (DansGuardian)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
# Check TCP and UDP traffic against whitelist
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j whitelist
iptables -A FORWARD -i eth1 -p udp --dport 443 -j whitelist
# Drop all other HTTPS traffic
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 443 -j DROP
# Drop all traffic aimed straight at the proxy
iptables -A FORWARD -i eth1 -p tcp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 3128 -j DROP
iptables -A FORWARD -i eth1 -p tcp --dport 8080 -j DROP
iptables -A FORWARD -i eth1 -p udp --dport 8080 -j DROP
Kurz gesagt: Leiten Sie den HTTP-Verkehr auf Port 8080 um, löschen Sie allen HTTPS-Verkehr, der nicht auf der Whitelist steht (in einer separaten Kette), und löschen Sie allen Verkehr, der explizit den Proxy verwendet. Ohne die letzte Regel kann ein Client auf jede Website über HTTPS zugreifen, solange er seinen Browser für die Verwendung des Proxys konfiguriert, da der Zielport dann 8080 und nicht 443 ist. Selbst wenn also der gesamte an 443 gebundene Verkehr gelöscht wird, wird HTTPS nicht vollständig blockiert.
Antwort1
Meine 2 Cent:
Bezüglich HTTP: Die einfachste Lösung besteht darin, den Verkehr über Port 80 transparent über eine Firewall an einen Proxy/Filter weiterzuleiten. Eine Client-Konfiguration ist nicht erforderlich. + Sie können jeden Host/jedes Subnetz von der Verwendung des Proxys ausnehmen, ohne dass eine Neukonfiguration des Clients erforderlich ist. Nur so können Sie sicher sein, dass alles, was durch den Proxy gehen soll, auch durchgeht.
Jede andere Methode als das Blockieren des gesamten ausgehenden HTTPS 443-Verkehrs und das Zulassen nur einer Teilmenge von Websites basierend auf der zulässigen IP für ausgehenden Port 443 funktioniert nicht wie erwartet. Das sichere Protokoll von HTTPS ist (einige Mängel ausgenommen) darauf ausgelegt, Man-In-The-Middle-Angriffe zu verhindern (Proxys SIND „legale“ MITM). Auf diese Weise kann HTTPS tun, wofür es entwickelt wurde. Wenn Sie jedochIGNORIERENHTTPS, Sie sollten Ihren Squid so einrichten, dass er DIRECT verwendet und nicht CONNECT (Tapping). Aber selbst wenn dies der Fall ist, können Sie immer noch auf problematische Websites mit gemischten HTTP/HTTPS-Teilen stoßen. Auf diese Weise wird Ihr Squid-Proxy auch HTTPS verwalten. Dies sollte sich auch im transparenten Weiterleitungsteil Ihrer Firewall widerspiegeln.
Antwort2
Wenn Sie feststellen, dass etwas, das funktionieren sollte, nicht funktioniert, müssen Sie sich fragen, ob es einen anderen Faktor gibt, den Sie nicht sehen. Die Regel
sudo iptables -A INPUT -p tcp ! --dport 8080 -j REJECT
Sieht aus, als ob es funktionieren sollte, aber Sie habenangehängtes an die INPUT-Kette, also wird es wahrscheinlich durch eine vorherige Regel in der Kette umgangen. Diese Regel sollte für sich genommen ausreichend sein, da die INPUT-Kette die erste Kette ist, die eingehende Pakete treffen. Wenn sie an der INPUT-Kette ABGELEHNT werden, gelangen sie nie an die FORWARD- oder OUTPUT-Ketten. Natürlich blockiert diese RegelallesTCP, das nicht für Port 8080 bestimmt ist, was vermutlich nicht das ist, was Sie letztendlich wirklich wollen, es sei denn, der Proxy auf 8080 ist der einzige Dienst auf dem Computer und Sie melden sich nur von der Konsole aus an.
Listen Sie daher zunächst die Regeln auf und suchen Sie nach den möglichen Ursachen für die Durchlassung der Pakete:
sudo iptables -L
Wenn Ihre Firewall Reverse-NAT verwendet, sollten Sie auch die NAT-Tabelle auflisten.
sudo iptables -L -t nat
Versuchen Sie anschließend, die gleiche Regel auf dieAnfangder Kette:
sudo iptables -I INPUT -p tcp ! --dport 8080 -j REJECT
und sehen Sie, ob das das Problem nicht löst oder Ihnen zumindest mehr Sicherheit gibt, dass Sie verstehen, wie iptables
es funktioniert, sodass Sie Ihren Regelsatz vervollständigen können. Wenn Sie von einem Remote-Computer aus an diesem Host arbeiten, wird mein Vorschlag Sie unterbrechen, also sollten Sie dies nur von der Konsole aus tun. Um sicher von einem Remote-Computer aus zu arbeiten, wenden Sie sich an meinen KollegenEli Rosencrufts Beitrag über das Optimieren von Firewalls aus der Ferne.
Antwort3
Standard
Eine separate (benutzerdefinierte) Kette könnte hilfreich sein.
# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100
# redirect all traffic FROM user 100 to custom chain
iptables -A INPUT -p tcp -s 192.168.1.100 -j custom_user_100
# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP
Dies führt also dazu, dass jeglicher Verkehr von 192.168.1.100 in eine benutzerdefinierte Kette umgeleitet wird. Diese benutzerdefinierte (benutzerdefinierte) Kette kehrt nur zurück, wenn eine gültige Übereinstimmung gefunden wird (Verkehr, der für Port 8080 bestimmt ist). Der gesamte andere nicht übereinstimmende Verkehr, der nicht zu einer Rückkehr aus der Kette führt, wirdfallen gelassen.
Später können Sie die Tabellenstatistiken anzeigen, um zu überprüfen, ob Folgendes passiert ist:
iptables -L -v -n
Weiterleitung
Für den unwahrscheinlichen Fall, dass Sie Weiterleitungsverkehr verarbeiten, gelten andere Regeln – aber die Idee, eine benutzerdefinierte Kette zu verwenden, ist dieselbe. Ich verweise gerne auf das Diagramm unter diesem Link:http://www.csie.ntu.edu.tw/~b93070/CNL/v4.0/CNLv4.0.files/Page697.htmwenn Sie versuchen, den Paketfluss zu verstehen.
In diesem Fall möchten Sie möglicherweise Folgendes tun:
# create a chain just for user 100 (192.168.1.100)
iptables -N custom_user_100
# redirect all traffic FROM user 100 to custom chain
iptables -A FORWARD -p tcp -s 192.168.1.100 -j custom_user_100
# return from user chain for valid traffic, drop all other
iptables -A custom_user_100 -p tcp --dport 8080 -j RETURN
iptables -A custom_user_100 -j DROP
Dies ist identisch mit dem ersten, außer dass die Regel, die auf die INPUT-Kette angewendet wurde, stattdessen auf die FORWARD-Kette angewendet wird.
Aktualisierung 2013-05-24
Ich habe Ihre Frage noch einmal gelesen. Also fange ich noch einmal von vorne an.
Nehmen wir an, Ihr „Proxy“ ist eigentlich ein Router. Das heißt, er leitet alle Pakete von einer Schnittstelle zur anderen weiter – möglicherweise mithilfe von NAT. Das bedeutet, dass alle relevanten Pakete durch die FORWARD-Kette fließen.
Weiter: Sie sagen, Sie werden alle Clients, die Port 8080 verwenden, so konfigurieren, dass sie den Proxy selbst erreichen. Gut. Das bedeutet, dass allediesePakete gelangen über die INPUT-Kette in den „Proxy“.
Also: Sie möchten lediglich verhindern, dass jemand über Port 8080 die FORWARD-Kette verlässt.
iptables -A FORWARD -p tcp --dport 8080 -j REJECT
Diese Regel stellt sicher, dass alles, was an den Zielport 8080 weitergeleitet werden soll, abgelehnt wird (ein ICMP-Paket wird an den Client gesendet, der versucht hat, das Paket durch den Proxy zu leiten).
Nachdem Sie diese Regel implementiert haben, ist es WICHTIG, dass Sie sie testen, indem Sie versuchen, eine solche verbotene Verbindung herzustellen. Anschließend listen Sie die Regeln auf, indem Sie Folgendes eingeben:
iptables -L -v -n |grep 8080
und stellen Sie sicher, dass der Zähler hochgelaufen ist. Wenn nicht, stimmt etwas mit der Routerkonfiguration nicht.
Antwort4
Wenn Sie nicht möchten, dass Ihre Clients einfach auf HTTP{s}-Sites ohne Proxy zugreifen, können Sie Pakete einfach an die Ports 80 und 443 weiterleiten DROP
:REJECT
IPTABLES -I FORWARD -i eth1 -p tcp -m multiport --dports 80,443 -j REJECT
Wo eth1
ist Ihre interne Schnittstelle? Auf diese Weise müssen Sie sich nicht mit anderen Ports/Zugriffen herumschlagen.