

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# による DDoS 保護 Amazon GameLift Servers
<a name="ddos-protection-intro"></a>

Amazon GameLift Servers プレイヤーゲートウェイは、 でホストされているゲームクライアントとゲームサーバー間で UDP トラフィックをルーティングするリレーベースのネットワークですAmazon GameLift Servers。プレイヤーゲートウェイは、ゲームサーバーに到達する前にトラフィックを検証し、プレイヤートラフィックをレート制限し、ゲームサーバーの IP アドレスをパブリックから非表示にして、リレーエンドポイントが異常になったときに更新されたエンドポイントを提供することで、プロアクティブ DDoS 保護を提供します。この機能は、わずかなレイテンシーでボリューム攻撃からゲームサーバーを保護するのに役立ちます。

プレイヤーゲートウェイでは、ゲームサーバーを Linux ベースの Amazon GameLift Servers Managed EC2 フリートまたはコンテナフリートで実行する必要があります。フリートの作成時にプレイヤーゲートウェイを有効にし、この機能を使用するにはゲームクライアントとゲームバックエンドを更新する必要があります。

## 主な利点
<a name="ddos-protection-intro-benefits"></a>

Player Gateway には、次のセキュリティと運用上の利点があります。
+ **ゲームサーバーの IP アドレスを非表示**にする – ゲームクライアントは、ゲームサーバーに直接接続するのではなくリレーエンドポイントを介して接続し、ゲームサーバーアドレスをパブリックから非表示にします。
+ **トラフィックの検証** – プレイヤーゲートウェイ経由のすべてのトラフィックにはプレイヤーゲートウェイトークンが必要で、認証されたプレイヤーからのトラフィックのみがゲームサーバーに到達できるようにします。
+ **動的エンドポイントの置き換え** — リレーエンドポイントが異常になると、 はエンドポイントAmazon GameLift Serversをすばやく置き換え、次の呼び出しで更新された正常なエンドポイントを提供してプレイヤー接続の詳細を更新します。
+ **プレイヤートラフィックを分散**する – リレーエンドポイントはプレイヤーによって異なり、同じゲームセッション内の他のプレイヤーに対する単一の異常なリレーエンドポイントの影響を軽減します。

# プレイヤーゲートウェイの仕組み
<a name="ddos-protection-howitworks"></a>

プレイヤーゲートウェイはリレーネットワークを使用して、ゲームクライアントとゲームサーバー間で UDP トラフィックをルーティングします。これにより、ゲームサーバーに到達する前にトラフィックを検証し、プレイヤートラフィックをレート制限し、ゲームサーバーの IP アドレスをパブリックから非表示にし、リレーエンドポイントが異常になったときに更新されたエンドポイントを提供することで、DDoS 攻撃から保護されます。

## トラフィックフロー
<a name="ddos-protection-howitworks-traffic-flow"></a>

プレイヤーがゲームセッションに接続すると、ゲームバックエンドは `GetPlayerConnectionDetails` API からリレーエンドポイントとプレイヤーゲートウェイトークンを取得し、ゲームクライアントに送信します。ゲームクライアントは、UDP パケットにプレイヤーゲートウェイトークンを付加し、パケットをリレーエンドポイントに送信します。リレーネットワークはトークンを検証し、正当なトラフィックをゲームサーバーにルーティングします。配信前に、リレーネットワークはプレイヤーゲートウェイトークンを削除して、ゲームサーバーが raw ゲームクライアントペイロードを受信し、コードの変更を必要としないようにします。ゲームサーバーからゲームクライアントへの通信は、リレーネットワークを介して変更なしで返されます。

![\[リレーネットワーク経由でゲームサーバーに接続するゲームクライアントを示すアーキテクチャ図\]](http://docs.aws.amazon.com/ja_jp/gameliftservers/latest/developerguide/images/player_gateway_architecture.png)


## 重要な概念
<a name="ddos-protection-howitworks-components"></a>

### リレーエンドポイント
<a name="ddos-protection-howitworks-endpoints"></a>

リレーエンドポイントは、ゲームクライアントがプレイヤーゲートウェイを介してトラフィックを送信するために使用する IP アドレスとポートの組み合わせです。各プレイヤーは、トラフィックを分散し、同じゲームセッション内の他のプレイヤーへの攻撃の影響を軽減するために、プレイヤー間で異なる複数のエンドポイントを受け取ります。

![\[同じゲームセッションで異なるリレーエンドポイントを受信する複数のプレイヤーを示す図\]](http://docs.aws.amazon.com/ja_jp/gameliftservers/latest/developerguide/images/player_gateway_relay_endpoints.png)


### プレイヤーゲートウェイトークン
<a name="ddos-protection-howitworks-tokens"></a>

プレイヤーゲートウェイトークンは、プレイヤーがプレイヤーゲートウェイを介してゲームセッションにトラフィックを送信することを許可する暗号化されたバイト配列です。`GetPlayerConnectionDetails` API は、base64 でエンコードされた文字列としてトークンを返します。ゲームクライアントは、すべての UDP パケットにプレイヤーゲートウェイトークンを付加する必要があります。リレーネットワークはトークンを検証し、トークンが無効または欠落しているパケットを拒否します。

**重要**  
プレイヤーゲートウェイトークンは暗号化してはならず、ゲームクライアントによって送信される各 UDP パケットの先頭に表示される必要があります。ゲームがペイロードを暗号化する場合は、ゲームデータを暗号化した後に、変更されていないプレイヤーゲートウェイトークンを付加します。

プレイヤーゲートウェイトークンは少なくとも 3 分間有効です。リレーエンドポイントが異常になったときにプレイヤーが更新されたエンドポイントを受信できるように、トークンを 60 秒ごとに更新することをお勧めします。

### GetPlayerConnectionDetails API
<a name="ddos-protection-howitworks-api"></a>

ゲームバックエンドは `GetPlayerConnectionDetails` API を呼び出して、ゲームセッションのプレイヤーの接続の詳細を取得します。API は、リレーエンドポイントとプレイヤーゲートウェイトークンを返すか、直接接続のためにゲームサーバーの IP アドレスとポートにフォールバックします。ゲームクライアントは、両方の接続タイプを処理するように設計されている必要があります。リレーエンドポイントが異常になったときに更新されたエンドポイントを受信するには、ゲームセッション全体でこの API を定期的に呼び出します (60 秒ごとに推奨）。

詳細については、「[GetPlayerConnectionDetails API](ddos-protection-integrate.md#ddos-protection-integrate-backend-api)」を参照してください。

## プレイヤーゲートウェイのモニタリング
<a name="ddos-protection-howitworks-monitoring"></a>

Player Gateway は Amazon CloudWatch にメトリクスを発行して、ネットワークトラフィックパターンのモニタリング、潜在的な DDoS 攻撃の特定、リレーパフォーマンスの追跡を支援します。メトリクスには、パケットとバイトの入出力、スロットリングされたトラフィック、プレイヤーセッションが含まれます。プレイヤーゲートウェイメトリクスの完全なリストについては、「」を参照してください[DDoS 保護 (プレイヤーゲートウェイ) メトリクス](monitoring-cloudwatch.md#gamelift-metrics-fleet-playergateway)。

## IPv4 と IPv6 の互換性
<a name="ddos-protection-howitworks-ipv4-ipv6"></a>

ゲームクライアントは IPv4 を使用して通信します。プレイヤーゲートウェイはIPv6 を使用してゲームサーバーと通信します。 は、フリート設定に基づいて IPv4 と IPv6 間の変換Amazon GameLift Serversを自動的に処理します。

フリートでプレイヤーゲートウェイを設定する方法の詳細については、「[CreateFleet](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_CreateFleet.html#gameliftservers-CreateFleet-request-PlayerGatewayMode)」または「[CreateContainerFleet](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_CreateContainerFleet.html#gameliftservers-CreateContainerFleet-request-PlayerGatewayMode)」を参照してください。IPv4 および IPv6 のサポートの詳細については、「」を参照してください[IPv4 と IPv6 の互換性](ddos-protection-enable.md#ddos-protection-enable-ip-protocol)。

# フリートでプレイヤーゲートウェイを有効にする
<a name="ddos-protection-enable"></a>

フリートの作成時にプレイヤーゲートウェイを有効にして、受信 UDP トラフィックを検証してゲームサーバーにレート制限するリレーエンドポイントを介してゲームトラフィックをルーティングします。

## 前提条件
<a name="ddos-protection-enable-prerequisites"></a>

プレイヤーゲートウェイを有効にする前に、次の要件を確認してください。
+ **サポートされているロケーション** – プレイヤーゲートウェイをサポートするロケーションのリスト AWS については、「」を参照してください[Amazon GameLift Servers サービスロケーション](gamelift-regions.md)。
+ **フリートタイプ** – プレイヤーゲートウェイは、Linux ベースの Managed EC2 フリートと Managed Container フリートをサポートします。
+ **Server SDK** – プレイヤーゲートウェイには Amazon GameLift Servers Server SDK 5.0 以降が必要です。

## プレイヤーゲートウェイモード
<a name="ddos-protection-enable-modes"></a>

`PlayerGatewayMode` プロパティを使用して、フリートのプレイヤーゲートウェイの互換性を設定します。

DISABLED (デフォルト)  
フリートはプレイヤーゲートウェイと互換性がありません。

有効  
フリートは、サポートされている場所でプレイヤーゲートウェイと互換性があります。この機能をサポートしていないフリートの場所は引き続きフリートに追加できますが、プレイヤーゲートウェイを利用せず、ゲームサーバーの IP アドレスを直接利用します。

REQUIRED  
フリートはプレイヤーゲートウェイと互換性があります。この機能をサポートしていないフリートロケーションをフリートに追加することはできません。

## IPv4 と IPv6 の互換性
<a name="ddos-protection-enable-ip-protocol"></a>

ゲームクライアントは IPv4 経由でプレイヤーゲートウェイと通信する必要があります。プレイヤーゲートウェイリレーネットワークは、IPv6 を使用してゲームサーバーと通信します。マネージドコンテナフリートは、IPv6 トラフィックを IPv4 に自動的に変換します。マネージド EC2 フリートの場合、 の `GameServerIpProtocolSupported`プロパティを使用して、フリートが IPv6 トラフィックを処理する方法を設定します`PlayerGatewayConfiguration`。

IPv4 (デフォルト)  
ゲームサーバーは受信 IPv4 トラフィックのみを受け入れます。軽量 IP 変換ソフトウェアがインスタンスにインストールされて実行され、受信 IPv6 トラフィックを受信して IPv4 に変換します。

デュアルスタック  
ゲームサーバーは受信 IPv6 トラフィックと互換性があります。IP 翻訳ソフトウェアはインスタンスにインストールまたは実行されません。IPv6 をネイティブにサポートするゲームサーバーは、パフォーマンスがわずかに向上する可能性があります。

# プレイヤーゲートウェイをゲームに統合する
<a name="ddos-protection-integrate"></a>

プレイヤーゲートウェイ対応フリートを作成したら、ゲームクライアントとゲームバックエンドを更新してプレイヤーゲートウェイと統合する必要があります。ゲームバックエンドはリレーエンドポイントとプレイヤーゲートウェイトークンを取得し、ゲームクライアントに提供します。ゲームクライアントは、すべての UDP トラフィックをこれらのリレーエンドポイントに送信します。

統合は次の呼び出しパスに従います。

1. ゲームバックエンドは `GetPlayerConnectionDetails` API を呼び出して、ゲームセッションの各プレイヤーのリレーエンドポイントとプレイヤーゲートウェイトークンを取得します。

1. ゲームバックエンドは、リレーエンドポイントとプレイヤーゲートウェイトークンをゲームクライアントに送信します。

1. ゲームクライアントは、すべての送信 UDP パケットにプレイヤーゲートウェイトークンを付加し、そのパケットをリレーエンドポイントに送信します。

1. リレーネットワークはプレイヤーゲートウェイトークンを検証し、トラフィックをゲームサーバーにルーティングします。

1. ゲームサーバーは、同じリレーパスを介してトラフィックをゲームクライアントに送り返します。

## バックエンド統合
<a name="ddos-protection-integrate-backend"></a>

ゲームバックエンドは `GetPlayerConnectionDetails` API を呼び出して、プレイヤーのリレーエンドポイントとプレイヤーゲートウェイトークンを取得する必要があります。その後、バックエンドはこの情報をゲームクライアントに提供します。

### GetPlayerConnectionDetails API
<a name="ddos-protection-integrate-backend-api"></a>

`GetPlayerConnectionDetails` API は、ゲームセッションのプレイヤーの接続の詳細を返します。

リレーエンドポイントとトークン  
プレイヤーゲートウェイが有効で、 ロケーションでサポートされている場合、 は以下を返します。  
+ **リレーエンドポイント** – プレイヤーによって異なる複数のリレーエンドポイント (IP アドレスとポート)
+ **プレイヤーゲートウェイトークン** – クライアントがすべての UDP パケットの前に付加する必要があるトークン (少なくとも 3 分間有効)
+ **有効期限** – プレイヤーゲートウェイトークンの有効期限タイムスタンプ

直接接続  
プレイヤーゲートウェイが ロケーションで有効になっていないか、サポートされていない場合、 はゲームサーバーの IP アドレスとポートを返します。

ゲームクライアントは、両方の接続タイプを処理するように設計されている必要があります。

API コールの例:

```
// C++ example using AWS SDK
Aws::GameLift::GameLiftClient client;
Aws::GameLift::Model::GetPlayerConnectionDetailsRequest request;
request.SetGameSessionId(gameSessionId);
request.SetPlayerIds(playerIds);  // Vector of player IDs

auto outcome = client.GetPlayerConnectionDetails(request);
if (outcome.IsSuccess()) {
    auto result = outcome.GetResult();
    auto connectionDetails = result.GetPlayerConnectionDetails();
    
    // Process each player's connection details
    for (const auto& detail : connectionDetails) {
        std::string playerId = detail.GetPlayerId();
        
        // Get relay endpoints (IP address and port)
        auto endpoints = detail.GetEndpoints();
        for (const auto& endpoint : endpoints) {
            std::string ipAddress = endpoint.GetIpAddress();
            int port = endpoint.GetPort();
        }
        
        // Get player gateway token
        auto token = detail.GetPlayerGatewayToken();
        
        // Get expiration time
        auto expiration = detail.GetExpiration();
        
        // Send endpoints and token to game client
    }
}
```

*Amazon GameLift Servers API リファレンス*の[GetPlayerConnectionDetails](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GetPlayerConnectionDetails.html)」を参照してください。

### リレーエンドポイントを更新する
<a name="ddos-protection-integrate-backend-refresh"></a>

リレーエンドポイントが異常になったときに`GetPlayerConnectionDetails`、定期的に を呼び出して更新されたエンドポイントをプレイヤーに提供します。ゲームセッションのすべてのプレイヤーに対して 60 秒ごとに API を呼び出すことをお勧めします。API の使用を最適化するには、1 回の API コールで複数のプレイヤー IDs をバッチ処理します。

**重要**  
定期的な更新呼び出しは、更新されたエンドポイントをプレイヤーに配信するための主要なメカニズムです。プレイヤーゲートウェイトークンは少なくとも 3 分間有効ですが、60 秒ごとに更新すると、プレイヤーは定期的に更新されたエンドポイントを受信します。

## クライアント統合
<a name="ddos-protection-integrate-client"></a>

ゲームクライアントは、すべての送信 UDP パケットにプレイヤーゲートウェイトークンを付加し、提供されたリレーエンドポイントにパケットを送信する必要があります。Amazon GameLift Servers クライアント SDK for C\$1\$1 および Unreal Engine は、この統合を簡素化するためのユーティリティを提供します。

### クライアント要件
<a name="ddos-protection-integrate-client-requirements"></a>

プレイヤーゲートウェイを介してトラフィックをルーティングするには、ゲームクライアントが以下を行う必要があります。
+ **プレイヤーゲートウェイトークンを準備 –** すべての送信 UDP パケットにプレイヤーゲートウェイトークンを準備します。プレイヤーゲートウェイトークンは暗号化してはならず、各パケットの先頭に表示される必要があります。有効なプレイヤーゲートウェイトークンがないパケットは削除されます。
+ **リレーエンドポイントに送信する** – すべての UDP パケットを指定されたリレーエンドポイントに送信します。
+ **接続アクティビティを維持する** – ゲームクライアントがゲームサーバーにパケットを送信するか、ゲームサーバーが少なくとも 30 秒に 1 回、プレイヤーにパケットを送信することを確認します。このアクティビティは、リレーネットワークを介した接続を維持します。
+ **エンドポイントの更新を処理する** – 更新されたリレーエンドポイントとプレイヤーゲートウェイトークンをバックエンドから受け入れ (60 秒ごとに推奨）、接続を中断せずに新しいエンドポイントに移行します。

### クライアント SDK
<a name="ddos-protection-integrate-client-sdk"></a>

Amazon GameLift Servers クライアント SDK for C\$1\$1 および Unreal Engine は、プレイヤーゲートウェイの統合を簡素化するユーティリティを提供します。
+ **トークン管理** – すべての送信 UDP パケットにプレイヤーゲートウェイトークンを付加します。
+ **エンドポイントの選択** — 設定可能なアルゴリズムを使用してトラフィックをリレーエンドポイントにルーティングします。
+ **エンドポイントの更新** – 定期的なコールバックをスケジュールして、更新されたリレーエンドポイントとプレイヤーゲートウェイトークンをバックエンドから取得します。

### エンドポイント選択アルゴリズム
<a name="ddos-protection-integrate-client-algorithms"></a>

クライアント SDK には、使用するリレーエンドポイントを選択するための 2 つの組み込みアルゴリズムが用意されています。

フォールバックアルゴリズム  
1 つのエンドポイントが異常になるまで使用し、別のエンドポイントに切り替えます。短時間の中断が許容されるメニュー、ロビー、ターンベースのゲームに最適です。エンドポイントのフェイルオーバー中に、設定されたタイムアウト期間 (デフォルト: 2 秒) パケットが失われる可能性があります。

予測ローテーションアルゴリズム  
利用可能なすべてのエンドポイントを継続的にローテーションし、障害が発生する前に障害を予測します。一貫したパケット配信が重要なファーストパーソンシューティングゲームやレースゲームなどのリアルタイムのゲームプレイに最適です。ゲームサーバーは、一貫した頻度でメッセージを送信する必要があります。

SDK のベースアルゴリズムクラスを拡張することで、カスタムアルゴリズムを実装することもできます。

### クライアント SDK リソース
<a name="ddos-protection-integrate-client-resources"></a>

完全な統合手順とサンプルコードについては、次のリソースを参照してください。

C\$1\$1  
クライアント SDK for C\$1\$1 は[Amazon GameLift Servers、クライアント SDK for C\$1\$1 ](https://github.com/amazon-gamelift/amazon-gamelift-servers-client-sdk-for-cpp)で利用できます。

Unreal Engine  
Unreal Engine 用プラグインは、[Amazon GameLift Serversクライアント SDK for Unreal Engine ](https://github.com/amazon-gamelift-for-unreal/amazon-gamelift-servers-client-sdk-for-unreal)で利用できます。アクセスには、GitHub の Epic Games 組織にメンバーシップが必要です。詳細については、[GitHub の「Unreal Engine](https://www.unrealengine.com/en-US/ue-on-github)」を参照してください。

## 統合をテストする
<a name="ddos-protection-integrate-testing"></a>

フリートにデプロイする前に、プレイヤーゲートウェイテストツールを使用してプレイヤーゲートウェイの統合をローカルでテストします。このツールは、プレイヤーゲートウェイ UDP プロキシインフラストラクチャをシミュレートし、ゲームクライアントがプレイヤーゲートウェイトークンの先頭を正しく付加し、複数のエンドポイントを介してトラフィックをルーティングし、ネットワークの低下を処理することを確認するのに役立ちます。

セットアップと使用方法については、GitHub の[プレイヤーゲートウェイテストアプリ](https://github.com/amazon-gamelift/amazon-gamelift-toolkit/tree/main/player-gateway-testing-app)を参照してください。

## ベストプラクティス
<a name="ddos-protection-integrate-best-practices"></a>

プレイヤーゲートウェイを統合するときは、次のベストプラクティスに従ってください。
+ **60 秒ごとにエンドポイントを更新する** – 60 秒`GetPlayerConnectionDetails`ごとに を呼び出して、プレイヤーが定期的に更新されたエンドポイントを受信できるようにします。
+ **バッチ API コール** – 同じゲームセッションで複数のプレイヤー`GetPlayerConnectionDetails`に対して を呼び出す場合は、呼び出しを一括して API オーバーヘッドを減らします。
+ **接続アクティビティを維持する** – ゲームクライアントとゲームサーバー間のトラフィックが少なくとも 30 秒に 1 回流れることを確認します。これは、client-to-serverトラフィックまたはserver-to-clientトラフィックのいずれかです。
+ **エンドポイントの更新を適切に処理**する – ゲームクライアントがバックエンドから更新されたエンドポイントを受け取ったら、プレイヤーの接続を切断せずに新しいエンドポイントに移行します。
+ **適切なアルゴリズムを選択する** – ゲームの要件に最も適したエンドポイント選択アルゴリズムを選択します。ターンベースのゲームにはフォールバックアルゴリズムを使用し、リアルタイムゲームには予測ローテーションアルゴリズムを使用します。