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
- Port: a porta de escuta do servidor, exemplo: 3478
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
- Host: o IP ou nome DNS do servidor, exemplo: stun.sgcwebsockets.com
- Port: a porta de escuta do servidor, exemplo: 3478
Chame o método SendRequest para enviar uma requisição de binding ao servidor STUN.
Trate os eventos
- Se o servidor retornar uma resposta bem-sucedida, o evento OnSTUNResponseSuccess será chamado e você poderá acessar as informações de Binding lendo o objeto aBinding.
- Se o servidor retornar um erro, o evento OnSTUNResponseError será chamado e você poderá acessar o código e o motivo do erro lendo o objeto 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;
});
