Ab sgcWebSockets 4.5.2 kannst du mit der sgcWebSockets-Bibliothek deinen eigenen STUN/TURN Server und Clients bauen.
STUN
Session Traversal Utilities for NAT (STUN) (Akronym innerhalb eines Akronyms) ist ein Protokoll, um deine öffentliche Adresse zu ermitteln und etwaige Einschränkungen in deinem Router festzustellen, die eine direkte Verbindung mit einem Peer verhindern würden.
Der Client sendet eine Anfrage an einen STUN-Server im Internet, der mit der öffentlichen Adresse des Clients antwortet und mitteilt, ob der Client hinter dem NAT des Routers erreichbar ist.
TURN
Manche Router mit NAT setzen eine Einschränkung namens 'Symmetric NAT' ein. Das bedeutet, dass der Router nur Verbindungen von Peers akzeptiert, mit denen du dich zuvor verbunden hast.
Traversal Using Relays around NAT (TURN) ist dazu gedacht, die Einschränkung des Symmetric NAT zu umgehen, indem eine Verbindung mit einem TURN-Server geöffnet und alle Informationen über diesen Server weitergeleitet werden. Du baust eine Verbindung mit einem TURN-Server auf und teilst allen Peers mit, Pakete an den Server zu senden, die dann an dich weitergeleitet werden. Dies bringt natürlich einen gewissen Overhead mit sich, weshalb es nur eingesetzt wird, wenn es keine anderen Alternativen gibt.
Einen STUN/TURN-Server bauen
Der Prozess zur Erstellung eines STUN/TURN Delphi Servers ist sehr einfach: erstelle einen TsgcTURNServer und konfiguriere die folgenden Eigenschaften:
- Port: standardmäßig 3478, der übliche Port für das STUN/TURN-Protokoll.
- STUNOptions: hier kannst du die STUN-Optionen konfigurieren. Normalerweise nutzen STUN-Anfragen keine Authentifizierung, daher kannst du die Standardwerte beibehalten.
- TURNOptions: hier kannst du die TURN-Optionen konfigurieren. In der Regel benötigen TURN-Server Long-Term-Credentials (weil TURN eine Relay-Adresse verwendet, um Daten zwischen Peers hinter NATs auszutauschen, was hohe Ressourcen erfordert). Hier kannst du die IP-Adresse der Relay-Adresse konfigurieren, setze sie in TURNOptions.Allocation.RelayIP.
Verarbeite das Ereignis OnSTUNRequestAuthorization, um das Passwort festzulegen, wenn ein TURN-Client eine Anfrage sendet.
Setze schließlich die Eigenschaft Active auf True, um den Server zu starten.
Unten findest du eine Beispielkonfiguration, in der STUN-Anfragen keine Autorisierung erfordern und TURN-Anfragen Long-Term-Credentials voraussetzen.
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;
Einen STUN/TURN-Client bauen
Einen neuen Delphi STUN/TURN-Client zu erstellen ist genauso einfach wie einen Server. Erstelle einfach einen TsgcTURNClient und konfiguriere die folgenden Eigenschaften:
- Host: der DNS-Name oder die IP-Adresse, unter der der STUN/TURN-Server läuft.
- Port: der Port, standardmäßig 3478.
- STUNOptions: hier kannst du die STUN-Optionen konfigurieren. Normalerweise nutzen STUN-Anfragen keine Authentifizierung, daher kannst du die Standardwerte beibehalten.
- TURNOptions: hier kannst du die TURN-Optionen konfigurieren. In der Regel benötigen TURN-Server Long-Term-Credentials (weil TURN eine Relay-Adresse verwendet, um Daten zwischen Peers hinter NATs auszutauschen, was hohe Ressourcen erfordert).
IP-Adresse zuweisen
Das TURN-Protokoll erlaubt die Verwendung einer Relayed-IP-Adresse, um Daten zwischen Peers auszutauschen, die hinter NATs liegen.
Um eine neue Relayed-IP-Adresse auf einem TURN-Server zu erstellen, muss der Client zuerst die Methode Allocate aufrufen. Diese Methode sendet eine Anfrage an den TURN-Server zur Erstellung einer neuen Relayed-IP-Adresse. Kann der TURN-Server eine neue Relayed-IP-Adresse erstellen, erhält der Client eine erfolgreiche Antwort. Der Client kann während der in der Lifetime der Allocation definierten Zeit mit anderen Peers kommunizieren.
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;
Die Lifetime kann mit der Methode Refresh aktualisiert werden, um ein Ablaufen zu vermeiden. Die Lifetime ist die Anzahl der Sekunden bis zum Ablauf. Ist der Wert null, wird die Allocation gelöscht.
oTURN.Refresh(600);
