IPTABLES ist langsam, nachdem '-A INPUT -j DROP' zur Regelliste hinzugefügt wurde

8

Ich fange gerade mit Iptables an und bin auf etwas gestoßen, das ich nicht wirklich verstehe.

Zu Ihrer Information, ich habe die Anweisungen von Ubuntu Wikis IptablesHowTo befolgt .

Die Nat- und Mangle-Tabellen sind leer, ich arbeite gerade nur mit der Filtertabelle.

Das Problem

Wenn ich die folgenden iptables-Regeln hinzufüge:

iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -j DROP

... dann habe ich immer noch Zugriff auf meinen Computer über ssh, aber die Ausführung aller iptables-Befehle dauert ungefähr ein oder zwei Minuten. Es ist kein DNS-Problem, -nändert es nicht.

Die Lösung

Wenn ich die Tabelle spüle und stattdessen diese drei Regeln hinzufüge, funktioniert alles einwandfrei:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -j DROP

Kann mir jemand erklären, warum die erste Regel so große Auswirkungen auf iptables hat? Ich verstehe, dass etablierte Sitzungen Datenverkehr empfangen können, aber warum brauche ich ihn, wenn ssh geöffnet ist?

Mohrphium
quelle
In einigen Fällen werden sudoDNS-Suchvorgänge durchgeführt. Wenn diese blockiert sind, ist der Befehl langsam. Sind all Ihren anderen iptablesBefehlen ein Präfix vorangestellt sudo?
Ladadadada
Führen Sie sudo strace …(von einer Root-Shell) aus, um zu sehen, worauf es blockiert.
Gilles 'SO - hör auf böse zu sein'

Antworten:

3

Es wird eine DNS-Suche durchgeführt. Da die Antwort blockiert ist, dauert es eine Weile, bis eine Zeitüberschreitung auftritt.

Versuchen Sie, iptables -n ... auszuführen, um die DNS-Suche zu verhindern.

Der Conntrack ermöglicht den Empfang von Verbindungen über den kurzlebigen Port, der für Antworten auf Anforderungen erstellt wurde, die von Ihrem Computer initiiert wurden (in diesem Fall die DNS-Anforderung). Ohne ESTABLISHED- oder RELATED-Verbindungen zuzulassen, werden sogar Antworten auf Ihre Anfragen blockiert.

EG: Wenn Sie versuchen, eine Website aufzurufen, wird die Antwort der Website blockiert, obwohl Sie die Anfrage für die Website senden können.

user2371745
quelle
4

Mit

iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -j DROP

Ihr Computer verwirft jedes eingehende Paket, es sei denn, es kommt vom SSH-Port. Es ist eine gute Idee, wenn diese Maschine nur über SSH kommunizieren soll. Andernfalls müssen Sie hinzufügen

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Dadurch stellen Sie sicher, dass Sie eine Verbindung zu einem Webserver herstellen, anstatt von jemandem eine Verbindung herzustellen.

edmz
quelle
Obwohl dies im Allgemeinen ein guter Rat ist, beantwortet dies nicht die Frage, die tatsächlich gestellt wurde.
Shadur
@ Shadur Conntrack macht den Unterschied. Dies widerspricht dem Fallenlassen.
Nils
Wenn Sie eine generische Anforderung über einen Computer wie in diesem Fall an einen Webserver senden, zeigt dieser letzte nichts an, da die Firewall das Senden von Paketen an einen Computer mit einer hergestellten Verbindung nicht zulässt.
Edmz
Aber selbst wenn ich ssh nur mit den ersten beiden Befehlen zulassen würde, warum dauern iptables-Befehle so viel länger als mit der Conntrack-Regel ... Und bedeutet die Conntrack-Regel, dass ich eine Verbindung zu einem Webserver herstellen könnte? Würde das die Drop-Regel nicht unbrauchbar machen?
Mohrphium
Nein, würde es nicht. Mit können -m conntrackSie eine weitere "Chance" haben, dass die Pakete akzeptiert werden, bevor sie sicher verworfen werden. Auf dem Client-Computer müssen Sie haben, iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT wenn Sie eine Antwort sehen möchten. Auf der Serverseite lassen Sie einfach die eingehende SSH-Verbindung zu und trennen Sie alles andere (wenn der Server nur als SSH-Verbindung fungiert). Hoffe alles ist klar.
Edmz