Kembali ke Blog

Mengapa Dedicated Servers Anda Freezing: Realitas Unreal Engine Server DDoS Protection

Diterbitkan pada 8 April 2026
Mengapa Dedicated Servers Anda Freezing: Realitas Unreal Engine Server DDoS Protection

Setiap pengembang game Multiplayer takut akan pembekuan server yang tiba-tiba dan tidak dapat dijelaskan. Instance khusus Anda berjalan mulus pada Tick rate 30 yang stabil, dan kemudian, tanpa peringatan, seluruh simulasi terhenti. Pemain mengalami Rubber-banding di seluruh peta, RPCs terputus, dan beberapa saat kemudian, Connection timeout yang fatal mengakhiri pertandingan. Anda mungkin secara insting menyalahkan kode Movement replication terbaru Anda atau perhitungan fisika yang kompleks, tetapi jika basis pemain Anda berkembang, kenyataannya seringkali jauh lebih berbahaya: infrastruktur Anda adalah korban dari serangan Distributed Denial of Service (DDoS) yang terkoordinasi.

Laporan terbaru dari komunitas pengembang Unreal Engine menyoroti lonjakan besar dalam serangan DDoS terorganisir yang menargetkan server game, terutama memengaruhi mode skala besar seperti Battle Royale dan instance Creative khusus. Serangan-serangan ini sepenuhnya membanjiri Network processing thread server, yang mengakibatkan Lag parah, desinkronisasi global, dan pada akhirnya, Hard crashes.

Bagi pengembang Indie dan studio AA, menerapkan perlindungan Unreal Engine Server DDoS Protection yang kuat bukan lagi opsional—ini adalah persyaratan wajib untuk game Live-ops apa pun. Dalam rincian teknis ini, kita akan menganalisis bagaimana serangan-serangan ini memanipulasi Netcode Unreal Engine, cara membedakan flood berbahaya dari kondisi jaringan buruk standar, dan langkah-langkah konkret yang dapat Anda ambil untuk memperkuat infrastruktur game Anda.

Anatomi Crash Server Unreal Engine

Untuk memahami cara melindungi server Anda, pertama-tama Anda perlu memahami bagaimana Unreal Engine memproses lalu lintas jaringan yang masuk. Unreal menggunakan protokol berbasis UDP khusus yang dikelola oleh NetDriver. Karena UDP tidak memerlukan koneksi, klien mana pun di internet dapat mengirim paket ke port terbuka server Anda tanpa Handshake formal.

Serangan Volumetric Layer 4 vs. Serangan Aplikasi Layer 7

Sebagian besar crash server disebabkan oleh salah satu dari dua jenis serangan jaringan:

1. Volumetric UDP Floods (Layer 4): Ini adalah serangan brute-force. Sebuah Botnet membombardir alamat IP publik dan port server Anda dengan gigabyte paket UDP sampah per detik. Kartu antarmuka jaringan (NIC) server dan Network stack sistem operasi menjadi sepenuhnya jenuh. Sebelum Unreal Engine sempat melihat paket-paket tersebut, mesin yang mendasarinya kehabisan Bandwidth atau interupsi CPU (CPU interrupts) menjadi terlalu tinggi, membuang lalu lintas pemain yang sah sepenuhnya.

2. Application-Layer Exhaustion (Layer 7): Serangan-serangan ini jauh lebih berbahaya. Bukannya mengirim sampah acak, penyerang menggunakan alat Packet capture atau klien game yang dimodifikasi untuk mengirim permintaan koneksi Unreal Engine yang diformat dengan benar (seperti paket NMT_Hello atau NMT_Login) atau spam RPC berat tertentu. NetDriver menerima paket-paket yang tampaknya valid ini dan menyerahkannya ke Game thread untuk diproses. CPU server melonjak hingga 100% saat mencoba mengurai ribuan Handshake login palsu, memvalidasi tiket sesi yang tidak ada, atau mengalokasikan memori untuk parameter string yang kompleks dalam fungsi yang direplikasi. Karena lalu lintas ini terlihat identik dengan aktivitas pemain yang sah bagi Firewall standar, ia melewati perlindungan DDoS dasar. Ini segera meruntuhkan Tick rate server, menyebabkan perilaku teleportasi ekstrem dan Rollback yang dialami pemain tepat sebelum proses Watchdog mematikan instance yang membeku.

Mendiagnosis Serangan: Apakah Berbahaya atau Hanya Netcode Buruk?

Sebelum Anda mengasumsikan server Anda sedang diserang, Anda harus menyingkirkan bug Replication yang katastrofik. Jika satu klien memicu loop tak terbatas dari panggilan RPC, itu dapat meniru DDoS Layer 7. Sebelum panik, tinjau log crash dan metrik Anda. Jika Anda melihat lonjakan besar dalam Memory allocation tetapi lalu lintas jaringan rendah, Anda mungkin menghadapi masalah Replication—untuk panduan tentang itu, lihat panduan kami di Zero Ping Spikes Complete Freeze The Ultimate Uefn Server Crash Fix Protocol.

Namun, jika pemantauan eksternal Anda menunjukkan lonjakan lalu lintas masuk dari baseline ~50 Mbps ke 5 Gbps, atau jika log server Anda menunjukkan ribuan pesan LogNet: NotifyAcceptingConnection dari alamat IP unik dalam hitungan detik, Anda sedang menghadapi serangan terkoordinasi.

Memperkuat Netcode Anda: Menerapkan Connection Throttling di C++

Meskipun mitigasi DDoS volumetrik yang sebenarnya harus terjadi di tingkat infrastruktur (yang akan kami bahas segera), Anda dapat melindungi server Unreal Engine Anda dari kelelahan Layer 7 dengan menerapkan Rate Limiting yang agresif langsung di AGameModeBase Anda.

Dengan mengganti fungsi PreLogin, Anda dapat mencegat upaya koneksi sebelum server mengalokasikan APlayerController penuh dan memulai proses mahal untuk memuat pemain ke dalam dunia.

Berikut adalah implementasi C++ yang kuat untuk membatasi upaya koneksi cepat dari alamat IP berbahaya:

// In YourGameMode.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "YourGameMode.generated.h"

UCLASS()
class YOURGAME_API AYourGameMode : public AGameModeBase
{
    GENERATED_BODY()

public:
    virtual void PreLogin(const FString& Options, const FString& Address, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage) override;

private:
    // Maps to track connection attempts per IP
    TMap<FString, int32> ConnectionAttempts;
    TMap<FString, float> LastConnectionTime;

    // Configuration limits
    const int32 MaxAttemptsPerMinute = 4;
    const float LockoutTimeSeconds = 60.0f;
};
// In YourGameMode.cpp
#include "YourGameMode.h"
#include "Engine/World.h"

void AYourGameMode::PreLogin(const FString& Options, const FString& Address, const FUniqueNetIdRepl& UniqueId, FString& ErrorMessage)
{
    // Always call super first to handle native bans and base logic
    Super::PreLogin(Options, Address, UniqueId, ErrorMessage);

    // If an error was already generated (e.g., server full), exit early
    if (!ErrorMessage.IsEmpty())
    {        return;
    }

    // The Address string usually arrives in the format "IP:Port"
    FString ClientIP;
    FString PortStr;
    if (!Address.Split(TEXT(":"), &ClientIP, &PortStr))
    {        ClientIP = Address; // Fallback if no port is appended
    }

    float CurrentTime = GetWorld()->GetTimeSeconds();

    // Check if this IP is currently in our tracking map
    if (LastConnectionTime.Contains(ClientIP))
    {        float TimeSinceLastAttempt = CurrentTime - LastConnectionTime[ClientIP];
        
        // If they are connecting too fast and have exceeded the attempt limit
        if (TimeSinceLastAttempt < LockoutTimeSeconds && ConnectionAttempts[ClientIP] >= MaxAttemptsPerMinute)
        {            ErrorMessage = TEXT("Connection rate limit exceeded. Please wait 60 seconds.");
            UE_LOG(LogGameMode, Warning, TEXT("DDoS Mitigation: Rejected rapid connection attempt from %s."), *ClientIP);
            return;
        }

        // If the lockout window has passed, reset their counter
        if (TimeSinceLastAttempt >= LockoutTimeSeconds)
        {            ConnectionAttempts[ClientIP] = 0;
        }    }

    // Increment the attempt counter and update the timestamp
    int32 Attempts = ConnectionAttempts.FindOrAdd(ClientIP, 0);
    ConnectionAttempts[ClientIP] = Attempts + 1;
    LastConnectionTime.Add(ClientIP, CurrentTime);

    UE_LOG(LogGameMode, Log, TEXT("Connection validation passed. Attempt %d from %s"), ConnectionAttempts[ClientIP], *ClientIP);
}

Mengapa Kode Ini Penting

Implementasi ini melacak alamat IP dari setiap permintaan yang masuk. Jika satu IP mencoba terhubung lebih dari 4 kali dalam jendela 60 detik, server secara aktif menolak koneksi di PreLogin. Menolak koneksi di sini jauh lebih murah pada siklus CPU daripada membiarkan mesin memunculkan aktor, mereplikasi status awal, lalu menendang pemain. Blok kode sederhana ini dapat menjadi perbedaan antara server Anda selamat dari serangan script-kiddie Layer 7 atau crash sepenuhnya.

Menyetel Konfigurasi Jaringan Unreal Engine

Selain logika C++, file DefaultEngine.ini Anda berisi beberapa parameter konfigurasi kritis. Membiarkan ini pada pengaturan default adalah kerentanan besar. Jika penyerang membanjiri server Anda dan batas Bandwidth Anda tidak dibatasi, server akan mencoba memproses semuanya, yang secara instan menghabiskan CPU.

Anda harus menetapkan batas atas yang ketat untuk lalu lintas jaringan Anda. Buka DefaultEngine.ini Anda dan terapkan batas yang diperkuat ini ke IpNetDriver:

[/Script/Engine.Player]
; Limit maximum connection speed to 10 MB/s to prevent single-client bandwidth exhaustion
ConfiguredInternetSpeed=10485760
ConfiguredLanSpeed=10485760

[/Script/OnlineSubsystemUtils.IpNetDriver]
; Maximum data rate allowed per client (in bytes). 100kb/s is usually plenty for an FPS.
MaxClientRate=100000
MaxInternetClientRate=100000

; Cap the server tick rate to ensure predictable CPU load.
NetServerMaxTickRate=30

; Aggressively drop unresponsive clients. Defaults are often too long (60s+).
ConnectionTimeout=15.0
InitialConnectTimeout=15.0

; How often the server expects a keep-alive ping.
KeepAliveTime=0.2

; Limit the number of ports the server will try to bind to upon startup.
MaxPortCountToTry=512

Dengan mengurangi ConnectionTimeout menjadi 15.0 detik, server Anda akan dengan cepat membersihkan koneksi setengah terbuka atau mati yang dihasilkan oleh serangan DDoS, membebaskan memori dan slot jaringan untuk pemain yang sah.

Masalah Infrastruktur: Anda Tidak Dapat Memblokir Apa yang Sudah Tiba

Konfigurasi throttling C++ dan INI yang dirinci di atas akan melindungi Anda dari kelelahan lapisan aplikasi, tetapi mereka memiliki kelemahan fatal dalam hal serangan volumetrik Layer 4: pada saat server Unreal Engine Anda memutuskan untuk membuang paket, Bandwidth sudah dikonsumsi.

Jika penyerang mengarahkan Botnet 10 Gbps ke server Anda, dan penyedia hosting Anda hanya menyediakan antarmuka jaringan 1 Gbps, tidak peduli seberapa optimal kode C++ Anda. Pipa yang menuju ke server Anda secara fisik tersumbat. Lalu lintas pemain yang sah tidak dapat masuk, mengakibatkan desinkronisasi massal dan teleportasi.

Mitigasi serangan Layer 4 membutuhkan strategi pertahanan tingkat infrastruktur.

Pendekatan Mandiri

Jika Anda menjalankan server bare-metal khusus atau instance EC2 standar Anda sendiri, Anda harus membangun pipeline mitigasi secara manual. Ini biasanya melibatkan:

  1. Menyiapkan Reverse Proxy: Anda tidak boleh mengekspos IP server Unreal Engine Anda yang sebenarnya ke publik. Anda harus merutekan lalu lintas melalui proksi UDP (seperti NGINX atau HAProxy). Ini menambah latensi, tetapi memungkinkan Anda menyembunyikan IP asli.
  2. Mengonfigurasi iptables/nftables: Anda harus menulis aturan Firewall yang ketat untuk membuang paket UDP yang terfragmentasi dan membatasi koneksi per IP di tingkat kernel.
  3. Membeli Mitigasi Enterprise: Anda harus membeli layanan routing perusahaan yang mahal (seperti AWS Shield Advanced atau Cloudflare Magic Transit) untuk menyaring lalu lintas berbahaya sebelum mencapai pusat data Anda.

Membangun arsitektur berbasis proksi ini sendiri membutuhkan pengaturan fleet manager, Load balancers, dan tabel routing yang kompleks—mudah memakan waktu 4-6 bulan kerja DevOps khusus. Ini adalah pengurasan finansial dan waktu yang besar bagi studio Indie.

Melarikan Diri dari Jebakan DevOps

Inilah tepatnya mimpi buruk infrastruktur yang dirancang untuk diselesaikan oleh platform Backend-as-a-Service. Dengan horizOn, infrastruktur backend yang diperkuat ini sudah dikonfigurasi sebelumnya.

Alih-alih menghabiskan berbulan-bulan mengonfigurasi iptables, platform kami mengelola Edge network untuk Anda. Instance game Anda terlindungi di balik lapisan routing tingkat perusahaan yang secara otomatis mengidentifikasi dan membuang lalu lintas Layer 4 dan Layer 7 yang berbahaya sebelum mencapai thread server Unreal Engine Anda. Ini berarti Tick rate Anda tetap stabil dan pemain Anda tetap terhubung.

4 Praktik Terbaik untuk Pengembang Indie yang Diserang

Ikuti prinsip keamanan inti ini untuk memperkuat game Anda:

1. Jangan Pernah Ekspos IP Server Langsung ke Klien: Gunakan layanan Matchmaking yang aman atau tiket sesi. 2. Terapkan Validasi Sesi yang Ketat: Jangan biarkan klien terhubung hanya dengan mengetahui IP dan port. Wajibkan token kriptografi (seperti JWT) di PreLogin. 3. Batasi Tick Rate Server Anda: Jangan jalankan NetServerMaxTickRate tanpa batas. Kunci pada nilai yang dapat diprediksi (30 Hz). 4. Pantau Network Edge, Bukan Hanya Engine: Log engine tidak akan memberitahu Anda tentang paket yang dibuang di Firewall. Lacak metrik Bandwidth masuk (InBytes) di tingkat OS.

Melindungi game Anda adalah perlombaan senjata yang berkelanjutan. Dengan menerapkan Rate Limiting yang agresif dan menggunakan infrastruktur yang membuang lalu lintas buruk di Edge, Anda memastikan pemain menikmati game persis seperti yang Anda rancang.

Siap berhenti mengkhawatirkan infrastruktur? Coba horizOn gratis.


Sumber: [VERY CRITICAL] Organized DDoS Attacks Causing Server Crashes