Difference between revisions of "Verbindungsanalyse anhand connection-Tracking"

From
Jump to: navigation, search
(Created page with "== SYN / ACK anhand vom Connection Tracking == <pre> Connection Tracking (z. B. im Linux-Kernel/Netfilter → conntrack) beobachtet und analysiert den Zustand einer Verbindung...")
 
(SYN / ACK anhand vom Connection Tracking)
 
Line 1: Line 1:
== SYN / ACK anhand vom Connection Tracking ==
+
== SYN / ACK anhand vom Connection Tracking (in TCP) ==
 
<pre>
 
<pre>
Connection Tracking (z. B. im Linux-Kernel/Netfilter → conntrack) beobachtet und analysiert den Zustand einer Verbindung – besonders bei TCP – damit das System weiß, ob ein Paket zu einer bestehenden, neuen oder hinfälligen Verbindung gehört.
+
Connection Tracking (z. B. im Linux-Kernel/Netfilter → conntrack) beobachtet und analysiert den Zustand einer Verbindung
 +
– besonders bei TCP – damit das System weiß, ob ein Paket zu einer bestehenden, neuen oder hinfälligen Verbindung gehört.
 +
</pre>
  
 
Wir gehen es sauber durch:
 
Wir gehen es sauber durch:
  
🔹 1. Ausgangspunkt: Ein TCP-Handshake
+
=== 1. Ausgangspunkt: Ein TCP-Handshake ===
 
+
<pre>
 
Eine neue TCP-Verbindung beginnt immer mit:
 
Eine neue TCP-Verbindung beginnt immer mit:
  
Client  →  Server:  SYN
+
    Client  →  Server:  SYN
Server  →  Client:  SYN-ACK
+
    Server  →  Client:  SYN-ACK
Client  →  Server:  ACK
+
    Client  →  Server:  ACK
  
  
 
Sobald das erste SYN auftaucht, erkennt das Conntrack-Modul:
 
Sobald das erste SYN auftaucht, erkennt das Conntrack-Modul:
  
das ist eine neue Verbindung
+
- das ist eine neue Verbindung
  
noch nicht bestätigt
+
- noch nicht bestätigt
  
es wird ein Eintrag in der Connection-Tracking-Tabelle angelegt
+
- es wird ein Eintrag in der Connection-Tracking-Tabelle angelegt
  
 
Status in conntrack: SYN_SENT
 
Status in conntrack: SYN_SENT
 +
</pre>
 +
  
🔹 2. Nach SYN: die nächsten Pakete
+
=== 2. Nach SYN: die nächsten Pakete ===
 +
<pre>
 
Phase für jedes Paket aus Sicht des Trackings:
 
Phase für jedes Paket aus Sicht des Trackings:
1️⃣ Paket kommt an → conntrack prüft:
 
  
 +
1) Paket kommt an → conntrack prüft:
 
Gibt es schon einen State-Eintrag in der Tabelle?
 
Gibt es schon einen State-Eintrag in der Tabelle?
  
 
ja: zuordnen
 
ja: zuordnen
 
 
nein: neuer State
 
nein: neuer State
  
2️⃣ Ein SYN-ACK kommt zurück
 
  
 +
2) Ein SYN-ACK kommt zurück
 
Jetzt wird der Status angepasst:
 
Jetzt wird der Status angepasst:
  
 
SYN_SENT  →  SYN_RECV
 
SYN_SENT  →  SYN_RECV
 
  
 
Conntrack weiß: die Gegenstelle lebt.
 
Conntrack weiß: die Gegenstelle lebt.
 +
</pre>
  
3️⃣ Das finale ACK
 
  
 +
3) Das finale ACK
 +
<pre>
 
Damit ist die Verbindung etabliert:
 
Damit ist die Verbindung etabliert:
  
 
SYN_RECV → ESTABLISHED
 
SYN_RECV → ESTABLISHED
 
  
 
Und jetzt dürfen normale Datenpakete fließen.
 
Und jetzt dürfen normale Datenpakete fließen.
 +
</pre>
  
🔹 3. Wieso ist das wichtig?
 
  
 +
=== 3. Wieso ist das wichtig? ===
 +
<pre>
 
Weil ein Firewall-Regelwerk normalerweise sagt:
 
Weil ein Firewall-Regelwerk normalerweise sagt:
  
Neue Verbindungen NUR von innen nach außen
+
- Neue Verbindungen NUR von innen nach außen
 +
- Schon bestehende Verbindungen dürfen immer durchgehen
  
Schon bestehende Verbindungen dürfen immer durchgehen
 
  
 
Das bedeutet: das System merkt sich:
 
Das bedeutet: das System merkt sich:
  
source/destination IP
+
- source/destination IP
 
+
- Ports
Ports
+
- Protokoll
 
+
- TCP-Flags
Protokoll
+
- Zeitstempel
 
 
TCP-Flags
 
 
 
Zeitstempel
 
 
 
Beispiel eines Eintrags:
 
  
 +
#Beispiel eines Eintrags:
 
tcp  ESTABLISHED  src=192.168.1.100 dst=93.184.216.34 sport=53218 dport=443
 
tcp  ESTABLISHED  src=192.168.1.100 dst=93.184.216.34 sport=53218 dport=443
 +
</pre>
  
🔹 4. Wie geht es nach dem Handshake weiter?
 
  
 +
=== 4. Wie geht es nach dem Handshake weiter? ===
 +
<pre>
 
Während Daten laufen:
 
Während Daten laufen:
  
ACK, PSH, FIN, RST werden beobachtet
+
- ACK, PSH, FIN, RST werden beobachtet
 +
- Reihenfolge und TCP-Flags werden ausgewertet
 +
- alle Pakete werden dem State zugeordnet
 +
<//pre>
  
Reihenfolge und TCP-Flags werden ausgewertet
 
  
alle Pakete werden dem State zugeordnet
+
=== 5. Verbindung schließen ===
 
+
<pre>
🔹 5. Verbindung schließen
 
 
Normal:
 
Normal:
 
FIN → ACK → FIN → ACK
 
FIN → ACK → FIN → ACK
 
  
 
conntrack wechselt:
 
conntrack wechselt:
 
 
FIN_WAIT → CLOSE_WAIT → LAST_ACK → CLOSED
 
FIN_WAIT → CLOSE_WAIT → LAST_ACK → CLOSED
  
 
Oder abrupt:
 
Oder abrupt:
 
RST
 
RST
 
 
 
=> sofortiger Abbruch, Eintrag wird gelöscht.
 
=> sofortiger Abbruch, Eintrag wird gelöscht.
 +
</pre>
  
🔹 6. Timeouts
 
  
 +
=== 6. Timeouts ===
 +
<pre>
 
Ist kein Traffic mehr da:
 
Ist kein Traffic mehr da:
 
+
- TCP connections bleiben eine Zeit lang im State TIME_WAIT.
TCP connections bleiben eine Zeit lang im State TIME_WAIT.
+
- Dann fliegt der Eintrag raus
 
 
Dann fliegt der Eintrag raus
 
  
 
Beispiele (sehr grob):
 
Beispiele (sehr grob):
 +
- NEW: wenige Sekunden
 +
- ESTABLISHED: mehrere Minuten
 +
- TIME_WAIT: ca. 2 Minuten
 +
</pre>
  
NEW: wenige Sekunden
 
  
ESTABLISHED: mehrere Minuten
+
=== 7. Wichtig: conntrack unterscheidet 3 grundlegende Pakettypen ===
 
 
TIME_WAIT: ca. 2 Minuten
 
 
 
🔹 7. Wichtig: conntrack unterscheidet 3 grundlegende Pakettypen
 
  
 
Paket kommt an und ist …
 
Paket kommt an und ist …
  
Typ Erklärung
+
Typ         Erklärung
NEW neue Verbindung
+
NEW         neue Verbindung
 
ESTABLISHED gehört zu einer bestehenden
 
ESTABLISHED gehört zu einer bestehenden
RELATED z. B. FTP Datenkanal, ICMP-Antworten
+
RELATED         z.B. FTP Datenkanal, ICMP-Antworten
  
 
Daher funktionieren Firewall-Regeln wie:
 
Daher funktionieren Firewall-Regeln wie:
 
 
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
 +
</pre>
  
🔹 Zusammenfassung in einem Satz:
 
  
Nach dem ersten SYN legt conntrack einen Verbindungs-State an, passt ihn bei jedem nächsten TCP-Flag an (SYN-ACK, ACK, FIN, RST) und entscheidet so, ob Pakete zu einer gültigen Verbindung gehören.
+
=== Zusammenfassung in einem Satz ===
 +
<pre>
 +
Nach dem ersten SYN legt conntrack einen Verbindungs-State an, passt ihn bei jedem nächsten TCP-Flag an (SYN-ACK, ACK, FIN, RST)  
 +
und entscheidet so, ob Pakete zu einer gültigen Verbindung gehören.
 +
</pre>
  
Wenn du willst, kann ich dir noch erklären:
 
  
wie UDP und ICMP darin behandelt werden (ganz anders!)
+
== Connection Tracking in UDP ==
 +
<pre>
 +
bei UDP ist Connection Tracking völlig anders als bei TCP, weil UDP:
 +
- kein Handshake hat,
 +
- keine Sessionzustände über Flags hat,
 +
- verbindungslos ist.
  
wie man den Ablauf in Linux live mitverfolgt (conntrack -E)
+
Trotzdem behandelt conntrack UDP „quasi-verbindungsorientiert“.
 +
</pre>
  
was passiert bei NAT
 
  
oder wie SYN-Flood-Schutz funktioniert.
+
=== Wie läuft Connection Tracking bei UDP wirklich ab? ===
 
+
<pre>
Du:
 
Ich muß meine Frage konkretisieren. Mir geht es um UDP-Verbindungen.
 
ChatGPT:
 
 
 
Perfekt, gute Präzisierung — bei UDP ist Connection Tracking völlig anders als bei TCP, weil UDP:
 
 
 
kein Handshake hat,
 
 
 
keine Sessionzustände über Flags hat,
 
 
 
verbindungslos ist.
 
 
 
Trotzdem behandelt conntrack UDP „quasi-verbindungsorientiert“. Ich zerlege es Schritt für Schritt.
 
 
 
🟦 Wie läuft Connection Tracking bei UDP wirklich ab?
 
 
1. Erstes UDP-Paket kommt an
 
1. Erstes UDP-Paket kommt an
  
Line 164: Line 155:
  
 
State = NEW
 
State = NEW
 
  
 
Beispiel (vereinfacht):
 
Beispiel (vereinfacht):
 
 
src=10.0.0.1:50000 → dst=8.8.8.8:53
 
src=10.0.0.1:50000 → dst=8.8.8.8:53
  
  
 
Der Kernel merkt sich:
 
Der Kernel merkt sich:
 +
- Quell-IP + Port
 +
- Ziel-IP + Port
 +
- Protokoll UDP
 +
- Timestamp
  
Quell-IP + Port
 
 
Ziel-IP + Port
 
 
Protokoll UDP
 
 
Timestamp
 
  
 
2. Sobald eine Antwort zurückkommt
 
2. Sobald eine Antwort zurückkommt
  
 
conntrack wechselt nach:
 
conntrack wechselt nach:
 
 
State = ESTABLISHED
 
State = ESTABLISHED
 
  
 
Ja, obwohl es bei UDP keine echte Verbindung gibt.
 
Ja, obwohl es bei UDP keine echte Verbindung gibt.
 +
</pre>
  
🧠 Warum macht Linux das?
+
=== Warum macht Linux das? ===
 
+
<pre>
 
Damit deine Firewall Regeln wie diese benutzen kann:
 
Damit deine Firewall Regeln wie diese benutzen kann:
  
 
--ctstate ESTABLISHED,RELATED
 
--ctstate ESTABLISHED,RELATED
 
  
 
und dann geht z. B. DNS-Traffic problemlos:
 
und dann geht z. B. DNS-Traffic problemlos:
 
 
Anfrage → NEW
 
Anfrage → NEW
 +
Antwort → ESTABLISHED
 +
</pre>
  
Antwort → ESTABLISHED
 
  
🔁 UDP hat nur 3 relevante States
+
=== UDP hat nur 3 relevante States ===
UDP State Bedeutung
+
<pre>
NEW erstes Paket gesehen
+
      UDP State Bedeutung
ESTABLISHED es gab ein Rückpaket
+
      NEW         erstes Paket gesehen
UNREPLIED keine Antwort kam
+
      ESTABLISHED es gab ein Rückpaket
 +
      UNREPLIED keine Antwort kam
  
 
Wenn also ein Paket nur in eine Richtung geht:
 
Wenn also ein Paket nur in eine Richtung geht:
 
 
UNREPLIED
 
UNREPLIED
 
  
 
Erst wenn eine Antwort kommt:
 
Erst wenn eine Antwort kommt:
 
 
ESTABLISHED
 
ESTABLISHED
 +
</pre>
  
🕒 Wichtigster Unterschied zu TCP: Timeouts
 
  
 +
=== Wichtigster Unterschied zu TCP: Timeouts ===
 +
<pre>
 
TCP-Conntrack hält lange Einträge.
 
TCP-Conntrack hält lange Einträge.
 
 
UDP dagegen sehr kurz.
 
UDP dagegen sehr kurz.
 
 
Typische Linux-Defaults (können variieren):
 
Typische Linux-Defaults (können variieren):
  
/proc/sys/net/netfilter/nf_conntrack_udp_timeout = 30
+
      /proc/sys/net/netfilter/nf_conntrack_udp_timeout = 30
/proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream = 180
+
      /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream = 180
 
 
  
 
Bedeutung:
 
Bedeutung:
 +
- Wenn nur in eine Richtung Traffic kommt ➜ Eintrag nach 30s weg.
 +
- Wenn bidirektional ➜ bis zu 180s im Table.
 +
</pre>
  
Wenn nur in eine Richtung Traffic kommt ➜ Eintrag nach 30s weg.
 
 
Wenn bidirektional ➜ bis zu 180s im Table.
 
 
🔥 Was passiert genau beim Ablauf?
 
  
 +
=== Was passiert genau beim Ablauf? ===
 +
<pre>
 
Timing-Diagramm:
 
Timing-Diagramm:
  
Line 247: Line 228:
  
 
… weiter Daten …
 
… weiter Daten …
 +
<pre>
  
 
+
<pre>
 
Wenn nach x Sekunden kein Paket mehr kommt:
 
Wenn nach x Sekunden kein Paket mehr kommt:
 
 
Entry removed.
 
Entry removed.
 +
</pre>
  
 
+
<pre>
 
Keine FIN/RST wie bei TCP.
 
Keine FIN/RST wie bei TCP.
 +
</pre>
  
🧩 Wann gilt ein UDP-Paket als „connected“?
 
  
 +
=== Wann gilt ein UDP-Paket als „connected“? ===
 +
<pre>
 
Sobald conntrack beide Richtungen gesehen hat.
 
Sobald conntrack beide Richtungen gesehen hat.
  
 
Das bedeutet:
 
Das bedeutet:
 +
- Firewall kann zuverlässig Rückpakete erkennen.
 +
- NAT weiß, wohin Rückpakete gehen müssen.
 +
</pre>
  
Firewall kann zuverlässig Rückpakete erkennen.
 
 
NAT weiß, wohin Rückpakete gehen müssen.
 
 
🧬 Sonderfall: One-Way-Traffic
 
  
 +
=== Sonderfall: One-Way-Traffic ===
 +
<pre>
 
UDP-Protokolle wie syslog, RTP, VoIP, SNMP:
 
UDP-Protokolle wie syslog, RTP, VoIP, SNMP:
  
 
Nie ein Response? → bleibt UNREPLIED
 
Nie ein Response? → bleibt UNREPLIED
 
Timeout löscht Eintrag
 
Timeout löscht Eintrag
 +
</pre>
  
🛠 Wie beobachten?
 
  
 +
=== Wie beobachten? ===
 +
<pre>
 
Voll live:
 
Voll live:
 
 
conntrack -E -p udp
 
conntrack -E -p udp
 
  
 
Oder Einträge ansehen:
 
Oder Einträge ansehen:
 
 
conntrack -L -p udp
 
conntrack -L -p udp
 +
</pre>
  
✨ Zusammengefasst in 20 Sekunden:
 
  
Erstes UDP-Paket → NEW/UNREPLIED
+
=== Zusammengefasst in 20 Sekunden: ===
 +
<pre>
 +
- Erstes UDP-Paket → NEW/UNREPLIED
 +
- Antwort kommt → ESTABLISHED
 +
- Kein Handshake, keine Flags
 +
- Nur Timeouts entscheiden, wann gelöscht wird
 +
</pre>
  
Antwort kommt → ESTABLISHED
+
=== Zusammenfassung für UDP ===
 +
<pre>
  
Kein Handshake, keine Flags
+
- UDP kennt kein ACK-Flag
  
Nur Timeouts entscheiden, wann gelöscht wird
+
- Ein UDP-Datagramm besteht nur aus:
  
Wenn du möchtest, erkläre ich auch:
+
        * Source IP/Port
 +
        * Destination IP/Port
 +
        * UDP-Header
 +
        * Payload
  
wie NAT bei UDP funktioniert,
+
- Es gibt keine Stati wie SYN, ACK, FIN, keine Sequencen, kein Acknowledgement.
 +
- Also kann Conntrack auch kein “ACK” erkennen.
 +
</pre>
  
wieso Firewalls UDP-Floods erkennen,
 
  
warum VoIP manchmal wegen conntrack kaputt geht,
+
=== Was gilt dann als „Antwort“? ===
 
+
<pre>
oder den Unterschied zu ICMP-Tracking.
+
Conntrack erkennt eine „Antwort“ nur dadurch,  
 
+
dass ein Datagramm in die umgekehrte Richtung kommt mit passenden Parametern:
Du:
 
Als Antwort ist ein ACK ausreichend?
 
ChatGPT:
 
 
 
Kurz und wichtig: Nein. Bei UDP gibt es kein ACK im TCP-Sinne.
 
Deshalb ist ein „ACK“ auch nicht das, was Conntrack als Antwort erwartet.
 
 
 
❗UDP kennt kein ACK-Flag
 
 
 
Ein UDP-Datagramm besteht nur aus:
 
 
 
Source IP/Port
 
 
 
Destination IP/Port
 
 
 
UDP-Header
 
 
 
Payload
 
 
 
Es gibt keine Stati wie SYN, ACK, FIN, keine Sequencen, kein Acknowledgement.
 
 
 
Also kann Conntrack auch kein “ACK” erkennen.
 
 
 
Was gilt dann als „Antwort“?
 
 
 
Conntrack erkennt eine „Antwort“ nur dadurch, dass ein Datagramm in die umgekehrte Richtung kommt mit passenden Parametern:
 
 
 
Beispiel:
 
  
 
Client -> Server : UDP 50000 -> 53
 
Client -> Server : UDP 50000 -> 53
 
Server -> Client : UDP 53 -> 50000  ← das ist die Antwort
 
Server -> Client : UDP 53 -> 50000  ← das ist die Antwort
 
  
 
Damit wechselt der State:
 
Damit wechselt der State:
 
 
NEW/UNREPLIED  →  ESTABLISHED
 
NEW/UNREPLIED  →  ESTABLISHED
 
  
 
Es ist also egal, was im Paket steht.
 
Es ist also egal, was im Paket steht.
 
Nur Richtung und 5-Tuple zählen:
 
Nur Richtung und 5-Tuple zählen:
 
+
- Source IP
Source IP
+
- Destination IP
 
+
- Source Port
Destination IP
+
- Destination Port
 
+
- Protocol (UDP)
Source Port
 
 
 
Destination Port
 
 
 
Protocol (UDP)
 
  
 
Keine Flags. Kein Handshake. Kein ACK.
 
Keine Flags. Kein Handshake. Kein ACK.
  
🧠 Also noch einmal ganz klar:
 
Reicht ein ACK?
 
 
➡ Nein, weil es bei UDP kein ACK gibt.
 
 
Was reicht?
 
 
➡ Ein Datagramm vom Server zurück zum Client, damit conntrack es als established einstuft.
 
 
Bonus-Beispiel
 
 
Wenn ein Client DNS fragt:
 
 
Client -> 8.8.8.8:53      → NEW
 
8.8.8.8 -> Client:50000  → ESTABLISHED
 
 
 
Aber wenn du z. B. Syslog über UDP sendest und der Server nichts zurückschickt:
 
 
UNREPLIED → Timeout → gelöscht
 
 
</pre>
 
</pre>

Latest revision as of 10:29, 26 November 2025

SYN / ACK anhand vom Connection Tracking (in TCP)[edit]

Connection Tracking (z. B. im Linux-Kernel/Netfilter → conntrack) beobachtet und analysiert den Zustand einer Verbindung
 – besonders bei TCP – damit das System weiß, ob ein Paket zu einer bestehenden, neuen oder hinfälligen Verbindung gehört.

Wir gehen es sauber durch:

1. Ausgangspunkt: Ein TCP-Handshake[edit]

Eine neue TCP-Verbindung beginnt immer mit:

    Client  →  Server:   SYN
    Server  →  Client:   SYN-ACK
    Client  →  Server:   ACK


Sobald das erste SYN auftaucht, erkennt das Conntrack-Modul:

- das ist eine neue Verbindung

- noch nicht bestätigt

- es wird ein Eintrag in der Connection-Tracking-Tabelle angelegt

Status in conntrack: SYN_SENT


2. Nach SYN: die nächsten Pakete[edit]

Phase für jedes Paket aus Sicht des Trackings:

1) Paket kommt an → conntrack prüft:
Gibt es schon einen State-Eintrag in der Tabelle?

ja: zuordnen
nein: neuer State


2) Ein SYN-ACK kommt zurück
Jetzt wird der Status angepasst:

SYN_SENT  →  SYN_RECV

Conntrack weiß: die Gegenstelle lebt.


3) Das finale ACK

Damit ist die Verbindung etabliert:

SYN_RECV → ESTABLISHED

Und jetzt dürfen normale Datenpakete fließen.


3. Wieso ist das wichtig?[edit]

Weil ein Firewall-Regelwerk normalerweise sagt:

- Neue Verbindungen NUR von innen nach außen
- Schon bestehende Verbindungen dürfen immer durchgehen


Das bedeutet: das System merkt sich:

- source/destination IP
- Ports
- Protokoll
- TCP-Flags
- Zeitstempel

#Beispiel eines Eintrags:
tcp  ESTABLISHED  src=192.168.1.100 dst=93.184.216.34 sport=53218 dport=443


4. Wie geht es nach dem Handshake weiter?[edit]

Während Daten laufen:

- ACK, PSH, FIN, RST werden beobachtet
- Reihenfolge und TCP-Flags werden ausgewertet
- alle Pakete werden dem State zugeordnet
<//pre>


=== 5. Verbindung schließen ===
<pre>
Normal:
FIN → ACK → FIN → ACK

conntrack wechselt:
FIN_WAIT → CLOSE_WAIT → LAST_ACK → CLOSED

Oder abrupt:
RST
=> sofortiger Abbruch, Eintrag wird gelöscht.


6. Timeouts[edit]

Ist kein Traffic mehr da:
- TCP connections bleiben eine Zeit lang im State TIME_WAIT.
- Dann fliegt der Eintrag raus

Beispiele (sehr grob):
- NEW: wenige Sekunden
- ESTABLISHED: mehrere Minuten
- TIME_WAIT: ca. 2 Minuten


7. Wichtig: conntrack unterscheidet 3 grundlegende Pakettypen[edit]

Paket kommt an und ist …

Typ Erklärung NEW neue Verbindung ESTABLISHED gehört zu einer bestehenden RELATED z.B. FTP Datenkanal, ICMP-Antworten

Daher funktionieren Firewall-Regeln wie: iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT


Zusammenfassung in einem Satz[edit]

Nach dem ersten SYN legt conntrack einen Verbindungs-State an, passt ihn bei jedem nächsten TCP-Flag an (SYN-ACK, ACK, FIN, RST) 
und entscheidet so, ob Pakete zu einer gültigen Verbindung gehören.


Connection Tracking in UDP[edit]

bei UDP ist Connection Tracking völlig anders als bei TCP, weil UDP:
- kein Handshake hat,
- keine Sessionzustände über Flags hat,
- verbindungslos ist.

Trotzdem behandelt conntrack UDP „quasi-verbindungsorientiert“. 


Wie läuft Connection Tracking bei UDP wirklich ab?[edit]

1. Erstes UDP-Paket kommt an

Wenn das erste UDP-Paket gesehen wird, erstellt conntrack sofort einen State-Eintrag:

State = NEW

Beispiel (vereinfacht):
src=10.0.0.1:50000 → dst=8.8.8.8:53


Der Kernel merkt sich:
- Quell-IP + Port
- Ziel-IP + Port
- Protokoll UDP
- Timestamp


2. Sobald eine Antwort zurückkommt

conntrack wechselt nach:
State = ESTABLISHED

Ja, obwohl es bei UDP keine echte Verbindung gibt.

Warum macht Linux das?[edit]

Damit deine Firewall Regeln wie diese benutzen kann:

--ctstate ESTABLISHED,RELATED

und dann geht z. B. DNS-Traffic problemlos:
Anfrage → NEW
Antwort → ESTABLISHED


UDP hat nur 3 relevante States[edit]

       UDP State	Bedeutung
       NEW	        erstes Paket gesehen
       ESTABLISHED	es gab ein Rückpaket
       UNREPLIED	keine Antwort kam

Wenn also ein Paket nur in eine Richtung geht:
UNREPLIED

Erst wenn eine Antwort kommt:
ESTABLISHED


Wichtigster Unterschied zu TCP: Timeouts[edit]

TCP-Conntrack hält lange Einträge.
UDP dagegen sehr kurz.
Typische Linux-Defaults (können variieren):

       /proc/sys/net/netfilter/nf_conntrack_udp_timeout = 30
       /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream = 180

Bedeutung:
- Wenn nur in eine Richtung Traffic kommt ➜ Eintrag nach 30s weg.
- Wenn bidirektional ➜ bis zu 180s im Table.


Was passiert genau beim Ablauf?[edit]

Timing-Diagramm:

Client ---- UDP Packet ----> Server
           conntrack: NEW (UNREPLIED)

Server ---- UDP Packet ----> Client
           conntrack: ESTABLISHED

… weiter Daten …
<pre>

<pre>
Wenn nach x Sekunden kein Paket mehr kommt:
Entry removed.
Keine FIN/RST wie bei TCP.


Wann gilt ein UDP-Paket als „connected“?[edit]

Sobald conntrack beide Richtungen gesehen hat.

Das bedeutet:
- Firewall kann zuverlässig Rückpakete erkennen.
- NAT weiß, wohin Rückpakete gehen müssen.


Sonderfall: One-Way-Traffic[edit]

UDP-Protokolle wie syslog, RTP, VoIP, SNMP:

Nie ein Response? → bleibt UNREPLIED
Timeout löscht Eintrag


Wie beobachten?[edit]

Voll live:
conntrack -E -p udp

Oder Einträge ansehen:
conntrack -L -p udp


Zusammengefasst in 20 Sekunden:[edit]

- Erstes UDP-Paket → NEW/UNREPLIED
- Antwort kommt → ESTABLISHED
- Kein Handshake, keine Flags
- Nur Timeouts entscheiden, wann gelöscht wird

Zusammenfassung für UDP[edit]


- UDP kennt kein ACK-Flag

- Ein UDP-Datagramm besteht nur aus:

        * Source IP/Port
        * Destination IP/Port
        * UDP-Header
        * Payload

- Es gibt keine Stati wie SYN, ACK, FIN, keine Sequencen, kein Acknowledgement.
- Also kann Conntrack auch kein “ACK” erkennen.


Was gilt dann als „Antwort“?[edit]

Conntrack erkennt eine „Antwort“ nur dadurch, 
dass ein Datagramm in die umgekehrte Richtung kommt mit passenden Parametern:

Client -> Server : UDP 50000 -> 53
Server -> Client : UDP 53 -> 50000  ← das ist die Antwort

Damit wechselt der State:
NEW/UNREPLIED  →  ESTABLISHED

Es ist also egal, was im Paket steht.
Nur Richtung und 5-Tuple zählen:
- Source IP
- Destination IP
- Source Port
- Destination Port
- Protocol (UDP)

Keine Flags. Kein Handshake. Kein ACK.