Delphi STUN-server en -client

· Componenten

STUN (Session Traversal Utilitiies for NAT) is een IETF-protocol dat wordt gebruikt voor realtime audio en video in IP-netwerken. STUN is een server-client-protocol; een STUN-server draait meestal zowel op UDP als TCP en luistert op poort 3478.

Het belangrijkste doel van het STUN-protocol is een apparaat dat achter een NAT draait in staat te stellen zijn publieke IP en het type NAT te achterhalen.

STUN biedt een mechanisme om te communiceren tussen peers achter een NAT. De peers sturen een request naar een STUN-server om te achterhalen wat het publieke IP-adres en de poort zijn. De binding-requests die van client naar server worden gestuurd, worden gebruikt om de IP- en poort-bindings te bepalen die door NAT's zijn toegewezen. De STUN-client stuurt een binding-request naar de STUN-server, de server bekijkt het bron-IP en de bron-poort die de client gebruikt en stuurt deze informatie terug naar de client.

STUN-server

TsgcSTUNServer is de server die het STUN-protocol implementeert en het mogelijk maakt om binding-requests van STUN-clients te verwerken.

De STUN-server kan worden geconfigureerd met of zonder authenticatie, kan het fingerprint-attribuut verifiëren, een alternatieve server versturen en meer.

Standaardgebruik

Meestal draaien STUN-servers op UDP-poort 3478 en vereisen ze geen authenticatie. Om een STUN-server te configureren, stel je de luisterpoort in (standaard 3478) en start je de server.

Configureer de server

Zet de eigenschap Active = True om de STUN-server te starten.

Bekijk de volgende Delphi-code die laat zien hoe je een nieuwe Delphi STUN-server start.

oSTUN := TsgcSTUNServer.Create(nil);
oSTUN.Port := 3478;
oSTUN.Active := True;

Long-term-credentials 

Meestal worden STUN-servers geconfigureerd zonder authenticatie, zodat elke STUN-client een binding-request kan versturen en een antwoord van de server kan verwachten zonder authenticatie.

De sgcWebSockets STUN-server ondersteunt long-term-credentials, zodat je TsgcSTUNServer kunt configureren om alleen binding-requests met long-term-credential-info toe te staan.

Om dit te configureren, ga je naar de eigenschap STUNOptions.Authorization en schakel je deze in.

Ga vervolgens naar de eigenschap LongTermCredentials en schakel deze in. Dit type autorisatie is standaard al geconfigureerd met een Realm-string en met een standaard-StaleNonce-waarde van 10 minuten (= 600 seconden).

Bekijk de volgende Delphi-code die laat zien hoe je een nieuwe Delphi STUN-server maakt met long-credentials ingeschakeld.

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;

STUN-client 

 TsgcSTUNClient is de client die het STUN-protocol implementeert en het mogelijk maakt om binding-requests naar STUN-servers te versturen.

Het component biedt de mogelijkheid om UDP en TCP als transport te gebruiken. Bij gebruik van UDP als transport implementeert het een hertransmissie-mechanisme om requests opnieuw te versturen als het antwoord na korte tijd niet is binnengekomen.

Standaardgebruik

Meestal draaien STUN-servers op UDP-poort 3478 en vereisen ze geen authenticatie. Om een STUN-binding-request te versturen, vul je de server-eigenschappen in zodat de client weet waarmee hij verbinding moet maken, en handel je de events af waar het component het antwoord van de server ontvangt.

Configureer de server

Roep de methode SendRequest aan om een binding-request naar de STUN-server te sturen.

Handel de events af

Bekijk de volgende Delphi-code die laat zien hoe je een nieuwe Delphi STUN-client maakt en verbinding maakt met een STUN-server.




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;
});