Servidor e Cliente STUN para Delphi

· Componentes

STUN (Session Traversal Utilities for NAT) é um protocolo da IETF usado para áudio e vídeo em tempo real em redes IP. O STUN é um protocolo servidor-cliente; um servidor STUN normalmente opera tanto em UDP quanto em TCP e escuta na porta 3478.

O principal objetivo do protocolo STUN é permitir que um dispositivo rodando atrás de um NAT descubra seu IP público e qual é o tipo de NAT.

O STUN fornece um mecanismo para comunicação entre pares atrás de um NAT. Os pares enviam uma requisição a um servidor STUN para saber qual é o endereço IP público e a porta. As requisições de binding enviadas do cliente para o servidor são usadas para determinar os bindings de IP e portas alocados pelos NATs. O cliente STUN envia uma requisição Binding ao servidor STUN, o servidor examina o IP e a porta de origem usados pelo cliente e retorna essa informação ao cliente.

Servidor STUN

TsgcSTUNServer é o servidor que implementa o protocolo STUN e permite processar requisições de binding de clientes STUN.

O servidor STUN pode ser configurado com ou sem autenticação, pode verificar o atributo Fingerprint, enviar um servidor alternativo e mais.

Uso básico

Normalmente, servidores stun rodam na porta UDP 3478 e não exigem autenticação, então, para configurar um servidor STUN, defina a porta de escuta (por padrão 3478) e inicie o servidor.

Configure o servidor

Defina a propriedade Active = True para iniciar o servidor STUN.

Verifique o código Delphi a seguir que mostra como iniciar um novo Servidor STUN em Delphi.

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

Long-Term Credentials 

Normalmente, os servidores STUN são configurados sem autenticação, então qualquer cliente STUN pode enviar uma requisição de binding e esperar uma resposta do servidor sem autenticação.

O Servidor STUN do sgcWebSockets suporta Long-Term Credentials, então você pode configurar o TsgcSTUNServer para permitir apenas requisições de binding com informações de credenciais Long-Term.

Para configurá-lo, acesse a propriedade STUNOptions.Authorization e habilite-a.

Em seguida, acesse a propriedade LongTermCredentials e habilite-a. Por padrão, esse tipo de autorização já vem configurado com uma string Realm e com um valor padrão de StaleNonce de 10 minutos (= 600 segundos).

Verifique o código Delphi a seguir que mostra como criar um novo Servidor STUN em Delphi com Long-Credentials habilitadas.

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;

Cliente STUN 

 TsgcSTUNClient é o cliente que implementa o protocolo STUN e permite enviar requisições de binding a servidores STUN.

Os componentes permitem usar UDP e TCP como transporte e, quando usado UDP como transporte, implementam um mecanismo de retransmissão para reenviar requisições se a resposta não chegar após um pequeno tempo.

Uso básico

Normalmente, servidores stun rodam na porta UDP 3478 e não exigem autenticação, então, para enviar uma requisição de binding STUN, preencha as propriedades do servidor para permitir que o cliente saiba onde se conectar e trate os eventos onde o componente receberá a resposta do servidor.

Configure o servidor

Chame o método SendRequest para enviar uma requisição de binding ao servidor STUN.

Trate os eventos

Verifique o código Delphi a seguir que mostra como criar um novo Cliente STUN em Delphi e se conectar a um Servidor STUN.




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