STUN (Session Traversal Utilities for NAT) est un protocole IETF utilisé pour l'audio et la vidéo en temps réel sur des réseaux IP. STUN est un protocole serveur-client, un serveur STUN opère généralement à la fois sur UDP et TCP et écoute sur le port 3478.
L'objectif principal du protocole STUN est de permettre à un appareil fonctionnant derrière un NAT de découvrir son IP publique et le type de NAT auquel il est confronté.
STUN fournit un mécanisme de communication entre pairs derrière un NAT. Les pairs envoient une requête à un serveur STUN pour connaître l'adresse IP publique et le port. Les requêtes binding envoyées du client au serveur sont utilisées pour déterminer les bindings d'IP et de ports alloués par les NAT. Le client STUN envoie une requête Binding au serveur STUN, le serveur examine l'IP source et le port utilisés par le client et renvoie cette information au client.
Serveur STUN
TsgcSTUNServer est le serveur qui implémente le protocole STUN et permet de traiter les requêtes binding des clients STUN.
Le serveur STUN peut être configuré avec ou sans authentification, peut vérifier l'attribut Fingerprint, envoyer un serveur alternatif et plus encore.
Utilisation basique
Habituellement les serveurs stun tournent sur le port UDP 3478 et ne nécessitent pas d'authentification, donc pour configurer un serveur STUN, définis le port d'écoute (par défaut 3478) et démarre le serveur.
Configure le serveur
- Port : port d'écoute du serveur, exemple : 3478
Définis la propriété Active = True pour démarrer le serveur STUN.
Examine le code Delphi suivant qui montre comment démarrer un nouveau serveur STUN Delphi.
oSTUN := TsgcSTUNServer.Create(nil); oSTUN.Port := 3478; oSTUN.Active := True;
Identifiants long terme
Habituellement les serveurs STUN sont configurés sans authentification, donc n'importe quel client STUN peut envoyer une requête binding et attendre une réponse du serveur sans authentification.
Le serveur STUN sgcWebSockets prend en charge les identifiants long terme, tu peux donc configurer TsgcSTUNServer pour n'autoriser que les requêtes binding avec des informations d'identifiants long terme.
Pour le configurer, accède à la propriété STUNOptions.Authorization et active-la.
Ensuite accède à la propriété LongTermCredentials et active-la. Par défaut, ce type d'autorisation est déjà configuré avec une chaîne Realm et une valeur StaleNonce par défaut de 10 minutes (= 600 secondes).
Examine le code Delphi suivant qui montre comment créer un nouveau serveur STUN Delphi avec les identifiants long terme activés.
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 est le client qui implémente le protocole STUN et permet d'envoyer des requêtes binding aux serveurs STUN.
Les composants permettent d'utiliser UDP et TCP comme transport, et lorsqu'UDP est utilisé comme transport, ils implémentent un mécanisme de retransmission pour renvoyer les requêtes si la réponse n'arrive pas après un court délai.
Utilisation basique
Habituellement les serveurs stun tournent sur le port UDP 3478 et ne nécessitent pas d'authentification, donc pour envoyer une requête binding STUN, remplis les propriétés du serveur pour permettre au client de savoir où se connecter et gère les événements via lesquels le composant recevra la réponse du serveur.
Configure le serveur
- Host : l'IP ou le nom DNS du serveur, exemple : stun.sgcwebsockets.com
- Port : port d'écoute du serveur, exemple : 3478
Appelle la méthode SendRequest pour envoyer une requête binding au serveur STUN.
Gère les événements
- Si le serveur renvoie une réponse réussie, l'événement OnSTUNResponseSuccess sera appelé et tu peux accéder aux informations de Binding en lisant l'objet aBinding.
- Si le serveur renvoie une erreur, l'événement OnSTUNResponseError sera appelé et tu peux accéder au code d'erreur et à la raison en lisant l'objet 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;
});
