GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Iptables:abgleichen des ausgehenden Datenverkehrs mit conntrack und Eigentümer. Funktioniert mit seltsamen Tropfen

Um es kurz zu machen, dieses ACK wurde gesendet, als der Socket niemandem gehörte. Anstatt Pakete zuzulassen, die sich auf einen Socket beziehen, der dem Benutzer x gehört , Pakete zulassen, die zu einer Verbindung gehören, die von einem Socket von Benutzer x initiiert wurde .

Die längere Geschichte.

Um das Problem zu verstehen, hilft es zu verstehen, wie wget und HTTP-Anfragen funktionieren im Allgemeinen.

In

wget http://cachefly.cachefly.net/10mb.test

wget baut eine TCP-Verbindung zu cachefly.cachefly.net auf , und sendet nach der Einrichtung eine Anfrage im HTTP-Protokoll, die besagt:"Bitte senden Sie mir den Inhalt von /10mb.test (GET /10mb.test HTTP/1.1 ) und übrigens, könnten Sie die Verbindung bitte nicht schließen, nachdem Sie fertig sind (Connection: Keep-alive ). Der Grund dafür ist, dass, falls der Server mit einer Umleitung für eine URL auf derselben IP-Adresse antwortet, er die Verbindung wiederverwenden kann.

Jetzt kann der Server entweder mit "hier kommen die angeforderten Daten, Achtung, sie sind 10 MB groß (Content-Length: 10485760 ), und ja, OK, ich lasse die Verbindung offen". Oder wenn es die Größe der Daten nicht kennt, "Hier sind die Daten, tut mir leid, ich kann die Verbindung nicht offen lassen, aber ich werde sagen, wann du kannst Stoppen Sie das Herunterladen der Daten, indem Sie mein Ende der Verbindung schließen".

In der obigen URL sind wir im ersten Fall.

Also, sobald wget die Header für die Antwort erhalten hat, weiß es, dass seine Aufgabe erledigt ist, sobald es 10 MB an Daten heruntergeladen hat.

Im Grunde, was wget liest die Daten, bis 10 MB empfangen und beendet wurden. Aber an diesem Punkt gibt es noch mehr zu tun. Was ist mit dem Server? Es wurde angewiesen, die Verbindung offen zu lassen.

Vor dem Verlassen wget schließt (close Systemaufruf) den Dateideskriptor für den Socket. Auf die close beendet das System die Bestätigung der vom Server gesendeten Daten und sendet einen FIN zu sagen:"Ich werde keine Daten mehr senden". An diesem Punkt close gibt zurück und wget Ausgänge. Der TCP-Verbindung ist kein Socket mehr zugeordnet (zumindest keiner, der einem Benutzer gehört). Allerdings ist es noch nicht fertig. Nach Erhalt dieses FIN , sieht der HTTP-Server Ende der Datei beim Lesen der nächsten Anfrage vom Client. In HTTP bedeutet das "keine Anfrage mehr, ich schließe mein Ende". Also sendet es auch seine FIN, um zu sagen:"Ich werde auch nichts senden, diese Verbindung geht weg."

Nach Erhalt dieser FIN sendet der Client ein "ACK". Aber an diesem Punkt wget ist schon lange vorbei, so dass ACK nicht von irgendeinem Benutzer stammt. Aus diesem Grund wird es von Ihrer Firewall blockiert. Da der Server die ACK nicht erhält, sendet er die FIN immer wieder, bis er aufgibt und Sie mehr verworfene ACKs sehen. Das bedeutet auch, dass Sie durch das Verwerfen dieser ACKs für einige Zeit unnötig Ressourcen des Servers (der einen Socket im LAST-ACK-Zustand halten muss) verwenden.

Das Verhalten wäre anders gewesen, wenn der Client nicht "Keep-alive" angefordert hätte oder der Server nicht mit "Keep-alive" geantwortet hätte.

Wie bereits erwähnt, möchten Sie bei Verwendung des Verbindungstrackers jedes Paket in den Zuständen ESTABLISHED und RELATED durchlassen und sich nur um NEW kümmern Pakete.

Wenn Sie NEW zulassen Pakete von Benutzer x aber keine Pakete von Benutzer y , dann andere Pakete für aufgebaute Verbindungen von Benutzer x durchgeht, und weil von Benutzer y keine Verbindungen aufgebaut werden können (da wir den NEW blockieren Pakete, die die Verbindung aufbauen würden), gibt es kein Paket für Benutzer y Verbindungen gehen durch.


Dies erlaubt Port 80 nur für das Konto "useraccount"

– Nun, zumindest die Regeln, die du gezeigt hast, implizieren das eigentlich nicht.

Es gibt auch einen Raum für Ratschläge – führen Sie keine Benutzerüberprüfung bei ESTABLISHED-Streams durch, sondern führen Sie diese Überprüfung bei NEW durch. Ich sehe auch keinen Sinn darin, den Quellport zu überprüfen, wenn ich Incoming ESTABLISHED überprüfe. Was ist der Unterschied, welcher Port es war, er befindet sich bereits im Status ESTABLISHED von Conntracks PoV. Die Firewall sollte so einfach wie möglich, aber dennoch effizient sein, daher ist der Razor-Ansatz von Occam die beste Wahl.


Linux
  1. Benutzerstatus- und Aktivitätsüberwachung in Linux mit GNU-Konto

  2. So arbeiten Sie mit Benutzern und Gruppen in Linux

  3. 8 Best Practices mit sudo unter Linux – Do’s and Dont’s von sudo

  4. Erstellen Sie einen Wireless Access Point und teilen Sie die Internetverbindung mit Nmcli?

  5. Blockieren Sie den IP-Bereich von Ländern mit GeoIP und iptables

So ändern Sie den Datei-/Gruppenbesitzer mit dem Befehl chown in Linux

Wie fügt man Benutzerkonto UND Passwort automatisch mit einem Bash-Skript hinzu?

userAdd-Benutzer mit Gruppe mit derselben UID und GID

Leiten Sie HTTP-Datenverkehr mit iptables an eine andere IP-Adresse weiter

Datei- und Ordnerberechtigungen mit rsync beibehalten

Wie kann ich Platzhalter im ms-dos-Stil mit ls und mv verwenden?