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 を作成し、以下のプロパティを設定するだけです:
- Port:デフォルトは 3478 で、STUN/TURN プロトコルの一般的なポートです。
- STUNOptions:STUN オプションを設定します。通常 STUN リクエストは認証を使用しないため、デフォルト値のままにできます。
- TURNOptions:TURN オプションを設定します。通常 TURN サーバーは長期認証情報を必要とします(TURN は NAT 越しのピア間でデータを交換するためにリレーアドレスを使用し、高いリソースが必要なため)。ここでリレーアドレスの IP アドレスを設定します。TURNOptions.Allocation.RelayIP で設定してください。
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 を作成し、以下のプロパティを設定するだけです:
- Host:STUN/TURN サーバーが稼働している DNS 名または IP アドレス。
- Port:ポート番号。デフォルトは 3478。
- STUNOptions:STUN オプションを設定します。通常 STUN リクエストは認証を使用しないため、デフォルト値のままにできます。
- TURNOptions:TURN オプションを設定します。通常 TURN サーバーは長期認証情報を必要とします(TURN は NAT 越しのピア間でデータを交換するためにリレーアドレスを使用し、高いリソースが必要なため)。
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);
