Bloga Dön

Dedicated Servers Neden Donuyor: Unreal Engine Sunucu DDoS Protection Gerçeği

Yayınlanma tarihi 8 Nisan 2026
Dedicated Servers Neden Donuyor: Unreal Engine Sunucu DDoS Protection Gerçeği

Her Multiplayer oyun geliştiricisi ani ve açıklanamayan sunucu donmalarından korkar. Dedicated instance'ınız sabit 30 Tick rate ile kusursuz bir şekilde çalışırken, uyarı olmaksızın tüm simülasyon durma noktasına gelir. Oyuncular harita üzerinde Rubber-banding yaşar, RPCs paketleri düşer ve saniyeler sonra Connection timeout hatası maçı sonlandırır. İçgüdüsel olarak en son yazdığınız Movement replication kodunu veya karmaşık bir fizik hesaplamasını suçlayabilirsiniz; ancak oyuncu sayınız artıyorsa, gerçek genellikle çok daha kötüdür: altyapınız koordineli bir Distributed Denial of Service (DDoS) saldırısının kurbanıdır.

Unreal Engine geliştirici topluluğundan gelen son raporlar, oyun sunucularını hedef alan organize DDoS saldırılarında büyük bir artış olduğunu, özellikle Battle Royale ve özel Creative instance'ları gibi büyük ölçekli modların etkilendiğini gösteriyor. Bu saldırılar sunucunun Network processing thread'ini tamamen felç ederek şiddetli Lag, küresel senkronizasyon bozukluğu ve nihayetinde Hard crashes ile sonuçlanır.

Indie geliştiriciler ve AA stüdyoları için sağlam bir Unreal Engine Server DDoS Protection uygulamak artık isteğe bağlı değil; herhangi bir Live-ops oyunu için zorunlu bir gerekliliktir. Bu teknik incelemede, bu saldırıların Unreal Engine Netcode'unu nasıl manipüle ettiğini, kötü niyetli bir Flood'u standart kötü ağ koşullarından nasıl ayırt edeceğinizi ve oyununuzun altyapısını güçlendirmek için atabileceğiniz somut adımları analiz edeceğiz.

Unreal Engine Sunucu Çökmesinin Anatomisi

Sunucunuzu nasıl koruyacağınızı anlamak için önce Unreal Engine'in gelen ağ trafiğini nasıl işlediğini anlamanız gerekir. Unreal, NetDriver tarafından yönetilen özel bir UDP tabanlı protokol kullanır. UDP bağlantısız olduğu için internetteki herhangi bir istemci, resmi bir Handshake yapmadan sunucunuzun açık portuna paket gönderebilir.

Katman 4 Volumetrik Saldırılar vs. Katman 7 Uygulama Saldırıları

Çoğu sunucu çökmesi iki tip ağ saldırısından birinden kaynaklanır:

1. Volumetrik UDP Flood'ları (Katman 4): Bu bir kaba kuvvet (brute-force) saldırısıdır. Bir Botnet, sunucunuzun genel IP adresini ve portunu saniyede gigabaytlarca çöp UDP paketiyle bombardıman eder. Sunucunun ağ kartı (NIC) ve işletim sisteminin Network stack'i tamamen doygunluğa ulaşır. Unreal Engine paketlere bakma şansı bile bulamadan, alttaki makinenin Bandwidth'i tükenir veya CPU kesintileri (CPU interrupts) o kadar artar ki meşru oyuncu trafiği tamamen düşer.

2. Uygulama Katmanı Tüketimi (Katman 7): Bu saldırılar çok daha sinsidir. Rastgele çöp göndermek yerine, saldırgan Packet capture araçlarını veya modifiye edilmiş oyun istemcilerini kullanarak doğru şekilde biçimlendirilmiş Unreal Engine bağlantı istekleri (NMT_Hello veya NMT_Login paketleri gibi) veya belirli ağır RPC spam'leri gönderir. NetDriver bu görünüşte geçerli paketleri kabul eder ve işlenmek üzere Game thread'ine iletir. Sunucu CPU'su, binlerce sahte oturum açma Handshake'ini ayrıştırmaya, var olmayan oturum biletlerini doğrulamaya veya replike edilmiş fonksiyonlardaki karmaşık dize parametreleri için bellek ayırmaya çalışırken %100'e fırlar. Bu trafik standart bir Firewall için meşru oyuncu etkinliğiyle özdeş göründüğünden, temel DDoS korumasını atlar. Bu durum sunucu Tick rate'ini anında düşürür ve Watchdog süreci donmuş instance'ı sonlandırmadan hemen önce oyuncuların yaşadığı aşırı ışınlanma ve Rollback davranışlarına neden olur.

Saldırıyı Teşhis Etmek: Kötü Niyetli mi Yoksa Sadece Kötü Netcode mu?

Sunucunuzun saldırı altında olduğunu varsaymadan önce, felaket niteliğindeki Replication hatalarını elemelisiniz. Tek bir istemci sonsuz bir RPC çağrısı döngüsü tetiklerse, bu Katman 7 DDoS'u taklit edebilir. Panik moduna girmeden önce kaza günlüklerinizi ve metriklerinizi incelemelisiniz. Memory allocation'da büyük artışlar görüyor ancak ağ trafiği düşükse, bir Replication sorunuyla karşı karşıya olabilirsiniz; bu konuda rehberlik için Zero Ping Spikes Complete Freeze The Ultimate Uefn Server Crash Fix Protocol kılavuzumuza göz atın.

Bununla birlikte, harici izlemeniz gelen trafiğin ~50 Mbps'lik bir temel seviyeden 5 Gbps'ye fırladığını gösteriyorsa veya sunucu günlükleriniz saniyeler içinde benzersiz IP adreslerinden binlerce LogNet: NotifyAcceptingConnection mesajı gösteriyorsa, organize bir saldırıyla karşı karşıyasınız demektir.

Netcode'unuzu Güçlendirmek: C++'da Bağlantı Sınırlama (Throttling) Uygulamak

Gerçek volumetrik DDoS azaltma altyapı düzeyinde gerçekleşmesi gerekse de (buna birazdan değineceğiz), AGameModeBase içinde doğrudan agresif Rate Limiting uygulayarak Unreal Engine sunucunuzu Katman 7 uygulama tüketimine karşı koruyabilirsiniz.

PreLogin fonksiyonunu override ederek, sunucu tam bir APlayerController ayırmadan ve oyuncuyu dünyaya yükleme maliyetli sürecine başlamadan önce bağlantı girişimlerini durdurabilirsiniz.

Kötü niyetli IP adreslerinden gelen hızlı bağlantı girişimlerini sınırlamak için sağlam bir C++ uygulaması şöyledir:

// 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);
}

Bu Kod Neden Önemli?

Bu uygulama, gelen her isteğin IP adresini takip eder. Tek bir IP 60 saniyelik bir pencere içinde 4 defadan fazla bağlanmaya çalışırsa, sunucu PreLogin aşamasında bağlantıyı aktif olarak reddeder. Bağlantıyı burada reddetmek, motorun bir actor oluşturmasına, başlangıç durumlarını replike etmesine ve ardından oyuncuyu atmasına (kick) izin vermekten çok daha düşük CPU maliyetlidir. Bu basit kod bloğu, sunucunuzun bir Katman 7 script-kiddie saldırısından sağ kurtulması ile tamamen yanıt vermez hale gelip çökmesi arasındaki farkı yaratabilir.

Unreal Engine Ağ Yapılandırmasını Ayarlama

C++ mantığının ötesinde, DefaultEngine.ini dosyanız sunucunuzun ne kadar bant genişliği tüketebileceğini belirleyen birkaç kritik parametre içerir. Bunları varsayılan ayarlarda bırakmak büyük bir güvenlik açığıdır. Bir saldırgan sunucunuzu Flood ederse ve Bandwidth limitleriniz sınırsızsa, sunucu her şeyi işlemeye çalışacak ve CPU'yu anında maksimize edecektir.

Ağ trafiğiniz için katı üst sınırlar belirlemelisiniz. DefaultEngine.ini dosyanızı açın ve IpNetDriver kısmına şu güçlendirilmiş limitleri uygulayın:

[/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

ConnectionTimeout değerini 15.0 saniyeye indirerek, sunucunuz sahte bir DDoS saldırısı tarafından oluşturulan yarı açık veya ölü bağlantıları hızla temizleyecek, meşru oyuncular için bellek ve ağ yuvaları açacaktır.

Altyapı Sorunu: Zaten Ulaşmış Olanı Engelleyemezsiniz

Yukarıda detaylandırılan C++ sınırlaması ve INI yapılandırmaları sizi uygulama katmanı tüketimine karşı koruyacaktır, ancak Katman 4 volumetrik saldırılar söz konusu olduğunda ölümcül bir kusurları vardır: Unreal Engine sunucunuz paketi düşürmeye karar verene kadar Bandwidth zaten tüketilmiştir.

Bir saldırgan sunucunuza 10 Gbps'lik bir Botnet yönlendirirse ve barındırma sağlayıcınız yalnızca 1 Gbps'lik bir Network interface sağlıyorsa, C++ kodunuzun ne kadar optimize edildiği önemli değildir. Sunucunuza giden borular fiziksel olarak tıkanmıştır. Meşru oyuncu trafiği geçemez, bu da son topluluk raporlarında açıklanan devasa senkronizasyon bozukluğu (desync) ve ışınlanma ile sonuçlanır.

Katman 4 saldırılarını azaltmak, altyapı düzeyinde bir savunma stratejisi gerektirir.

Kendin Yap (DIY) Yaklaşımı

Kendi özel Bare-metal sunucularınızı veya standart EC2 instance'larınızı çalıştırıyorsanız, manuel bir azaltma hattı oluşturmanız gerekir. Bu genellikle şunları içerir:

  1. Reverse Proxy Kurulumu: Gerçek Unreal Engine sunucu IP'nizi halka ifşa edemezsiniz. Trafiği bir UDP proxy (UDP yönlendirme için stream modülü ile yapılandırılmış NGINX veya HAProxy gibi) üzerinden yönlendirmelisiniz. Bu bir gecikme adımı ekler, ancak UE binary'sini çalıştıran instance'ın gerçek IP'sini gizlemenize olanak tanır.
  2. iptables/nftables Yapılandırması: Parçalanmış UDP paketlerini düşürmek ve çekirdek düzeyinde IP başına bağlantıları sınırlamak için katı Firewall kuralları yazmalısınız.
  3. Kurumsal Azaltma Satın Alma: Kötü niyetli trafiği veri merkezinize ulaşmadan temizlemek için pahalı kurumsal yönlendirme hizmetleri (AWS Shield Advanced veya Cloudflare Magic Transit gibi) satın almanız gerekir.

Bu dayanıklı, proxy tabanlı mimariyi kendiniz oluşturmak; fleet manager'lar, Load balancers ve karmaşık yönlendirme tabloları kurmayı gerektirir ve bu da kolayca 4-6 aylık uzmanlaşmış DevOps çalışması demektir. Oyun çıkarmaya çalışan bir Indie stüdyosu için bu, devasa bir finansal ve zamansal kayıptır.

DevOps Tuzağından Kaçış

Bu, tam olarak Backend-as-a-Service platformlarının çözmek için tasarlandığı altyapı kabusudur. horizOn ile bu güçlendirilmiş backend altyapısı önceden yapılandırılmış olarak gelir.

Iptables yapılandırmakla aylar harcamak ve volumetrik UDP Flood'ları hakkında endişelenmek yerine, platformumuz Edge network'ünü sizin için yönetir. Oyun instance'larınız, kötü niyetli Katman 4 ve Katman 7 trafiğini gerçek Unreal Engine sunucu thread'inize ulaşmadan önce otomatik olarak tanımlayan ve düşüren kurumsal düzeyde bir yönlendirme katmanının arkasında korunur. Bu, Tick rate'inizin sabit kalması, meşru oyuncularınızın bağlı kalması ve botnet'leri azaltmak yerine oynanış kodu yazmaya odaklanabilmeniz anlamına gelir.

Saldırı Altındaki Indie Geliştiriciler İçin 4 En İyi Uygulama

Oyununuzu güçlendirmek için şu temel güvenlik ilkelerini izlemelisiniz:

1. Sunucu IP'lerini Asla Doğrudan İstemcilere İfşa Etmeyin: Bir oyuncu sunucunuzun IP'sini Wireshark ile görebiliyorsa, saldırgan da görebilir. Güvenli bir Matchmaking servisi veya oturum biletleri kullanın. 2. Sıkı Oturum Doğrulaması Uygulayın: İstemcilerin sadece IP ve portu bilerek bağlanmasına izin vermeyin. Bir JWT gibi kısa ömürlü bir kriptografik token isteyin ve bunu PreLogin aşamasında doğrulayın. 3. Sunucu Tick Rate'inizi Sınırlayın: Sınırsız NetServerMaxTickRate çalıştırmayın. CPU payı bırakmak için 30 Hz gibi öngörülebilir bir değere sabitleyin. 4. Sadece Motoru Değil, Ağın Ucunu (Edge) İzleyin: Motor çökme günlükleri Firewall düzeyinde düşen paketleri göstermez. OS düzeyinde gelen Bandwidth (InBytes) metriklerini takip edin.

Çok oyunculu oyununuzu korumak bitmek bilmeyen bir yarıştır. Kodunuzda agresif Rate Limiting uygulayarak ve trafiği uçta temizleyen altyapılar kullanarak oyuncularınıza tasarladığınız deneyimi sunabilirsiniz.

Altyapı konusunda endişelenmeyi bırakıp oyununuzu oluşturmaya odaklanmaya hazır mısınız? horizOn'u ücretsiz deneyin.


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