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.