Serwer i klient STUN dla Delphi

· Komponenty

STUN (Session Traversal Utilities for NAT) to protokół IETF używany do komunikacji audio-wideo w czasie rzeczywistym w sieciach IP. STUN jest protokołem klient-serwer; serwer STUN zwykle działa zarówno na UDP, jak i TCP i nasłuchuje na porcie 3478.

Głównym celem protokołu STUN jest umożliwienie urządzeniu działającemu za NAT odkrycia swojego publicznego adresu IP i typu NAT.

STUN zapewnia mechanizm komunikacji między partnerami za NAT. Partnerzy wysyłają żądanie do serwera STUN, aby poznać publiczny adres IP i port. Żądania bindowania wysyłane od klienta do serwera służą do określenia powiązań IP i portów alokowanych przez NAT. Klient STUN wysyła żądanie Binding do serwera STUN, serwer analizuje źródłowy adres IP i port używany przez klienta i zwraca te informacje klientowi.

STUN Server

TsgcSTUNServer to serwer implementujący protokół STUN umożliwiający przetwarzanie żądań bindowania od klientów STUN.

Serwer STUN można skonfigurować z uwierzytelnianiem lub bez, może weryfikować atrybut Fingerprint, wysyłać alternatywny serwer i wiele więcej.

Podstawowe użycie

Serwery STUN zazwyczaj działają na UDP porcie 3478 i nie wymagają uwierzytelniania, więc aby skonfigurować serwer STUN, ustaw port nasłuchiwania (domyślnie 3478) i uruchom serwer.

Konfiguracja serwera

Ustaw właściwość Active = True, aby uruchomić serwer STUN.

Sprawdź poniższy kod Delphi, który pokazuje jak uruchomić nowy serwer STUN w Delphi.

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

Długoterminowe poświadczenia 

Zazwyczaj serwery STUN są konfigurowane bez uwierzytelniania, więc każdy klient STUN może wysłać żądanie bindowania i oczekiwać odpowiedzi od serwera bez uwierzytelniania.

Serwer STUN w sgcWebSockets obsługuje długoterminowe poświadczenia, więc możesz skonfigurować TsgcSTUNServer tak, by zezwalał tylko na żądania bindowania z informacjami o długoterminowych poświadczeniach.

Aby to skonfigurować, przejdź do właściwości STUNOptions.Authorization i włącz ją.

Następnie przejdź do właściwości LongTermCredentials i włącz ją. Domyślnie ten typ autoryzacji jest już skonfigurowany z ciągiem Realm i domyślną wartością StaleNonce wynoszącą 10 minut (= 600 sekund).

Sprawdź poniższy kod Delphi, który pokazuje jak utworzyć nowy serwer STUN w Delphi z włączonymi długoterminowymi poświadczeniami.

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; 

Klient STUN 

 TsgcSTUNClient to klient implementujący protokół STUN umożliwiający wysyłanie żądań bindowania do serwerów STUN.

Komponent pozwala na korzystanie z UDP i TCP jako transportu; przy UDP implementuje mechanizm retransmisji ponownie wysyłający żądania, jeśli odpowiedź nie dotarła w krótkim czasie.

Podstawowe użycie

Serwery STUN zazwyczaj działają na UDP porcie 3478 i nie wymagają uwierzytelniania, więc aby wysłać żądanie bindowania STUN, wypełnij właściwości serwera i obsłuż zdarzenia, w których komponent odbierze odpowiedź od serwera.

Konfiguracja serwera

Wywołaj metodę SendRequest, aby wysłać żądanie bindowania do serwera STUN.

Obsługa zdarzeń

Sprawdź poniższy kod Delphi, który pokazuje jak utworzyć nowego klienta STUN w Delphi i połączyć się z serwerem 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;