Difference between revisions of "Verbindungsanalyse anhand connection-Tracking"
(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 === | |
| − | + | <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 === | |
| + | <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: | ||
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 | ||
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 | ||
| + | <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? === | ||
| + | <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 | ||
| − | |||
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: | ||
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? === | ||
| + | <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> | ||
| − | |||
| − | + | === 5. Verbindung schließen === | |
| − | + | <pre> | |
| − | |||
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 === | ||
| + | <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> | ||
| − | |||
| − | + | === 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> | ||
| − | |||
| − | 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> | ||
| − | |||
| − | + | == 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. | ||
| − | + | Trotzdem behandelt conntrack UDP „quasi-verbindungsorientiert“. | |
| + | </pre> | ||
| − | |||
| − | + | === Wie läuft Connection Tracking bei UDP wirklich ab? === | |
| − | + | <pre> | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
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 | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
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? === | |
| − | + | <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> | ||
| − | |||
| − | + | === 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 === | ||
| + | <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> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | === 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“? === | ||
| + | <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> | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | === 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? === | ||
| + | <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> | ||
| − | |||
| − | 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> | ||
| − | + | === Zusammenfassung für UDP === | |
| + | <pre> | ||
| − | + | - UDP kennt kein ACK-Flag | |
| − | + | - Ein UDP-Datagramm besteht nur aus: | |
| − | + | * Source IP/Port | |
| + | * Destination IP/Port | ||
| + | * UDP-Header | ||
| + | * Payload | ||
| − | wie | + | - Es gibt keine Stati wie SYN, ACK, FIN, keine Sequencen, kein Acknowledgement. |
| + | - Also kann Conntrack auch kein “ACK” erkennen. | ||
| + | </pre> | ||
| − | |||
| − | + | === Was gilt dann als „Antwort“? === | |
| − | + | <pre> | |
| − | + | Conntrack erkennt eine „Antwort“ nur dadurch, | |
| − | + | dass ein Datagramm in die umgekehrte Richtung kommt mit passenden Parametern: | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | Conntrack erkennt eine „Antwort“ nur dadurch, dass ein Datagramm in die umgekehrte Richtung kommt mit passenden Parametern | ||
| − | |||
| − | |||
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. | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
</pre> | </pre> | ||
Latest revision as of 10:29, 26 November 2025
Contents
- 1 SYN / ACK anhand vom Connection Tracking (in TCP)
- 2 Connection Tracking in UDP
- 2.1 Wie läuft Connection Tracking bei UDP wirklich ab?
- 2.2 Warum macht Linux das?
- 2.3 UDP hat nur 3 relevante States
- 2.4 Wichtigster Unterschied zu TCP: Timeouts
- 2.5 Was passiert genau beim Ablauf?
- 2.6 Wann gilt ein UDP-Paket als „connected“?
- 2.7 Sonderfall: One-Way-Traffic
- 2.8 Wie beobachten?
- 2.9 Zusammengefasst in 20 Sekunden:
- 2.10 Zusammenfassung für UDP
- 2.11 Was gilt dann als „Antwort“?
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.