STUN (Session Traversal Utilities for NAT) è un protocollo IETF usato per audio e video in tempo reale nelle reti IP. STUN è un protocollo server-client, un server STUN di solito opera sia su UDP che su TCP e ascolta sulla porta 3478.
Lo scopo principale del protocollo STUN è permettere a un dispositivo dietro un NAT di scoprire il proprio IP pubblico e che tipo di NAT è.
STUN fornisce un meccanismo per comunicare tra peer dietro un NAT. I peer inviano una richiesta a un server STUN per sapere quale sia l'indirizzo IP pubblico e la porta. Le richieste di binding inviate dal client al server sono usate per determinare i binding di IP e porte allocati dai NAT. Il client STUN invia una richiesta Binding al server STUN, il server esamina l'IP e la porta sorgente usati dal client, e restituisce queste informazioni al client.
Server STUN
TsgcSTUNServer è il server che implementa il protocollo STUN e permette di elaborare le richieste di binding dai client STUN.
Il server STUN può essere configurato con o senza autenticazione, può verificare l'attributo Fingerprint, inviare un server alternativo e altro ancora.
Utilizzo di base
Di solito i server STUN girano sulla porta UDP 3478 e non richiedono autenticazione, quindi per configurare un server STUN, imposta la porta di ascolto (per default 3478) e avvia il server.
Configura il server
- Port: la porta di ascolto del server, esempio: 3478
Imposta la proprietà Active = True per avviare il server STUN.
Guarda il codice Delphi seguente che mostra come avviare un nuovo server STUN per Delphi.
oSTUN := TsgcSTUNServer.Create(nil); oSTUN.Port := 3478; oSTUN.Active := True;
Long-Term Credentials
Di solito i server STUN sono configurati senza autenticazione, quindi qualsiasi client STUN può inviare una richiesta di binding e aspettarsi una risposta dal server senza autenticazione.
Il server STUN di sgcWebSockets supporta Long-Term Credentials, quindi puoi configurare TsgcSTUNServer per accettare solo richieste di binding con informazioni Long-Term credentials.
Per configurarlo, accedi alla proprietà STUNOptions.Authorization e abilitala.
Poi accedi alla proprietà LongTermCredentials e abilitala. Di default, questo tipo di autorizzazione è già configurato con una stringa Realm e con un valore StaleNonce di default di 10 minuti (= 600 secondi).
Guarda il codice Delphi seguente che mostra come creare un nuovo server STUN per Delphi con Long-Credentials abilitate.
oSTUN := TsgcSTUNServer.Create(nil);
oSTUN.Port := 3478;
oSTUN.STUNOptions.Authentication.Enabled := True;
oSTUN.STUNOptions.Authentication.LongTermCredentials.Enabled := True;
oSTUN.STUNOptions.Authentication.LongTermCredentials.Realm := 'sgcWebSockets';
oSTUN.STUNOptions.Authentication.LongTermCredentials.StaleNonce := 600;
oSTUN.Active := True;
procedure OnSTUNRequestAuthorization(Sender: TObject; const aRequest: TsgcSTUN_Message; const aUsername, aRealm: string; var Password: string);
begin
if aUsername = 'my-user' then
Password := 'my-password';
end;
Client STUN
TsgcSTUNClient è il client che implementa il protocollo STUN e permette di inviare richieste di binding ai server STUN.
Il componente permette di usare UDP e TCP come trasporto, e quando si usa UDP come trasporto implementa un meccanismo di ritrasmissione per re-inviare le richieste se la risposta non arriva dopo un breve tempo.
Utilizzo di base
Di solito i server STUN girano sulla porta UDP 3478 e non richiedono autenticazione, quindi per inviare una richiesta di binding STUN, compila le proprietà del server per permettere al client di sapere dove connettersi e gestisci gli eventi in cui il componente riceverà la risposta dal server.
Configura il server
- Host: l'IP o il nome DNS del server, esempio: stun.sgcwebsockets.com
- Port: la porta di ascolto del server, esempio: 3478
Chiama il metodo SendRequest per inviare una richiesta di binding al server STUN.
Gestisci gli eventi
- Se il server restituisce una risposta valida, verrà chiamato l'evento OnSTUNResponseSuccess e potrai accedere alle informazioni di Binding leggendo l'oggetto aBinding.
- Se il server restituisce un errore, verrà chiamato l'evento OnSTUNResponseError e potrai accedere a Error Code e Reason leggendo l'oggetto aError.
oSTUN := TsgcSTUNClient.Create(nil);
oSTUN.Host := 'stun.sgcwebsockets.com';
oSTUN.Port := 3478;
oSTUN.SendRequest;
procedure OnSTUNResponseSuccess(Sender: TObject; const aMessage: TsgcSTUN_Message; const aBinding: TsgcSTUN_ResponseBinding);
begin
DoLog('Remote IP: ' + aBinding.RemoteIP + '. Remote Port: ' + IntToStr(aBinding.RemotePort));
end;
procedure OnSTUNResponseError(Sender: TObject; const aMessage: TsgcSTUN_Message; const aError: TsgcSTUN_ResponseError);
begin
DoLog('Error: ' + IntToStr(aError.Code) + ' ' + aError.Reason);
end;
});
