Depuis sgcWebSockets 4.5.2, tu peux construire tes propres serveur et clients STUN/TURN avec la bibliothèque sgcWebSockets.
STUN
Session Traversal Utilities for NAT (STUN) (acronyme dans un acronyme) est un protocole pour découvrir ton adresse publique et déterminer les restrictions de ton routeur qui empêcheraient une connexion directe avec un pair.
Le client enverra une requête à un serveur STUN sur Internet qui répondra avec l'adresse publique du client et indiquera si le client est accessible derrière le NAT du routeur ou non.
TURN
Certains routeurs utilisant NAT appliquent une restriction appelée « Symmetric NAT ». Cela signifie que le routeur n'acceptera que les connexions des pairs avec lesquels tu t'es déjà connecté.
Traversal Using Relays around NAT (TURN) vise à contourner la restriction Symmetric NAT en ouvrant une connexion avec un serveur TURN et en relayant toutes les informations via ce serveur. Tu créerais une connexion avec un serveur TURN et dirais à tous les pairs d'envoyer des paquets au serveur qui te seront ensuite transférés. Cela entraîne évidemment une certaine surcharge, donc c'est utilisé uniquement s'il n'y a pas d'autres alternatives.
Construire un serveur STUN/TURN
Le processus pour créer un serveur STUN/TURN Delphi est très simple, il te suffit de créer un TsgcTURNServer et de configurer les propriétés suivantes :
- Port : par défaut 3478, le port habituel du protocole STUN/TURN.
- STUNOptions : ici tu peux configurer les options STUN, habituellement les requêtes STUN n'utilisent pas d'authentification, tu peux donc laisser les valeurs par défaut.
- TURNOptions : ici tu peux configurer les options TURN, habituellement les serveurs TURN nécessitent des identifiants long terme (car TURN utilise une adresse de relais pour échanger des données entre pairs derrière des NAT et cela demande beaucoup de ressources). Ici tu peux configurer l'adresse IP de l'adresse relayée, configure-la dans TURNOptions.Allocation.RelayIP.
Gère l'événement OnSTUNRequestAuthorization pour définir le mot de passe quand un client TURN envoie une requête.
Enfin, définis la propriété Active à True pour démarrer le serveur.
Voici un exemple de configuration où les requêtes STUN ne nécessitent pas d'autorisation et les requêtes TURN nécessitent des identifiants long terme.
oTURN := TsgcTURNServer.Create(nil);
oTURN.Port := 3478;
oTURN.STUNOptions.Authentication.Enabled := False;
oTURN.TURNOptions.Authentication.Enabled := True;
oTURN.TURNOptions.Authentication.LongTermCredentials.Enabled := True;
oTURN.TURNOptions.Authentication.LongTermCredentials.Realm := 'sgcWebSockets';
oTURN.TURNOptions.Authentication.LongTermCredentials.StaleNonce := 600;
oTURN.Active := True;
procedure OnSTUNRequestAuthorization(Sender: TObject; const aRequest: TsgcSTUN_Message; const aUsername, aRealm: string; var Password: string);
begin
if (aUsername = 'my-user') and (aRealm = 'sgcWebSockets') then
Password := 'my-password';
end;
Construire un client STUN/TURN
Créer un nouveau client STUN/TURN Delphi est aussi simple qu'un serveur. Il te suffit de créer un TsgcTURNClient et de configurer les propriétés suivantes :
- Host : nom DNS ou adresse IP où le serveur STUN/TURN tourne.
- Port : le port, par défaut 3478.
- STUNOptions : ici tu peux configurer les options STUN, habituellement les requêtes STUN n'utilisent pas d'authentification, tu peux donc laisser les valeurs par défaut.
- TURNOptions : ici tu peux configurer les options TURN, habituellement les serveurs TURN nécessitent des identifiants long terme (car TURN utilise une adresse de relais pour échanger des données entre pairs derrière des NAT et cela demande beaucoup de ressources).
Allouer une adresse IP
Le protocole TURN permet d'utiliser une adresse IP relayée pour échanger des données entre pairs derrière des NAT.
Pour créer une nouvelle adresse IP relayée sur un serveur TURN, le client doit d'abord appeler la méthode Allocate, cette méthode envoie une requête au serveur TURN pour créer une nouvelle adresse IP relayée. Si le serveur TURN peut créer une nouvelle adresse IP relayée, le client recevra une réponse réussie. Le client pourra communiquer avec d'autres pairs pendant la durée définie dans le lifetime de l'allocation.
oTURN := TsgcTURNClient.Create(nil);
oTURN.Host := 'turn.sgcwebsockets.com';
oTURN.Port := 3478;
oTURN.Allocate();
procedure OnTURNAllocate(Sender: TObject; const aSocket: TsgcSocketConnection; const
aMessage: TsgcSTUN_Message; const aAllocation: TsgcTURN_ResponseAllocation);
begin
DoLog('Relayed IP: ' + aAllocation.RelayedIP + '. Relayed Port: ' + IntToStr(aAllocation.RelayedPort));
end;
procedure OnSTUNResponseError(Sender: TObject; const aMessage: TsgcSTUN_Message;
const aError: TsgcSTUN_ResponseError);
begin
DoLog('Error: ' + IntToStr(aError.Code) + ' ' + aError.Reason);
end;
Le lifetime peut être mis à jour pour éviter l'expiration via la méthode Refresh. Le lifetime est le nombre de secondes avant expiration. Si la valeur est zéro, l'allocation sera supprimée.
oTURN.Refresh(600);
