

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 的 DDoS 保護 Amazon GameLift Servers
<a name="ddos-protection-intro"></a>

Amazon GameLift Servers 玩家閘道是以轉送為基礎的網路，可在 上託管的遊戲用戶端和遊戲伺服器之間路由 UDP 流量Amazon GameLift Servers。玩家閘道透過在流量到達遊戲伺服器之前驗證流量、對玩家流量進行速率限制、隱藏來自公有的遊戲伺服器 IP 地址，以及在轉送端點運作狀態不佳時提供更新的端點，來提供主動 DDoS 保護。此功能有助於保護您的遊戲伺服器免受體積攻擊，而可忽略增加的延遲。

玩家閘道需要在 Linux 型Amazon GameLift Servers受管 EC2 機群或容器機群上執行遊戲伺服器。您必須在機群建立期間啟用玩家閘道，並更新您的遊戲用戶端和遊戲後端，才能使用此功能。

## 主要優點
<a name="ddos-protection-intro-benefits"></a>

玩家閘道提供下列安全性和操作優勢：
+ **隱藏遊戲伺服器 IP 地址** – 遊戲用戶端透過轉送端點而不是直接連接到遊戲伺服器，從公有位置隱藏您的遊戲伺服器地址。
+ **驗證流量** – 透過玩家閘道的所有流量都需要玩家閘道字符，只允許來自已驗證玩家的流量到達您的遊戲伺服器。
+ **動態端點取代** – 當轉送端點運作狀態不佳時， 會Amazon GameLift Servers快速取代端點，並在下一次呼叫時提供更新的正常運作端點，以重新整理玩家連線詳細資訊。
+ **分佈玩家流量** – 轉送端點因玩家而異，減少單一運作狀態不佳轉送端點對相同遊戲工作階段內其他玩家的影響。

# 玩家閘道的運作方式
<a name="ddos-protection-howitworks"></a>

玩家閘道使用轉送網路，在遊戲用戶端和遊戲伺服器之間路由 UDP 流量。這可透過在流量到達遊戲伺服器之前驗證流量、對玩家流量進行速率限制、隱藏來自公有的遊戲伺服器 IP 地址，以及在轉送端點運作狀態不佳時提供更新的端點，來防範 DDoS 攻擊。

## 流量
<a name="ddos-protection-howitworks-traffic-flow"></a>

當玩家連線到遊戲工作階段時，您的遊戲後端會從 `GetPlayerConnectionDetails` API 擷取轉送端點和玩家閘道字符，並將其傳送至遊戲用戶端。遊戲用戶端會在玩家閘道字符前面加上 UDP 封包，並將封包傳送至轉送端點。轉送網路會驗證字符，並將合法流量路由到遊戲伺服器。在交付之前，轉送網路會分割玩家閘道字符，讓遊戲伺服器接收原始遊戲用戶端承載，且不需要變更程式碼。從遊戲伺服器返回遊戲用戶端的通訊會透過轉送網路傳回，無需修改。

![\[架構圖顯示透過轉送網路連線至遊戲伺服器的遊戲用戶端\]](http://docs.aws.amazon.com/zh_tw/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/zh_tw/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>

玩家閘道會將指標發佈至 Amazon CloudWatch，協助您監控網路流量模式、識別潛在的 DDoS 攻擊，以及追蹤轉送效能。指標包括封包和位元組輸入/輸出、限流流量和玩家工作階段。如需玩家閘道指標的完整清單，請參閱 [DDoS 保護 （玩家閘道） 指標](monitoring-cloudwatch.md#gamelift-metrics-fleet-playergateway)。

## IPv4 和 IPv6 相容性
<a name="ddos-protection-howitworks-ipv4-ipv6"></a>

遊戲用戶端使用 IPv4 進行通訊。玩家閘道使用 IPv6 與遊戲伺服器通訊。 會根據機群組態Amazon GameLift Servers自動處理 IPv4 和 IPv6 之間的轉譯。

如需在機群上設定玩家閘道的詳細資訊，請參閱 [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 型受管 EC2 機群和受管容器機群。
+ **伺服器 SDK** – 播放器閘道需要Amazon GameLift Servers伺服器 SDK 5.0 或更新版本。

## 玩家閘道模式
<a name="ddos-protection-enable-modes"></a>

使用 `PlayerGatewayMode` 屬性設定機群的玩家閘道相容性：

DISABLED （預設）  
機群與玩家閘道不相容。

ENABLED  
機群與支援的玩家閘道相容。不支援此功能的機群位置仍然可以新增至機群，但不會利用玩家閘道，直接使用遊戲伺服器 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。

DUAL\$1STACK  
您的遊戲伺服器與傳入 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 用量，請在單一 API 呼叫中批次處理多個玩家 IDs。

**重要**  
定期重新整理呼叫是將更新後的端點交付給玩家的主要機制。雖然玩家閘道字符至少保持 3 分鐘有效，但每 60 秒重新整理一次可確保玩家定期收到更新的端點。

## 用戶端整合
<a name="ddos-protection-integrate-client"></a>

您的遊戲用戶端必須在所有傳出 UDP 封包前面加上玩家閘道字符，並將封包傳送至提供的轉送端點。適用於 C\$1\$1 和 Unreal Engine 的Amazon GameLift Servers用戶端 SDK 提供公用程式來簡化此整合。

### 用戶端需求
<a name="ddos-protection-integrate-client-requirements"></a>

若要透過玩家閘道路由流量，您的遊戲用戶端必須：
+ **前綴玩家閘道字符** – 前綴玩家閘道字符到所有傳出 UDP 封包。玩家閘道字符不得加密，且必須出現在每個封包的開頭。沒有有效玩家閘道字符的封包將被捨棄。
+ **傳送至轉送端點** – 將所有 UDP 封包傳送至提供的轉送端點。
+ **維護連線活動** – 確保遊戲用戶端將封包傳送至遊戲伺服器，或遊戲伺服器將封包傳送至玩家，至少每 30 秒一次。此活動會透過轉送網路維持連線。
+ **處理端點更新** – 從後端接受更新的轉送端點和玩家閘道字符 （建議每 60 秒），並轉換到新的端點，而不捨棄連線。

### 用戶端 SDK
<a name="ddos-protection-integrate-client-sdk"></a>

適用於 C\$1\$1 和 Unreal Engine 的Amazon GameLift Servers用戶端 SDK 提供公用程式，可簡化玩家閘道整合：
+ **權杖管理** – 將玩家閘道權杖附加到所有傳出的 UDP 封包。
+ **端點選擇** – 使用可設定的演算法路由流量來轉送端點。
+ **端點重新整理** – 排程定期回呼，從後端擷取更新的轉送端點和玩家閘道字符。

### 端點選取演算法
<a name="ddos-protection-integrate-client-algorithms"></a>

用戶端 SDK 提供兩種內建演算法，用於選擇要使用的轉送端點：

備用演算法  
使用一個端點，直到運作狀態不佳，然後切換到另一個端點。最適合可接受短暫中斷的選單、大廳和輪換遊戲。在端點容錯移轉期間，封包可能會在設定的逾時期間內遺失 （預設值：2 秒）。

預測輪換演算法  
持續輪換所有可用的端點，並在故障發生之前預測故障。最適合即時遊戲，例如第一人稱射擊手和競賽遊戲，其中一致的封包交付至關重要。要求遊戲伺服器以一致的頻率傳送訊息。

您也可以擴展 SDK 的基礎演算法類別來實作自訂演算法。

### 用戶端 SDK 資源
<a name="ddos-protection-integrate-client-resources"></a>

如需完整的整合說明和範例程式碼，請參閱下列資源：

C\$1\$1  
適用於 C\$1\$1 的用戶端 SDK 可在適用於 [Amazon GameLift Servers C\$1\$1 的用戶端 SDK](https://github.com/amazon-gamelift/amazon-gamelift-servers-client-sdk-for-cpp) 取得。

虛擬引擎  
Unreal Engine 的外掛程式可在[Amazon GameLift Servers適用於 Unreal Engine 的用戶端 SDK](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 秒重新整理端點** – `GetPlayerConnectionDetails`每 60 秒呼叫一次，以確保玩家定期收到更新的端點。
+ **批次 API 呼叫** – `GetPlayerConnectionDetails`為同一遊戲工作階段中的多個玩家呼叫時，請將呼叫批次在一起，以減少 API 額外負荷。
+ **維護連線活動** – 確保至少每 30 秒在遊戲用戶端和遊戲伺服器之間流動一次流量。這可以是client-to-server或server-to-client流量。
+ **正常處理端點更新** – 當您的遊戲用戶端從後端接收更新後的端點時，請轉換至新的端點，而不會捨棄玩家的連線。
+ **選擇正確的演算法**：選取最符合您遊戲需求的端點選取演算法。針對輪換型遊戲使用備用演算法，針對即時遊戲使用預測輪換演算法。