Delphi TURN サーバー
Delphi で独自の TURN (RFC 8656) サーバーを運用できます。ピアツーピア経路を確立できないクライアントに対し、長期認証情報と割り当て単位のクォータを備えたリレーアドレスを提供します。
Delphi で独自の TURN (RFC 8656) サーバーを運用できます。ピアツーピア経路を確立できないクライアントに対し、長期認証情報と割り当て単位のクォータを備えたリレーアドレスを提供します。
セルフホスト型の TURN サーバーです — Allocate / CreatePermission / ChannelBind / Send / Refresh / Data を処理し、割り当てとその有効期間を管理し、長期認証情報を検証します。
TsgcTURNServer
Windows, macOS, Linux, iOS, Android
Enterprise
Port と、TURNOptions.Authentication.LongTermCredentials の realm を設定し、OnSTUNRequestAuthorization でユーザーごとのパスワードを返却して Active := True にします — これだけで、RFC 8656 準拠の任意のクライアントにリレーを割り当てるサーバーになります。
uses
sgcP2P, sgcP2P_STUN_Classes;
// TFormTURNServer は FServer: TsgcTURNServer とハンドラーを保持します
procedure TFormTURNServer.StartServer;
begin
FServer := TsgcTURNServer.Create(nil);
FServer.Port := 3478;
FServer.TURNOptions.Authentication.Enabled := True;
FServer.TURNOptions.Authentication.LongTermCredentials.Enabled := True;
FServer.TURNOptions.Authentication.LongTermCredentials.Realm :=
'turn.example.com';
// 悪用を抑制します: ユーザーごとの割り当て数と最大有効期間
FServer.TURNOptions.Allocation.MaxUserAllocations := 4;
FServer.TURNOptions.Allocation.MaxLifeTime := 3600;
FServer.OnSTUNRequestAuthorization := OnSTUNRequestAuthorization;
FServer.Active := True;
end;
procedure TFormTURNServer.OnSTUNRequestAuthorization(Sender: TObject;
const aRequest: TsgcSTUN_Message;
const aUsername, aRealm: string;
var Password: string);
begin
// そのユーザーのパスワードを返します。空文字はリクエストを拒否します
Password := LookupPassword(aUsername);
end;
// includes: sgcP2P.hpp, sgcP2P_STUN_Classes.hpp
TsgcTURNServer *Server = new TsgcTURNServer(this);
Server->Port = 3478;
Server->TURNOptions->Authentication->Enabled = true;
Server->TURNOptions->Authentication->LongTermCredentials->Enabled = true;
Server->TURNOptions->Authentication->LongTermCredentials->Realm = "turn.example.com";
Server->TURNOptions->Allocation->MaxUserAllocations = 4;
Server->OnSTUNRequestAuthorization = OnSTUNRequestAuthorization;
Server->Active = true;
セルフホスト型のリレーです。WebRTC や ICE のデプロイをサードパーティの TURN プロバイダーに依存させないようにできます。
REQUESTED-TRANSPORT 付きの Allocate リクエストを処理し、空きリレーポートを選択して有効期限を管理します。Refresh で割り当てを延長し、有効期限の到来時にサーバーが解放します。
割り当てごとのピア権限とチャネルバインディングを管理します。RFC 8656 §9 に基づき、権限のないピアからの Send/Data フレームは破棄します。
36 バイトの Send / Data エンベロープと 4 バイトの ChannelData フレームの両方に対応します。リレーは、リレー側トランスポートアドレスとバインド済みピアの間でデータグラムを転送します。
TURNOptions.Authentication.LongTermCredentials が realm を保持し、OnSTUNRequestAuthorization ではユーザー名とその realm が渡されるため、パスワードを返却するだけで済みます。サーバーは MESSAGE-INTEGRITY を検証し、nonce を自動的にローテーションします。
TURNOptions.Allocation.MaxUserAllocations は 1 ユーザーが取得できるリレー数を制限し、DefaultLifeTime と MaxLifeTime は各リレーの有効期間を制限し、MinPort / MaxPort / RelayIP はリレーの範囲を固定します。上限を超えたユーザーには 486 Allocation Quota Reached が返されます。
OnTURNBeforeAllocate では、リクエスト元のアドレスが var Reject とともに渡されます。OnTURNBeforeRelayIndication と OnTURNBeforeRelayChannelData は、リレーされる各データグラムに対して同じ役割を果たします。OnTURNCreateAllocation と OnTURNDeleteAllocation では、有効な割り当てを追跡できます。
コンポーネントリファレンスへのディープリンク、すぐに実行可能なデモプロジェクト、そして体験版のダウンロードはこちらです。
| オンラインヘルプ — TsgcTURNServer 本コンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。 | 開く | |
| デモプロジェクト — Demos\35.P2P\03.TURN すぐに実行可能なサンプルプロジェクトです。sgcWebSockets パッケージに同梱されています。下記より体験版をダウンロードしてください。 | 開く | |
| 技術ドキュメント (PDF) 本コンポーネントのみを対象とした機能解説、クイックスタート、Delphi および C++ Builder のコードサンプル、一次資料への参照を収録しています。 | 開く | |
| ユーザーマニュアル (PDF) ライブラリ内のすべてのコンポーネントを網羅した総合マニュアルです。 | 開く |
Delphi および C++ Builder でセルフホスト型 TURN リレーを運用することに関するよくある質問です。
TsgcTURNServer コンポーネントを配置し、Port と Realm を設定し、OnSTUNRequestAuthorization イベントからユーザーごとのパスワードを提供してから、Active := True を設定します。すると、サーバーは任意の RFC 8656 クライアントに対して Allocate、CreatePermission、ChannelBind、Send、Refresh、Data を処理し、リレー転送アドレスとバインドされたピアの間でデータグラムを中継します。TsgcTURNServer は、ご自身の Delphi または C++ Builder アプリケーションに組み込めるセルフホスト型リレーなので、WebRTC や ICE の環境がサードパーティの TURN プロバイダーや別途の coturn インストールに依存する必要がなくなります。割り当て単位のクォータ(ユーザーごとの最大割り当て数、帯域幅、ライフタイム)で乱用を制限し、OnQuotaExceeded が拒否を報告します。