Delphi STUN サーバー / クライアント

· コンポーネント

STUN(Session Traversal Utilities for NAT)は IP ネットワーク上のリアルタイム音声・映像に使用される IETF プロトコルです。STUN はサーバー・クライアントプロトコルであり、STUN サーバーは通常 UDP と TCP の両方でポート 3478 をリッスンします。

STUN プロトコルの主な目的は、NAT の背後で動作するデバイスが自分のパブリック IP アドレスと NAT の種類を把握できるようにすることです。

STUN は NAT 背後のピア間で通信するためのメカニズムを提供します。ピアは STUN サーバーにリクエストを送信して自分のパブリック IP アドレスとポートを確認します。クライアントからサーバーへ送信されるバインディングリクエストは、NAT が割り当てた IP とポートのバインディングを特定するために使用されます。STUN クライアントはバインディングリクエストを STUN サーバーに送信し、サーバーはクライアントが使用した送信元 IP とポートを検査してこの情報をクライアントに返します。

STUN サーバー

TsgcSTUNServerSTUN プロトコルを実装したサーバーであり、STUN クライアントからのバインディングリクエストを処理します。

STUN サーバーは認証あり/なしで設定でき、フィンガープリント属性の検証・代替サーバーの送信などに対応しています。

基本的な使い方

STUN サーバーは通常 UDP ポート 3478 で動作し認証を必要としません。STUN サーバーを設定するにはリスニングポート(デフォルト 3478)を設定してサーバーを起動します。

サーバーの設定

Active = True プロパティを設定して STUN サーバーを起動します。

新しい Delphi STUN サーバーを起動する方法を示す Delphi コードを以下に示します。

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

長期認証情報 

通常 STUN サーバーは認証なしで設定されており、すべての STUN クライアントが認証なしでバインディングリクエストを送信してサーバーから応答を受け取れます。

sgcWebSockets STUN サーバーは長期認証情報をサポートしており、長期認証情報を持つバインディングリクエストのみを許可するように TsgcSTUNServer を設定できます。

設定するには STUNOptions.Authorization プロパティにアクセスして有効にします。

次に LongTermCredentials プロパティにアクセスして有効にします。デフォルトでは、この認証タイプは Realm 文字列と StaleNonce のデフォルト値 10 分(600 秒)で設定済みです。

長期認証情報を有効にした新しい Delphi STUN サーバーの作成方法を示す Delphi コードを以下に示します。

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; 

STUN クライアント 

TsgcSTUNClientSTUN プロトコルを実装したクライアントであり、STUN サーバーへバインディングリクエストを送信します。

このコンポーネントはトランスポートとして UDPTCP を使用でき、UDP を使用する場合は応答が一定時間内に届かない場合にリクエストを再送する再送メカニズムを実装しています。

基本的な使い方

通常 STUN サーバーは UDP ポート 3478 で動作し認証を必要としません。STUN バインディングリクエストを送信するには、サーバープロパティを設定してクライアントに接続先を伝え、コンポーネントがサーバーからの応答を受け取るイベントを処理します。

サーバーの設定

メソッド SendRequest を呼び出して STUN サーバーにバインディングリクエストを送信します。

イベントの処理

新しい Delphi STUN クライアントを作成して STUN サーバーに接続する方法を示す Delphi コードを以下に示します。




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