Servidor y cliente STUN/TURN para Delphi

· Componentes

A partir de sgcWebSockets 4.5.2 puedes construir tu propio servidor y clientes STUN/TURN usando la librería sgcWebSockets.

STUN

Session Traversal Utilities for NAT (STUN) (acrónimo dentro de un acrónimo) es un protocolo para descubrir tu dirección pública y determinar cualquier restricción del router que impida una conexión directa con un peer.

El cliente enviará una petición a un servidor STUN en Internet, que responderá con la dirección pública del cliente e indicará si el cliente es accesible o no detrás del NAT del router.

TURN

Algunos routers que usan NAT aplican una restricción llamada 'Symmetric NAT'. Esto significa que el router sólo aceptará conexiones desde peers a los que te hayas conectado previamente.

Traversal Using Relays around NAT (TURN) está pensado para sortear la restricción de Symmetric NAT abriendo una conexión con un servidor TURN y retransmitiendo toda la información a través de ese servidor. Lo que se hace es crear una conexión con un servidor TURN y pedir a todos los peers que envíen los paquetes al servidor, que luego te los reenviará. Esto obviamente añade overhead, así que sólo se usa cuando no hay otras alternativas.


Build a STUN/TURN Server 

El proceso para crear un servidor STUN/TURN en Delphi es muy sencillo: basta con crear un TsgcTURNServer y configurar las siguientes propiedades:

Maneja el evento OnSTUNRequestAuthorization para asignar la contraseña cuando un cliente TURN envíe una petición.

Por último, pon la propiedad Active a True para arrancar el servidor.

A continuación tienes un ejemplo de configuración en el que las peticiones STUN no requieren autorización y las TURN sí requieren Long-Term credentials.

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; 

Build a STUN/TURN Client 

Crear un nuevo cliente STUN/TURN en Delphi es tan sencillo como crear un servidor. Basta con crear un TsgcTURNClient y configurar las siguientes propiedades:


Reservar dirección IP

El protocolo TURN permite usar una Relayed IP Address para intercambiar datos entre peers que están detrás de NATs.

Para crear una nueva Relayed IP Address en un servidor TURN, el cliente debe llamar primero al método Allocate. Este método envía una petición al servidor TURN para crear una nueva Relayed IP Address; si el servidor TURN puede crear una, el cliente recibirá una respuesta correcta. El cliente podrá comunicarse con otros peers durante el tiempo definido en el lifetime de la 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; 

El lifetime se puede actualizar para evitar que expire usando el método Refresh. El Lifetime es el número de segundos hasta la expiración. Si el valor es cero, la Allocation se eliminará.

oTURN.Refresh(600); 

Servidor TURN 

});

Demo compilada del servidor / cliente TURN