Warum blockiert iptables diese Locke, obwohl der Port AKZEPTIERT ist?

0

Hier ist ein einfaches Skript zum Zurücksetzen meiner iptables

iptables -F

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I INPUT  -p tcp --dport 8000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 8000 -j ACCEPT

Danach wenn ich

curl another-machine:8000/filename

Die Verbindung hängt, es scheint, als ob DROP und nicht ACCEPT geschieht. Wenn ich

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

dann das Obige curl Befehl funktioniert.

Aber Hafen 8000 ist eindeutig auf eingestellt ACCEPT sogar wenn DROP ist die Politik.

enter image description here

Warum kommt die Verbindung nicht zustande?

spraff
quelle

Antworten:

2

Das Fernbedienung Hafen und Ziel Port sind nicht dasselbe. Wenn ein ausgehendes Paket 8000 als Zielport hatte, hat es eine eingehende Antwort als Quelle port (d. h. gespiegelt):

                local                   remote

 src 192.168.1.71:36932  --OUTPUT-->  151.101.1.69:8000 dest  TCP [SYN]

dest 192.168.1.71:36932  <--INPUT---  151.101.1.69:8000 src   TCP [SYN, ack]

Nur mit anderen Worten -A INPUT -p tcp --sport 8000 wird es passen.

Die üblichere Art, dies zu handhaben, ist mit a Staatsbürgerlich Firewall:

-A INPUT -m state --state ESTABLISHED -j ACCEPT
grawity
quelle
Vielen Dank. In Bezug auf Stateful Firewalls ist es nicht der Sinn einer Firewall, Verbindungen zu trennen / zu blockieren Vor etablieren sie sich? Ansonsten, wie zeigt das Bestehen des Zustands an, dass die Verbindung der Richtlinie entspricht?
spraff
@spraff " Ist es in Bezug auf Stateful Firewalls nicht der Sinn einer Firewall, Verbindungen zu trennen / zu blockieren, bevor sie hergestellt werden? "Ja, deshalb möchten wir niemals etwas blockieren, das mit einer bestehenden Verbindung zusammenhängt." Ansonsten, wie zeigt die Bestimmtheit des Staates an, dass die Verbindung der Richtlinie entspricht? "Da wir keine Verbindungen herstellen, die gegen Richtlinien verstoßen, stimmt eine Verbindung mit den Richtlinien überein.
David Schwartz
Es muss etwas sehr Grundlegendes geben, das ich hier nicht bekomme. Meine aktuellen Regeln benötigen keine ESTABLISHED-Regel. Warum sollte ich sie hinzufügen? Es scheint überflüssig. Und wie wird die Verbindung hergestellt, wenn sie nicht bereits akzeptiert wurde? Dies scheint bestenfalls tautologisch. Sie scheinen etwas Geheimnisvolles ausgelassen zu haben andere Prozess, der die Richtlinie anwendet. Aber wenn es einen anderen Prozess gibt, warum brauchen wir überhaupt iptables?
spraff
1
@spraff: Weil es so ist Teil von iptables. Der Zustand wird von der verfolgt conntrack Modul. Das ausgehende TCP-SYN benötigt noch eine portbasierte Regel, aber conntrack merkt sich vor dem Senden seine Parameter (getrennt vom TCP-Stack). Wenn ein entsprechendes SYN + ACK empfangen wird, erkennt conntrack, dass seine Parameter mit einem früheren SYN übereinstimmen, und weist ihm das Label 'ESTABLISHED' zu. Sie können es also entweder nach Port zuordnen oder von conntrack Zustand. (Dies ist wiederum unabhängig von den tatsächlichen TCP-Zuständen. Conntrack gilt gleichermaßen für TCP-Verbindungen und UDP-Streams.)
grawity
1
@spraff: Der Hauptunterschied zwischen dem Akzeptieren von Eingaben per Port und dem Akzeptieren von Status ist, dass letztere keine gefälschten Pakete akzeptieren, die unterlassen Sie zur selben Verbindung gehören. Beispielsweise könnte jemand sehr leicht versuchen, eine neue Verbindung zu Ihrem Port 22 herzustellen, indem er seinen Client einfach zwingt, 8000 als Quellport zu verwenden. Ein Staatenloser -A INPUT --sport 8000 -j ACCEPT würde das erlauben, aber eine zustandsbehaftete Regel würde es korrekt blockieren.
grawity