4.9 KiB
4.9 KiB
Runtime Configuration
Dateien
appsettings.example.json: Beispiel mit Server-Bind und Test-Credentials.appsettings.json: Produktiverstellung (bind, TLS, Credentials).
Struktur
Config {
server: ServerOptions {
bind: String,
udp_bind: Option<String>,
tcp_bind: Option<String>,
tls_bind: String,
enable_udp: bool,
enable_tcp: bool,
enable_tls: bool,
tls_cert: Option<String>,
tls_key: Option<String>,
},
relay: RelayOptions {
relay_port_min: Option<u16>,
relay_port_max: Option<u16>,
relay_bind_ip: Option<String>,
advertised_ip: Option<String>,
},
logging: LoggingOptions {
default_directive: Option<String>,
},
limits: LimitsOptions {
max_allocations_per_ip: Option<u32>,
max_permissions_per_allocation: Option<u32>,
max_channel_bindings_per_allocation: Option<u32>,
unauth_rps: Option<u32>,
unauth_burst: Option<u32>,
binding_rps: Option<u32>,
binding_burst: Option<u32>,
},
credentials: Vec<CredentialEntry> {
username: String,
password: String,
}
}
Default-Fallbacks (siehe main.rs)
- Bind:
0.0.0.0:3478 - Single Test Credential:
testuser/secretpassword
Runbook (Start & Betrieb)
1) Konfiguration anlegen
- Der Server lädt immer
appsettings.jsonaus dem aktuellen Working Directory (sieheConfig::load_default()). - Als Basis kannst du
appsettings.example.jsonnachappsettings.jsonkopieren und anpassen.
2) Server starten
# im Repo-Root
cargo run --bin niom-turn
Optional kannst du das Log-Level überschreiben:
RUST_LOG=info cargo run --bin niom-turn
Hinweise:
- Wenn
server.enable_tls=true, aberserver.tls_cert/server.tls_keyfehlen, wird der TLS-Listener übersprungen (Info-Log). - Beim Start loggt der Server, welche Listener aktiv sind und welche Relay-Optionen gelten.
3) Minimal-Konfig: UDP-only (einfachster Start)
{
"server": {
"bind": "0.0.0.0:3478",
"enable_udp": true,
"enable_tcp": false,
"enable_tls": false,
"tls_cert": null,
"tls_key": null
},
"relay": {
"relay_bind_ip": "0.0.0.0",
"advertised_ip": null,
"relay_port_min": null,
"relay_port_max": null
},
"logging": {
"default_directive": "warn,niom_turn=info"
},
"limits": {
"max_allocations_per_ip": null,
"max_permissions_per_allocation": null,
"max_channel_bindings_per_allocation": null,
"unauth_rps": null,
"unauth_burst": null,
"binding_rps": null,
"binding_burst": null
},
"credentials": [
{ "username": "testuser", "password": "secretpassword" }
],
"auth": {
"realm": "niom-turn.local",
"nonce_secret": null,
"nonce_ttl_seconds": 300,
"rest_secret": null,
"rest_max_ttl_seconds": 600
}
}
4) Minimal-Konfig: UDP + TCP + TLS (für maximale WebRTC-Kompatibilität)
{
"server": {
"bind": "0.0.0.0:3478",
"tls_bind": "0.0.0.0:5349",
"enable_udp": true,
"enable_tcp": true,
"enable_tls": true,
"tls_cert": "/etc/niom-turn/tls/fullchain.pem",
"tls_key": "/etc/niom-turn/tls/privkey.pem"
},
"relay": {
"relay_bind_ip": "0.0.0.0",
"advertised_ip": "203.0.113.10",
"relay_port_min": 49152,
"relay_port_max": 49252
},
"logging": {
"default_directive": "warn,niom_turn=info"
},
"limits": {
"max_allocations_per_ip": 50,
"max_permissions_per_allocation": 200,
"max_channel_bindings_per_allocation": 50,
"unauth_rps": 5,
"unauth_burst": 20,
"binding_rps": 50,
"binding_burst": 200
},
"credentials": [
{ "username": "testuser", "password": "secretpassword" }
]
}
Betriebs-Checkliste (kurz):
- Firewall öffnen: UDP/3478, TCP/3478, TCP/5349 sowie den UDP-Relay-Portbereich (
relay_port_min/max). - Hinter NAT:
relay.advertised_ipauf die öffentliche IP setzen. - Für TURN REST Credentials:
auth.rest_secretsetzen und ggf. festecredentialsleer lassen.
TODOs
- Shared Secret / REST API zur Credential-Verwaltung.
- Health-Port (HTTP) für Monitoring.
- Rate-Limits/Quota (pro Username) und Relay-Port-Range produktiv setzen.
Hinweise für produktiven Betrieb
-
Wenn der Server hinter NAT läuft, setze
relay.advertised_ipauf die öffentliche IP, damit Clients in XOR-RELAYED-ADDRESS eine erreichbare Adresse erhalten. -
Für Firewalls ist ein fester Relay-Port-Range sinnvoll (
relay_port_min/max), damit nur dieser UDP-Bereich geöffnet werden muss. -
Allocations werden auch ohne Traffic periodisch auf Expiry geprüft und bereinigt (Housekeeping), damit Relay-Sockets/Tasks nicht dauerhaft hängen bleiben.