4.8 KiB
4.8 KiB
MVP-Lücken & RFC-Notizen (STUN/TURN)
Dieses Dokument listet bewusst vereinfachte/fehlende Teile im aktuellen niom-turn MVP auf, jeweils mit kurzer Auswirkung und Code-Anker.
Ziel: Klarheit, was schon interoperabel ist, und wo (für Production/Interop) noch Arbeit nötig ist.
1) STUN Binding ist minimal
Ist-Zustand
METHOD_BINDINGbeantwortet der Server als "Success" und enthältXOR-MAPPED-ADDRESS(IPv4+IPv6): src/stun.rs
Auswirkung
- Für STUN-Diagnose/ICE-NAT-Discovery ist das damit deutlich interoperabler.
2) IPv6 wird nicht unterstützt (historisch)
Ist-Zustand
- XOR-Address Encoding/Decoding unterstützt IPv4 und IPv6 (XOR-Key: Magic Cookie + Transaction ID): src/stun.rs
Auswirkung
- TURN/STUN kann IPv6-Adressen in XOR-ADDRESS Attributen korrekt verarbeiten.
3) TURN Allocate ist stark vereinfacht
Ist-Zustand
allocate_forbindet immer ein UDP-Relay auf0.0.0.0:0: src/alloc.rsREQUESTED-TRANSPORTwird nicht ausgewertet (es gibt nur UDP-Relay).- Weitere RFC-TURN Optionen (EVEN-PORT, RESERVATION-TOKEN, DONT-FRAGMENT, etc.) sind nicht implementiert.
Auswirkung
- Das MVP deckt den typischen UDP-Relay-Fall ab, aber nicht die volle TURN-Feature-Matrix.
4) Data Plane: UDP-relay ja, TCP-relay nein
Ist-Zustand
- Relay-Datenpfad ist UDP-only (Relay-Socket ist
tokio::net::UdpSocket): src/alloc.rs - TLS-Listener re-used Control-Plane Logik, aber kein TCP-Relay: src/tls.rs
Auswirkung
turns:(TLS) kann Control-Plane, aber der Rückweg der relayed Daten läuft derzeit weiterhin über UDP an die Client-UDP-Adresse.- Für echte TURN-over-TCP/TLS Data Plane (Interoperabilität mit restriktiven Netzwerken) fehlt ein eigener TCP-Relay-Pfad.
5) Allocation- und Timer-Verhalten ist MVP-artig
Ist-Zustand
- Allocation-Lifetime wird über
refresh_allocationgesetzt/geklemmt: src/alloc.rs remove_allocationentfernt den Eintrag.- Der Relay-Task (spawn in
allocate_for) läuft jedoch weiter und prüft nur noch, ob Allocation existiert: src/alloc.rs
Auswirkung
- Bei vielen Allocations kann das zu unnötigen Hintergrund-Tasks führen (Resource-Management/Backpressure fehlt).
6) Permissions & ChannelBindings sind minimal
Ist-Zustand
- Permission TTL ist statisch (300s) und wird nur durch erneutes
CreatePermissionerneuert: src/alloc.rs - ChannelBindings nutzen denselben TTL-Wert (
PERMISSION_LIFETIME): src/alloc.rs
Auswirkung
- Funktional ok für MVP, aber nicht unbedingt exakt RFC-getreu im Detail (separate Lifetime-Regeln/Refresh-Strategien sind üblich).
7) MESSAGE-INTEGRITY/FINGERPRINT
Ist-Zustand
MESSAGE-INTEGRITYwird RFC-konform geprüft (HMAC-SHA1 über die Message bis inkl. MI-Attribut; Header-Länge wird dafür auf „Ende von MI“ gesetzt, d.h. kompatibel mit nachfolgenden Attributen wieFINGERPRINT): src/stun.rs- Für TURN-Responses nach erfolgreicher Authentisierung hängt der Server
MESSAGE-INTEGRITYan und setztFINGERPRINTals letztes Attribut: src/server.rs, src/turn_stream.rs FINGERPRINTwird bei allen vom Server gebauten STUN-Nachrichten als letztes Attribut angehängt und bei eingehenden Nachrichten (falls vorhanden) validiert: src/stun.rs
Auswirkung
- Bessere Browser/ICE-Interop und leichtes Hardening (Messages mit ungültigem
FINGERPRINTwerden verworfen).
8) Observability / Limits / Hardening fehlen (noch)
Ist-Zustand
- Keine Quotas pro User/IP, keine Rate-Limits, keine Bandbreitenlimits pro Allocation.
- Credential Store ist In-Memory (Test/Dev): src/auth.rs, Trait: src/traits/credential_store.rs
Auswirkung
- Für Production braucht es Limits, persistente Credentials, Monitoring/Metrics und härteres Error-Handling.
9) Weitere RFC-Ecken (nicht implementiert)
Typische Punkte, die im MVP fehlen/noch offen sind:
- Full attribute coverage (z.B. UNKNOWN-ATTRIBUTES, SOFTWARE, etc.)
- Vollständige STUN/TURN Class/Method Encoding nach RFC (hier bewusst vereinfacht über
METHOD | CLASS_*): src/constants.rs - IPv6, Hairpinning-Sonderfälle, NAT-bezogene Interop-Edge-Cases
Was bereits gut abgedeckt ist
- End-to-end UDP TURN Core:
Allocate→CreatePermission→Send/ChannelData → Rückweg als Data Indication/ChannelData. - Long-term Auth (Realm/Nonce + MI) mit klaren 401/438/437/403 Pfaden.
- TLS Listener (Control-Plane) mit STUN-Framing über TCP/TLS.
Siehe auch die Integrationstests: tests/udp_turn.rs und tests/tls_turn.rs.