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

· コンポーネント

sgcWebSockets 4.5.2 から、sgcWebSockets ライブラリを使用して独自の STUN/TURN サーバーとクライアントを構築できます。

STUN

Session Traversal Utilities for NAT(STUN)はパブリックアドレスを検出し、ピアとの直接接続を妨げるルーターの制限を特定するためのプロトコルです。

クライアントはインターネット上の STUN サーバーにリクエストを送信し、サーバーはクライアントのパブリックアドレスとルーターの NAT 越しにアクセスできるかどうかを返信します。

TURN

NAT を使用する一部のルーターは「シンメトリック NAT」と呼ばれる制限を採用しています。これはルーターが以前に接続したピアからの接続のみを受け入れることを意味します。

Traversal Using Relays around NAT(TURN)は TURN サーバーとの接続を開き、そのサーバーを経由してすべての情報を中継することでシンメトリック NAT の制限を回避するものです。TURN サーバーとの接続を作成し、すべてのピアにサーバーへパケットを送信するよう伝え、それが転送されます。明らかにオーバーヘッドが伴うため、他の代替手段がない場合にのみ使用されます。


STUN/TURN サーバーの構築

STUN/TURN Delphi サーバーの作成は非常に簡単です。TsgcTURNServer を作成し、以下のプロパティを設定するだけです:

TURN クライアントがリクエストを送信した際にパスワードを設定するには OnSTUNRequestAuthorization イベントを処理してください。

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

STUN リクエストは認証不要で TURN リクエストは長期認証情報を必要とするサンプル設定を以下に示します。

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; 

STUN/TURN クライアントの構築

新しい Delphi STUN/TURN クライアントの作成はサーバーと同様に簡単です。TsgcTURNClient を作成し、以下のプロパティを設定するだけです:


IP アドレスの割り当て

TURN プロトコルは NAT 越しのピア間でデータを交換するためにリレー IP アドレスを使用できます。

TURN サーバーに新しいリレー IP アドレスを作成するには、クライアントがまず Allocate メソッドを呼び出す必要があります。このメソッドは TURN サーバーに新しいリレー IP アドレスの作成をリクエストします。TURN サーバーが新しいリレー IP アドレスを作成できる場合、クライアントは成功レスポンスを受け取ります。クライアントは割り当ての有効期限内に他のピアと通信できます。

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; 

有効期限が切れないように Refresh メソッドを使用してライフタイムを更新できます。Lifetime は有効期限までの秒数です。値がゼロの場合、割り当ては削除されます。

oTURN.Refresh(600); 

TURN サーバー

});

コンパイル済み TURN サーバー / クライアントデモ