
シェア:
Rafay is a Senior Software Engineer at Vonage, working on the Video Media team within the API Engineering department. He focuses on building and maintaining the mission-critical infrastructure that powers real-time video communication at scale, from session lifecycle management and signalling protocols to AI-powered integrations and developer tooling.
中国向けリレーの提供終了:Vonage Video API を使って独自のリレーを構築しよう
所要時間:2 分
注: 本ガイドは、以前「China Relay」を利用していたVonage Video APIのお客様、または中国本土のユーザーにサービスを提供しようとしているすべてのお客様を対象としています。
背景
China Relayのサービス終了は一つの転換点であると同時に、より優れた未来への扉を開くものでもあります。それは、リレーインフラを完全に自社で所有・管理できるようになることです。 サードパーティのマネージドサービスに依存するのではなく、完全に自社独自のソリューションを構築できるようになりました。これにより、コンプライアンス状況を直接把握できるほか、中国の法規制要件の変化に応じて柔軟に対応することが可能になります。本ガイドでは、Vonage Video APIのプラットフォーム機能を活用して、その具体的な手順を詳しく解説します。
Vonageの「China Relay」機能は、中国本土(AWS北京リージョン)でホストされるマネージドリレーインフラストラクチャを提供し、顧客が中国のネットワーク境界内にあるエンドユーザーにサービスを提供できるよう支援しました。 この機能は、Lambda@Edgeによる地理位置検出レイヤー、APIシグナリング用のWebSocketプロキシ、およびメディアリレー用のTURN(Traversal Using Relays around NAT)サーバーという3つのコンポーネントで構成されていました。これら3つすべてがAWS中国内にデプロイされ、 nexmoproxy.cn ドメインの下で運用されていました。
「China Relay」は2026年第2四半期にサポート終了を迎え、販売が完全に終了しました。
この記事では、Vonage Video APIをご利用のお客様が、Vonageのプラットフォーム機能(具体的には「Configurable TURN」および「IP Proxy」)と、中国国内でホストされている自社インフラを組み合わせて、同等のリレーソリューションを合法的に構築・運用する方法について解説します。
中国向けに特別な設定が必要な理由
中国の要件を理解することで、主導権を握ることができます。ユーザーのために、規制を完全に遵守した高品質な体験を構築するために知っておくべきことは、以下の通りです。
インターネットに公開されるすべてのサービスは、有効なインターネット通信事業者(ICP)免許を取得していなければなりません。
国際的なクラウドインフラとの間のトラフィックは、「グレート・ファイアウォール」によって厳重にフィルタリングされているため、WebRTCのメディアストリームにおいて高いパケットロスと遅延が発生している。
適切なライセンスがない限り、中国のユーザーのトラフィックを海外のサーバーを経由させることは法的に認められていません。
標準的なWebRTCシグナリング(Vonage APIサーバーへのWebSocket接続)およびメディア(TURNリレー)の両方が影響を受けるため、中国国内でホストされているローカルプロキシを経由してルーティングする必要があります。なお、このプロキシは到達性を向上させるためのローカルホップとして機能します。 シグナリングトラフィックは、最終的には中国国外を経由してVonageのグローバルインフラストラクチャに到達することになり、ローカルでの終端が保証されるわけではありません。
朗報です。Vonage Video API は、このインフラストラクチャを自社で所有・管理するための適切な基本機能を提供しており、完全な透明性、柔軟性、そして長期的なコンプライアンスへの確信をもたらします。
代替アーキテクチャ
中国にあるVonageが管理する中継サーバーに依存する代わりに、以下のコンポーネントを使用して独自の中継層を構築することができます:
コンポーネント | 機能について | 提供元は? |
設定可能なTURN | Vonage Video SDK を、Vonage のグローバル TURN サーバー群ではなく、中国国内でホストされている独自の TURN サーバーに設定します。 | VonageのアドオンAPI機能 |
IPプロキシ | API呼び出し、WebSocket接続、ロギングなど、Vonage Video APIのすべてのシグナリングトラフィックを、中国国内のプロキシサーバーを経由してルーティングします。 | VonageのアドオンAPI機能 |
中国のクラウドインフラ | 中国国内でTURNサーバーとプロキシをホストし、トラフィックを規制の範囲内に収めるのに役立ちます。 | Alibaba Cloud、Tencent Cloud、Huawei Cloudなどのプロバイダーをご利用のお客様 |
ICPライセンス | 中国本土においてインターネットに接続するサービスを合法的に運営するには、中国の法律によりこれが義務付けられています。 | 貴殿が、中国の関連当局から入手した |
注: 「Configurable TURN」と「IP Proxy」はどちらも、Vonageアカウントで有効化が必要な追加機能です。これらの機能を有効にするには、VonageのAccount担当者にお問い合わせください。
ステップバイステップガイド
ステップ1:ICPライセンスの取得
何よりもまず、中国政府から必要な許可証を取得する必要があります:
ICP届出(备案/Beian): 中国国内からアクセス可能なウェブサイトやApplicationsには必須です。通常、中国のクラウドプロバイダーを通じて取得します。
ICPライセンス(許可証): リアルタイム通信を含む付加価値型インターネットサービスの提供に必要です。これは、Vonageが「China Relay」について取得・維持できなかったライセンスです。
重要: ICPライセンスを取得できるのは、中国に法人格を有する事業体、または認可を受けた現地のパートナーを有する事業体のみです。中国の電気通信法に精通した現地の法律パートナーを起用することを強くお勧めします。
⚠ 有効なICPライセンスがない場合、中国国内でリレーやプロキシを運用することは法令に違反します。
ステップ 2:中国で TURN サーバーをプロビジョニングする
以下の手順に従って、お好みの中国のクラウドプロバイダーにTURNサーバーをデプロイしてください:
中国本土内にデータセンターを保有するクラウドプロバイダー(例:アリババクラウド、テンセントクラウド、ファーウェイクラウドなど)を選択してください。
TURNサーバーを展開します。オープンソースの coturn サーバーは、広く利用されており、サポート体制も充実した選択肢です。
サーバーが中国国内で安定したパブリックIPアドレスを持ち、ICPライセンスに基づいて登録されたドメインを保有していることを確認してください。
TURNサーバーを、適切な認証情報とセキュリティ設定で構成してください(TLSの使用を強く推奨します)。
TURNサーバーでは、以下のポートを開放する必要があります:
UDP/TCP 3478(標準TURN)
TCP 443(TLS 上の TURN、グレート・ファイアウォールとの互換性のために推奨)
ヒント: 中国の複数のISP(チャイナテレコム、チャイナユニコム、チャイナモバイル)からTURNサーバーへの到達性を確認してください。プロバイダーによってパフォーマンスや到達性に大きな差が生じる場合があります。
ステップ 3: 設定可能な TURN を使用して Vonage Video API を設定する
Vonageの「Configurable TURN」機能を使用すると、セッションや接続に対するデフォルトのTURNサーバーの割り当てを上書きし、 クライアント側の SDKを、Vonageのグローバルサーバー群ではなく、中国にある独自のTURNサーバーに向けることができます。
注: Configurable TURN は、 クライアントSDKで設定され、サーバーSDKでは設定されません。以下の例は、サポートされているすべてのクライアントプラットフォームを対象としています。
クライアント側のVonage Video SDKでセッションを初期化する際、以下の設定を渡してください。 YOUR_TURN_SERVER_HOSTNAME、 YOUR_TURN_USERNAME、および YOUR_TURN_CREDENTIAL を、TURNサーバーの設定値に置き換えてください。
JavaScript (OpenTok.js)
const session = OT.initSession(API_KEY, SESSION_ID, {
iceConfig: {
includeServers: 'custom',
transportPolicy: 'relay',
customServers: [
{
urls: ['turns:YOUR_TURN_SERVER_HOSTNAME:443?transport=tcp'],
username: 'YOUR_TURN_USERNAME',
credential: 'YOUR_TURN_CREDENTIAL'
}
]
}
}); アンドロイドSDK
List<IceServer> serverList = new IceServer(
"turns:YOUR_TURN_SERVER_HOSTNAME:443?transport=tcp", // TURN server URL
"YOUR_TURN_USERNAME", // Username
"YOUR_TURN_CREDENTIAL" // Credential
);
mSession = new Session.Builder(this, API_KEY, SESSION_ID)
.setCustomIceServers(serverList, IncludeServers.Custom)
.setIceRouting(TransportPolicy.TURN)
.build();
mSession.setSessionListener(this);
mSession.connect(token); iOS SDK
OTSessionICEConfig *myICEServerConfiguration = [[OTSessionICEConfig alloc] init];
myICEServerConfiguration.includeServers = OTSessionICEIncludeServersCustom;
myICEServerConfiguration.transportPolicy = OTSessionICETransportForceTurn;
NSError *error = nil;
[myICEServerConfiguration addICEServerWithURL:@"turns:YOUR_TURN_SERVER_HOSTNAME:443?transport=tcp"
userName:@"YOUR_TURN_USERNAME"
credential:@"YOUR_TURN_CREDENTIAL"
error:&error];
OTSessionSettings *settings = [[OTSessionSettings alloc] init];
settings.iceConfig = myICEServerConfiguration;
_session = [[OTSession alloc] initWithApiKey:kApiKey
sessionId:kSessionId
delegate:self
settings:settings]; Windows SDK
List<IceServer> iceServers = new List<IceServer>() {
new IceServer(
"turns:YOUR_TURN_SERVER_HOSTNAME:443?transport=tcp", "YOUR_TURN_USERNAME", "YOUR_TURN_CREDENTIAL"
)
};
IceConfig iceConfig = new IceConfig(
iceServers,
ICETransport.Relayed,
ICEIncludeServers.Custom
);
session = new Session.Builder(context, API_KEY, SESSION_ID){
IceConfig = iceConfig
}.Build(); Linux / macOS SDK
// Provide the ICE configuration here.
struct otc_custom_ice_config ice_config;
ice_config.num_ice_servers = 1;
ice_config.ice_url = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_url[0] = strdup("turns:YOUR_TURN_SERVER_HOSTNAME:443?transport=tcp");
ice_config.ice_user = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_user[0] = strdup("YOUR_TURN_USERNAME");
ice_config.ice_credential = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_credential[0] = strdup("YOUR_TURN_CREDENTIAL");
ice_config.force_turn = OTC_TRUE;
ice_config.use_custom_turn_only = OTC_TRUE;
otc_session_settings *session_settings = otc_session_settings_new();
if (session_settings != NULL) {
otc_session_settings_set_custom_ice_config(session_settings, &ice_config);
}
otc_session *session = otc_session_new_with_settings(API_KEY,
SESSION_ID,
&session_callbacks,
session_settings);
if (session == NULL) {
printf("Could not create session successfully");
return EXIT_FAILURE;
}
otc_session_connect(session, TOKEN); React Native SDK
<OTSession
applicationId="your-application-id"
sessionId="your-session-id"
token="your-session-token"
options={{
iceConfig: {
includeServers: 'custom',
transportPolicy: 'relay',
customServers: [
{
urls: [
'turns:YOUR_TURN_SERVER_HOSTNAME:443?transport=tcp'
],
username: 'YOUR_TURN_USERNAME',
credential: 'YOUR_TURN_CREDENTIAL'
}
]
}
}}
>
<OTPublisher/>
<OTSubscriber/>
</OTSession> 以下のドキュメントを参照してください。 Vonage Video API の設定可能な TURN に関するドキュメント を参照してください。
ステップ 4: API シグナリングトラフィックを IP プロキシ経由でルーティングする
デフォルトでは、Vonage Video APIのクライアントは、Vonageのグローバルシグナリングインフラストラクチャ(API呼び出し、WebSocket接続、およびロギングトラフィック)に接続しますが、これらは中国のファイアウォールによってブロックされたり、大幅に帯域制限されたりする可能性があります。
IPプロキシを使用して、メディア以外のすべてのシグナリングトラフィックを、中国国内にある自らが管理するサーバー経由でルーティングします。
注: IPプロキシは、メディアストリームを除くすべてのトラフィックをルーティングします。メディアストリームは、Configurable TURN(ステップ3)によって個別に処理されます。中国規制に完全に準拠した設定を行うには、両方の機能が必要です。
IPプロキシを設定するには、以下の手順に従ってください:
中国のクラウドインフラストラクチャ上に、HTTP/WebSocketリバースプロキシを展開します。これは、TURNサーバーと同じホスト上で実行することも、別のホスト上で実行することも可能です。
軽量なリバースプロキシで十分です。 プロキシサーバーの実装例を を参考にしてください。
Vonageの承認済みクライアントのみがアクセスできるよう、プロキシのセキュリティを確保してください(ファイアウォールルール、トークンベースの認証など)。
以下のプラットフォーム固有のスニペットを使用して、すべての API 呼び出しおよび WebSocket 接続でプロキシを使用するように Vonage Video SDK を設定してください。
各スニペット内の YOUR_CHINA_PROXY_URL 各スニペット内の「in」を、デプロイ済みのプロキシサーバーのURLに置き換えてください。
JavaScript (OpenTok.js)
他のVonageの手順を行う前に、まずこれを呼び出してください。
// Must be called before any other Vonage methods
OT.setProxyUrl('YOUR_CHINA_PROXY_URL'); アンドロイドSDK
セッションを構築する際に、プロキシURLを渡してください。
mSession = new Session.Builder(context, API_KEY, SESSION_ID)
.setProxyUrl("YOUR_CHINA_PROXY_URL")
.build(); iOS SDK
セッション設定オブジェクトでプロキシURLを設定してください。
OTSessionSettings *settings = [[OTSessionSettings alloc] init];
settings.proxyURL = @"YOUR_CHINA_PROXY_URL";
session = [[OTSession alloc] initWithApiKey:kApiKey
sessionId:kSessionId
delegate:self
settings:settings]; Windows SDK
セッションビルダーでプロキシURLを設定してください。
Session = new Session.Builder(Context.Instance, API_KEY, SESSION_ID) {
ProxyUrl = "YOUR_CHINA_PROXY_URL"
}.Build(); Linux / macOS SDK
セッション設定でプロキシURLを設定してください。
otc_session_settings_set_proxy_url(session_settings, "YOUR_CHINA_PROXY_URL");
otc_session *session = otc_session_new_with_settings(API_KEY, SESSION_ID,
&session_callbacks, session_settings); React Native SDK
セッションオプションのプロパティにプロキシURLを渡してください。
<OTSession
apiKey="your-api-key"
sessionId="your-session-id"
token="your-session-token"
options={{
proxyUrl: 'YOUR_CHINA_PROXY_URL',
}}
>
<OTPublisher/>
<OTSubscriber/>
</OTSession> 以下のドキュメントを参照してください。 Vonage Video API IP プロキシのドキュメント をご覧ください。
ステップ 5:設定の確認
本番稼働前に、以下のチェックリストを用いて設定をエンドツーエンドで検証してください:
WebRTCの統計情報を使用して、すべてのメディアがTURNサーバーを経由して中継されていることをVerifyしてください(
candidateType === "relay")。
プロキシサーバーのログを監視し、シグナリングトラフィックがIPプロキシを経由して流れていることをVerifyしてください。
TURNサーバーのログを監視し、認証およびリレーの動作を確認してください。
パフォーマンスには大きなばらつきが生じる可能性があるため、さまざまなISP(チャイナテレコム、チャイナユニコム、チャイナモバイル)でテストを行ってください。
モバイル(iOS/Android)およびデスクトップ(Web)の両方のクライアントでテストを行ってください。
概要
「China Relay」の提供終了に伴い、お客様は、インフラを完全に制御し、変化し続ける中国の規制環境に先んじて対応できる、完全に自己管理型のコンプライアンスに準拠したリレーソリューションを構築する機会を得ることができます。 今後の道筋としては、中国のクラウドインフラ上で独自のTURNリレーおよびシグナリングプロキシを運用し、Vonageの「Configurable TURN」および「IP Proxy」機能を利用して、これらをVonage Video APIに接続することが挙げられます。
「チャイナ・リレー」が行ったこと | 今、あなたがすべきこと |
Vonageは中国でTURNサーバーを運用していた | Alibaba Cloud、Tencent Cloud、またはこれらと同様のプラットフォーム上でTURNを展開します。 |
Vonageによる管理型リレールーティング | Configurable TURN を使用して、TURN エンドポイントと Vonage Video API を設定します。 |
VonageによるAPIシグナリングのルーティング処理 | IPプロキシをデプロイし、SDKを設定します |
VonageはICPライセンスを保有していた(取得を試みた) | ご自身でICPライセンスを取得します |
Vonage はこのドメイン(nexmoproxy.cn)を管理していました | ご自身で.cnドメインを登録・管理できます |
TURNサーバーとIPプロキシが稼働し始めれば、中国本土のユーザー向けに、規格に完全準拠した自己管理型のリレーソリューションが利用可能になります。
リソース
ご質問がある場合、またはあなたが作っているものを共有したい場合は、こちらをクリックしてください。
登録する 開発者ニュースレター
フォローする X(旧ツイッター)最新情報
Videoの方がいいですか? 当社の YouTubeチャンネルでチュートリアルをご覧ください
LinkedInの LinkedIn の Vonage デベロッパーページ
開発者体験の向上にご協力ください。以下の 「開発者の声」フィードバックにご協力ください
最新の開発者向けニュース、ヒント、イベント情報をお届けします。
シェア:
Rafay is a Senior Software Engineer at Vonage, working on the Video Media team within the API Engineering department. He focuses on building and maintaining the mission-critical infrastructure that powers real-time video communication at scale, from session lifecycle management and signalling protocols to AI-powered integrations and developer tooling.