Iptables: "-p udp --state ESTABLISHED"


18

Sehen wir uns diese beiden iptables-Regeln an, die häufig zum Zulassen von ausgehendem DNS verwendet werden:

iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53 
   -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -p udp --sport 53 --dport 1024:65535
   -m state --state ESTABLISHED -j ACCEPT

Meine Frage lautet: Wie genau soll ich den Status ESTABLISHED in UDP verstehen? UDP ist zustandslos.

Hier ist meine Intuition - ich würde gerne wissen, ob oder wo dies falsch ist:

Die Manpage sagt mir folgendes:

Zustand

Dieses Modul ermöglicht in Kombination mit der Verbindungsverfolgung den Zugriff auf die
Verbindungsstatus für dieses Paket.

  --Zustand ...

Iptables merkt sich also im Grunde genommen die Portnummer, die für das ausgehende Paket verwendet wurde (woran könnte es sich sonst für ein UDP-Paket erinnern?) Und lässt dann das erste eingehende Paket zu, das innerhalb eines kurzen Zeitraums zurückgesendet wird? Ein Angreifer müsste die Portnummer erraten (wäre das wirklich zu schwer?)

Über das Vermeiden von Konflikten:

Der Kernel merkt sich, welche Ports blockiert sind (entweder von anderen Diensten oder von früheren ausgehenden UDP-Paketen), damit diese Ports innerhalb des Zeitrahmens nicht für neue ausgehende DNS-Pakete verwendet werden? (Was würde passieren, wenn ich versehentlich versuchte, einen Dienst auf diesem Port innerhalb des Zeitrahmens zu starten - würde dieser Versuch abgelehnt / blockiert?)

Bitte finden Sie alle Fehler im obigen Text :-) Danke,

Chris

Antworten:


12

Iptables merkt sich also im Grunde genommen die Portnummer, die für das ausgehende Paket verwendet wurde (woran könnte es sich sonst für ein UDP-Paket erinnern?).

Ich bin ziemlich sicher, dass für UDP die Quell- und Zielports und -adressen gespeichert sind.

Wenn Sie die Statustabellen überprüfen möchten, installieren Sie conntrack und / oder netstat-nat.

(Was würde passieren, wenn ich versehentlich versuchte, einen Dienst auf diesem Port innerhalb des Zeitrahmens zu starten - würde dieser Versuch abgelehnt / blockiert?)

Da Sie OUTPUT und INPUT verwenden, sprechen Sie von lokalen Diensten. Der Port wird bereits verwendet. Ich glaube nicht, dass Sie mit Ihrem System einen anderen Dienst starten können, da dieser Port bereits überwacht wird. Ich nehme an, Sie könnten den ersten Dienst beenden und einen anderen starten, wenn Sie dies wirklich wollten. In diesem Fall würde die Antwort wahrscheinlich zu Ihrem Dienst gelangen. Was der Dienst mit dem Paket macht, hängt davon ab, was der Inhalt des Pakets ist und um welchen Dienst es sich handelt.


Wenn ich also eine Tomcat-Instanz auf Port 8080 starten würde, hätte ich eine 1: (65535-1023) Chance, dass der Start fehlschlägt, wenn versehentlich eine DNS-Abfrage auf demselben Port ausgeführt wird. Oder wird es nur warten, bis der Zeitrahmen abgelaufen ist? Wie lang ist der Zeitrahmen standardmäßig?
Chris Lercher

6
Unter Linux, glaube ich, liegt der kurzlebige Portbereich normalerweise zwischen 32768 und 61000 (siehe / proc / sys / net / ipv4 / ip_local_port_range). Dies würde Ihren Beispiel-Port 8080 nicht einschließen im kurzlebigen Bereich. Die Zeit, die ein UDP-Eintrag in der Tabelle angibt, beträgt normalerweise 30 Sekunden (siehe / proc / sys / net / netfilter / nf_conntrack_udp_timeout)
Zoredache

2
+1 Danke, besonders für die / proc-Pfade!
Chris Lercher

1
Falls jemand das udp_timeout verlängern möchte, verwendeecho "net.netfilter.nf_conntrack_udp_timeout = 180" >> /etc/sysctl.conf
Kiran

8

NB: Diese Antwort wurde bearbeitet.

Trotz allem, was die Manpages sagen, ESTABLISHEDscheint das "stateful" zu bedeuten. Für UDP bedeutet dies einfach (wie Sie vorschlagen), dass Sie sich jedes ausgehende UDP-Paket (das Tupel "src ip, src port dst ip, dst port") für eine Weile merken und seine Antworten erkennen.

FWIW, meine normalen Regeln für den DNS-Verkehr lauten ungefähr so:

# permit any outbound DNS request (NB: TCP required too)
iptables -A OUTPUT -p udp --sport 1024:65535 --dport 53  -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024:65535 --dport 53  -j ACCEPT

# accept any packet that's a response to anything we sent
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Das heißt, Sie steuern den Datenverkehr in der OUTPUTKette und lassen die iptablesStatusmodule alle anderen Aufgaben in der INPUTKette ausführen.

Siehe auch diese verwandte Frage .


1
Mir ist bewusst, dass ich auch TCP zulassen sollte. Aber was würde RELATED für UDP bedeuten? Manpage: "RELATED bedeutet, dass das Paket eine neue Verbindung startet, aber mit einer bestehenden Verbindung verknüpft ist, ..." Connections for UDP? Vielleicht ist es wirklich sinnvoller als ESTABLISHED, aber genau das möchte ich herausfinden.
Chris Lercher

Wenn ich Ihre Regeln verwende, aber udp INPUT auf RELATED beschränke, funktionieren meine DNS-Abfragen nicht. Scheint, dass ich ESTABLISHED erlauben muss. Gibt es einen Grund, RELATED (für UDP) ebenfalls zuzulassen?
Chris Lercher

ok, es scheint, dass ESTABLISHED mehr bedeutet, als die Manpage sagt. In jedem Fall ist diese INPUT-Regel die einzige, die Sie jemals benötigen, wenn Sie OUTPUT-Filter wie meine verwenden und keinen Inbonud-Verkehr akzeptieren.
Alnitak

1
Gegeben, was wir gefunden haben, gibt es keine AFAIK für RELATED udp-Pakete. Wenn Sie jedoch (z. B.) ausgehend von diesem Feld FTP ausführen, benötigen Sie eine RELATED-Statusregel für den Datenkanal. Die einzelne "ESTABLISHED, RELATED" -Regel ist AFAIK die optimalste einzelne Regel für eingehenden Datenverkehr.
Alnitak

1
tatsächlich, RELATEDUDP - Pakete können für RTP existieren.
Alnitak

1

Die Entwickler von iptables haben angenommen, dass ein "ESTABLISHED" -Zustand die Situation war, in der Pakete unabhängig vom Protokoll zwischen zwei Clients in beide Richtungen gesehen wurden.

die staatserweiterung ist teil von conntrack. Der Kernel versteht den Zustand aus der Tabelle

/proc/net/nf_conntrack

Beispiel für iptable-Zustände für UDP in der Tabelle nf_conntrack aus Sicht des Absenders. Stellen Sie sich vor, Sie senden eine DNS-Abfrage über UDP

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
 [UNREPLIED] src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Ein Paket wurde gesendet. Es wird nicht geantwortet und oh, die Tabelle enthält die Daten für das, was als Gegenleistung erwartet wird (das Paket für die DNS-Antwort).

udp   17 20 src=192.168.1.2 dst=192.168.1.10 sport=35237 dport=53 \
  src=192.168.1.10 dst=192.168.1.2 sport=53 \
 dport=35237 use=1

Die Antwort ist angekommen, das nicht beantwortete Flag ist verschwunden. Dies bedeutet, dass diese UDP-Verbindung für eine kleine in Ihrem System definierte Zeitspanne im Zustand ESTABLISHED ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.