Verbindungsanalyse anhand connection-Tracking

From
Revision as of 10:01, 26 November 2025 by 62.91.65.109 (talk) (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...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

SYN / ACK anhand vom Connection Tracking

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

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
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?

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?

Während Daten laufen:

ACK, PSH, FIN, RST werden beobachtet

Reihenfolge und TCP-Flags werden ausgewertet

alle Pakete werden dem State zugeordnet

🔹 5. Verbindung schließen
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

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

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:

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.

Wenn du willst, kann ich dir noch erklären:

wie UDP und ICMP darin behandelt werden (ganz anders!)

wie man den Ablauf in Linux live mitverfolgt (conntrack -E)

was passiert bei NAT

oder wie SYN-Flood-Schutz funktioniert.

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

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?

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
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

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?

Timing-Diagramm:

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

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

… weiter Daten …


Wenn nach x Sekunden kein Paket mehr kommt:

Entry removed.


Keine FIN/RST wie bei TCP.

🧩 Wann gilt ein UDP-Paket als „connected“?

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

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

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

🛠 Wie beobachten?

Voll live:

conntrack -E -p udp


Oder Einträge ansehen:

conntrack -L -p udp

✨ Zusammengefasst in 20 Sekunden:

Erstes UDP-Paket → NEW/UNREPLIED

Antwort kommt → ESTABLISHED

Kein Handshake, keine Flags

Nur Timeouts entscheiden, wann gelöscht wird

Wenn du möchtest, erkläre ich auch:

wie NAT bei UDP funktioniert,

wieso Firewalls UDP-Floods erkennen,

warum VoIP manchmal wegen conntrack kaputt geht,

oder den Unterschied zu ICMP-Tracking.

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
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.

🧠 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