iptables: Unterschied zwischen NEW, ESTABLISHED und RELATED-Paketen

46

Teil einer Firewall auf einem Server:

iptables -A INPUT -p tcp --dport 22 -m state NEW --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 100 --hitcount 10 -j DROP

Wenn ich online suche, sehe ich immer, dass NEW in dieser Regel verwendet wird, aber es fällt mir schwer zu verstehen, warum ESTABLISHED und RELATED nicht verwendet werden.

So was :

iptables -A INPUT -p tcp --dport 22 -m state NEW,ESTABLISHED,RELATED --state -m recent --set

iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -m recent --update --seconds 100 --hitcount 10 -j DROP

Kann mir jemand erklären, wann genau ein NEUES Paket in ESTABLISHED und RELATED wechselt?

Kris
quelle

Antworten:

46

Betrachten Sie ein NEUES Paket als einen Telefonanruf, bevor der Empfänger abgenommen hat. Ein ESTABLISHED-Paket lautet "Hallo". Und ein RELATED-Paket wäre, wenn Sie anrufen, um ihnen eine E-Mail mitzuteilen, die Sie ihnen senden möchten. (Die E-Mail wird in Beziehung gesetzt.)

Für den Fall, dass meine Analogie nicht so großartig ist, denke ich, dass die Manpages dies gut handhaben:

NEU - bedeutet, dass das Paket eine neue Verbindung gestartet oder anderweitig mit einer Verbindung verknüpft hat, bei der keine Pakete in beide Richtungen gesehen wurden

ESTABLISHED - bedeutet, dass das Paket einer Verbindung zugeordnet ist, bei der Pakete in beide Richtungen gesehen wurden.

RELATED - Bedeutet, dass das Paket eine neue Verbindung startet, aber einer vorhandenen Verbindung zugeordnet ist, z. B. einer FTP-Datenübertragung oder einem ICMP-Fehler.

iptables (8) - Linux-Manpage

Aaron Copley
quelle
9
Wissen Sie aus Neugier, wie es RELATED-Pakete bestimmt? Gibt es einen Mechanismus, mit dem Anwendungen iptables signalisieren können, dass eine Verbindung eine verwandte Verbindung ist, oder ist er nur Teil des statusbehafteten Teils von iptables?
Matthew Scharley
9
Es wird von einer Reihe von Kernelmodulen mit dem Namen ip_conntrack_ * verarbeitet, die jeweils für ein bestimmtes Protokoll geschrieben wurden, das nicht verwandte Verbindungen verwendet (z. B. FTP). Um Ihre Frage zu beantworten, müssten Sie meines Erachtens ein ähnliches Modul für Ihre Anwendung laden.
Kyle Smith
4
OK danke. Zurück zur Regel mit NEW. Ist es nicht möglich, dass ein Paket so aussieht, als wäre es bereits EINGESTELLT und wird es daher nicht von der Regel blockiert?
Kris
2
@Kris: Es ist ziemlich schwer, ausgehende Pakete zu fälschen, daher sehe ich nach dem Wortlaut der Manpage in der Antwort nicht, wie. Sie haben Recht, dass es möglich ist, ein Paket zu fälschen, das aussieht, als wäre es für eine offene Verbindung bestimmt, aber selbst ohne Firewall würde der TCP-Stack das Paket einfach auf den Boden fallen lassen, wenn er nicht bereits über eine offene Verbindung von der informiert wäre Absender. Wenn dies auf einer Firewall auf einem Router ist, ist es noch möglich , diesen Zustand zu halten durch Inspektion SYN/ ACK/ RST/ etc Pakete , wie sie durch den Router passieren, und ich würde erwarten , iptables , dies zu tun.
Matthew Scharley
2
@Kris: Ähnliches (technisch nicht identisches) wird von VNC-Software wie TeamViewer zum Tunneln von Firewalls / Routern verwendet. Der Vorgang wird als Lochen bezeichnet . Kurz gesagt, Sie haben einen Host-PC (der sich möglicherweise hinter einer einschränkenden Firewall befindet), mit dem Sie über ein anderes Gerät (über das Internet) eine Verbindung herstellen möchten. Beide PCs stellen eine individuelle Verbindung zu einem separaten Server (z. B. dem TeamViewer-Server) her, der zwischen ihnen "vermittelt", sodass die Firewalls so aussehen, als ob die Pakete zusammenhängen, und diese PCs dadurch eine separate Verbindung zu jedem herstellen können andere.
Levit
14

Asumming sowohl für Server als auch für Client eine restriktive INPUTund offene OUTPUT, dh:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

Und von iptables-extensions (8) über das Beispiel von FTP im aktiven Modus:

1. NEU

NEU Das Paket hat eine neue Verbindung gestartet oder ist anderweitig mit einer Verbindung verbunden, bei der keine Pakete in beide Richtungen gesehen wurden.

Der Client am Port 50000(ein beliebiger nicht privilegierter Port) stellt eine Verbindung zum FTP-Server am Port her 21. Der Server würde mindestens Folgendes benötigen, um diese eingehende Verbindung zu akzeptieren:

iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT

2. HERGESTELLT

HERGESTELLT Das Paket ist einer Verbindung zugeordnet, bei der Pakete in beide Richtungen gesehen wurden.

Jetzt auf der Client - Seite, öffnete er eine abgehende Verbindung zum Server auf Port 21einen lokalen Port 50000und er braucht die folgenden iptables der Antwort zu ermöglichen, kommt aus server (21)zu client (50000):

sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

3. VERWANDTE

RELATED Das Paket startet eine neue Verbindung, ist jedoch einer vorhandenen Verbindung zugeordnet, z. B. einer FTP-Datenübertragung oder einem ICMP-Fehler.

Nachdem nun die FTP-Verbindung hergestellt wurde und eine Datenverbindung hergestellt werden soll, öffnet der Client einen Server-Socket (ja, bei aktivem FTP-Client wird ein Server für die Datenverbindung) am Port 60000(nach meinem Verständnis wird der Client diesen Port markieren 60000wie RELATEDauf die andere Verbindung aus 50000->21) und wird diese Portnummer an den Server mit dem FTP senden PORTBefehl. Dann öffnet der FTP-Server eine neue Verbindung von Port 20zu Port 60000auf dem Client. Nun, der Client benötigt nun Folgendes, damit diese neue Verbindung erfolgreich ist:

sudo iptables -A INPUT -m state --state RELATED -j ACCEPT

Damit dies funktioniert, müssen Sie das ip_conntrack_ftpKernel-Modul aktivieren , damit das System Verbindungen / Pakete als RELATED(nach meinem Verständnis habe ich nicht zu viel darüber nachgedacht) markieren kann :

modprobe ip_conntrack_ftp
Jaime Hablutzel
quelle
Ist mein Verständnis korrekt, wenn für die Einrichtung nur ein zuvor lokal erzeugter unidirektionaler Fluss erforderlich ist, nicht ein TCP-3-Wege-Handshake?
sdaffa23fdsf
Vielen Dank für die Antwort. Sie haben als Antwort "iptables, damit die Antwort vom Server (21) zum Client (50000) gelangen kann" angegeben. Wenn es sich um VON Server zu Client handelt, warum ist es EINGABE und nicht AUSGABE?
Medya
@Medya, da aus der Sicht des Clients Pakete, die vom Server (21) zum Client (50000) gesendet werden, eingehende Pakete sind, für den Client also ein INPUT.
Jaime Hablutzel