Garry's Mod sunucusunu DDoS saldırılarına karşı koruma

Yayınlanma tarihi 22 dk okuma

Garry's Mod'da oyun trafiği ile sunucu sorgusu aynı 27015 portu üzerinden çalışır. Sunucuda hangi kuralların gerçekten işe yaradığı, RCON'u ve Lua ağ olaylarını nasıl güvene alacağınız ve hangi saldırı hacminden sonra yalnızca sunucunun önündeki ağda yapılan filtrelemenin işe yaradığı.

Akşam saat 20.00'de üç dakika boyunca kaybolan ve sonra geri gelen bir Garry's Mod sunucusunun donanım sorunu yaşaması nadirdir. Vakaların büyük çoğunluğunda bir saldırı sürüyordur ve tam oyuncuların en kalabalık bağlı olduğu anda sürüyordur. Bu yüzden Garry's Mod için DDoS koruması ilk olarak şu anlama gelir: sunucunuza hangi paketlerin ulaşmasına izin verildiğini bilmek. Bu yazı şu sırayla gösteriyor: önümüzdeki on dakikada tek kuruş harcamadan kendiniz neleri güvene alabileceğiniz, bu önlemlerin fiziksel olarak nerede bittiği ve ardından sunucunun önündeki ağda neler olması gerektiği.

Tüm bilgiler Debian 12, Debian 13, Ubuntu 22.04 LTS veya Ubuntu 24.04 LTS üzerinde çalışan bir srcds sunucusu içindir. Yapılandırma dosyası garrysmod/cfg/server.cfg yolundadır, komutlar root kullanıcısı için yazılmıştır, normal kullanıcı olarak başlarına sudo ekleyin. Kastedilen her zaman kendi root ya da dedicated sunucunuzdaki işletimdir, bir oyun sunucusu sağlayıcısındaki bir slot değil.

Saldırı şu anda sürüyorsa: server.cfg dosyasında şimdi hiçbir şey değiştirmeyin ve srcds sunucusunu yeniden başlatmayın. Önce ölçüm değerlerini kaydedin (9. bölüm), çünkü saldırıdan sonra bunlar kaybolur. Bir yeniden başlatma size sayaçlara mal olur ve sunucuyu ardından aynı selin içine geri götürür.

Bir Garry's Mod sunucusu neden DDoS korumasına ihtiyaç duyar

Bir Garry's Mod sunucusu IP adresini ve portunu kendisi yayınlar. Bu bir gözden kaçma değil, bir önkoşuldur: Sunucu tarayıcısında yer almayan kişi yeni oyuncu bulamaz. Kayıt, sunucunun Steam ana sunucusuna kaydolması ve ardından dışarıdan gelen her A2S sorgusunu yanıtlaması sayesinde oluşur. Yani soru hiçbir zaman bir saldırganın adresinizi bulup bulamayacağı değildir, yalnızca oraya ateş ettiğinde ne olacağıdır.

Buna bir de toplulukların biçimi ekleniyor. Garry's Mod ağırlıklı olarak turlar hâlinde değil, kalıcı dünyalarda oynanıyor: Bir DarkRP topluluğu oyuncu hesaplarını, mülkiyeti, meslekleri ve ilerlemeyi aylar boyunca bir veritabanında tutuyor. Cuma akşamı yaşanan bir kesinti bu yüzden kaybedilmiş bir maçtan fazlasına mal olur, sabit oyunculara mal olur. İşte tam bu nedenle rakip topluluklar, banlanmış oyuncular ve satın alınan sunucu booter'ları (ayda birkaç euro karşılığında herhangi bir adrese saldırı başlatan hizmetler) en sık görülen üç tetikleyicidir. Saldırganın bunun için ne beceriye ne de anlamlı bir paraya ihtiyacı vardır.

Teknik tarafta üç özellik bir araya geliyor. Oyun trafiği UDP üzerinden çalışır ve UDP'de talep edilebilecek bir bağlantı kurulumu yoktur: Gönderen adresleri sahte olabilir. Sunucu sorgusu oyunla aynı portta durur, yani kaba bir engelleme her zaman ikisini birden vurur. Ve her şeyin üzerinde Lua durur: Her Workshop addon'u kendi kodunu aynı sürecin içine getirir ve korunmasız tek bir ağ olayı, tek bir istemcinin hiç bant genişliği kullanmadan sunucuyu yavaşlatması için yeterlidir. Bir DDoS saldırısının temelde ne olduğunu DDoS saldırısı nedir? yazısı anlatıyor.

Garry's Mod'da asıl mesele olan portlar

Bir Garry's Mod sunucusu standart olarak 27015 portunda başlar: sunucu sorgusu dâhil oyun için UDP üzerinde, RCON için ise TCP üzerinde. Numara başlangıçta -port ile değiştirilir, birden fazla örnekte sayı yukarı doğru artırılır (27016, 27017 ve böyle devam eder). Tipik bir başlatma komutu şöyle görünür:

./srcds_run -game garrysmod -console \
  -port 27015 \
  +maxplayers 64 \
  +gamemode darkrp \
  +map rp_downtown_v4c_v2 \
  +sv_setsteamaccount GSLT_TOKENİNİZ \
  +host_workshop_collection 123456789 \
  -authkey STEAM_WEB_API_ANAHTARINIZ

Saldırı yüzeyinin tamamı bundan çıkar. Aşağıdaki tablo, daha aşağıdaki her güvenlik duvarı kuralının temelidir:

Port ve protokol Ne için Neyle değiştirilir Açık ağa ait mi
27015/UDP Aynı portta oyun trafiği ve A2S sorgusu -port evet, gerçekten açık olmak zorunda olan tek port budur
27015/TCP RCON, yani Source RCON protokolü -port (oyunla aynı numara) hayır, yalnızca kendi adresiniz için
27005/UDP İstemci portu, oyuncunun tarafından gider -clientport hayır, sunucuda kural gerekmez
27020/UDP SourceTV +tv_port yalnızca gerçekten yayın yapıyorsanız
26901/UDP Steam ana sunucusuna kayıt giden yönde hayır, gelen kural gerekmez
80/TCP ve 443/TCP sv_downloadurl üzerinden FastDL, web sunucusu aynı makinedeyse web sunucusu yalnızca FastDL oradaysa (ayırmak daha iyidir)
3306/TCP DarkRP ve oyuncu verileri için MySQL (mysqloo modülü üzerinden) bind-address hayır, yalnızca 127.0.0.1
22/TCP SSH erişimi sshd_config evet, ama kısıtlı

Bu sekiz kayıttan tam olarak biri kısıtlama olmadan açık ağa aittir: 27015/UDP. Geri kalan her şey ya kendi adresinize sınırlanır, ya 127.0.0.1 adresine bağlanır, ya da hiç başlatılmaz. Bu konu alanındaki en pahalı düşünce hatası, Garry's Mod'da öylece kapatılabilecek ayrı bir sorgu portu olduğu varsayımıdır. Öyle bir port yok.

Para harcamadan önce kendiniz neler yapabilirsiniz

Bu bölüm en uzunu ve bu bilinçli bir tercih. Düzgün yapılandırılmış bir Garry's Mod sunucusu, nerede barındırıldığından bağımsız olarak küçük ve orta ölçekli saldırılara kendi gücüyle dayanır. Bunların hiçbiri para tutmaz ve çoğu çeyrek saatte bitirilir.

1. Envanter: ne dinliyor

Tek bir kural yazmadan önce sunucunuzun dışarıya ne sunduğuna bakın. Tahmin etmeyin, bakın:

ss -lntup

İlgi çekici olan, yerel adresi gösteren sütundur. 0.0.0.0:27015 ve [::]:27015 “bütün internetten erişilebilir” anlamına gelir, 127.0.0.1:3306 ise “yalnızca yerel” demektir ve bir güvenlik duvarı kuralına ihtiyaç duymaz. Zamanla büyümüş bir DarkRP sunucusunda orada neredeyse her zaman beklenenden fazla hizmet bulunur: MySQL, FastDL için bir web sunucusu, bir panel, bir Discord botu, 27016'da ikinci bir test sunucusu ve unutulmuş bir ses hizmeti. Saldırganın bakışını, dışarıdan yapılan bir port taraması verir:

nmap -Pn -sU -sT -p- --min-rate 1000 SUNUCU.IP.ADRESİNİZ

2. Yalnızca srcds'nin gerçekten ihtiyaç duyduğu portları açık bırakma

Garry's Mod için dışarıya tek bir açma yeter, buna ek olarak SSH ve kısıtlanmış RCON erişimi. UFW ile bu şöyle görünür, hem de tam bu sırayla, ki kendinizi dışarıda bırakmayın:

ufw allow 22/tcp comment 'SSH'
ufw allow 27015/udp comment 'Garrys Mod oyun ve A2S'
ufw allow from 203.0.113.10 to any port 27015 proto tcp comment 'RCON'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

203.0.113.10 adresini kendi adresinizle değiştirin. 27020/UDP üzerindeki SourceTV'yi yalnızca gerçekten yayın yapıyorsanız açın. Kurtarma yolu da dâhil tam rehber Kendinizi dışarıda bırakmadan UFW güvenlik duvarı kurma yazısında. Yine de olursa: KernelHost'un KVM root sunucularında ve dedicated sunucularında IPMI ve iDRAC yoktur, müşteri panelindeki VNC konsolu üzerinden geri dönersiniz. Bu konsol konuk sistemin ağ yığınına bağlı değildir, konuk içindeki bir güvenlik duvarı kuralı onu engelleyemez.

Veritabanı hiçbir durumda açık ağa ait değildir. /etc/mysql/mariadb.conf.d/50-server.cnf dosyasında şu satırın bulunduğunu kontrol edin:

bind-address = 127.0.0.1

3. A2S sorgusunu, sunucu listesinden düşmeden sınırlama

Garry's Mod sunucularının çoğuna pahalıya gelen hata burada. Oyun trafiği ile sunucu sorgusu aynı portu kullandığı için, 27015/UDP üzerindeki toptan bir engelleme ya da fazla sıkı bir hız sınırlaması kendi oyuncularınızı dışarı atar ve saldırının işini kendisi tamamlar. Doğru başlangıç noktası, sorgu paketleri ile oyun paketleri arasındaki ayrımdır.

Engine bunun için server.cfg dosyasında duran üç konsol değişkeni taşıyor. Ön ayar değerleri ihtiyatlıdır, ama ayarlanmıştır:

sv_max_queries_sec 3
sv_max_queries_sec_global 60
sv_max_queries_window 30

sv_max_queries_sec gönderen adres başına yanıtlanan sorguları sınırlar (ön ayar saniyede 3), sv_max_queries_sec_global bütün adreslerin toplamına üst sınır koyar (ön ayar saniyede 60), sv_max_queries_window ise ortalama alma penceresini belirler (ön ayar 30 saniye). Bu değerler CPU'yu anlamsızca yanıt üretmekten korur. Paketlerin ulaşmasını engellemezler ve küresel değeri çok sıkı çeken kişi saldırı boyunca sunucu tarayıcısından kaybolur, çünkü liste sayfalarının sorguları da yanıtsız kalır.

Bir kat aşağıda sorgu trafiği temiz biçimde ayrılabilir. Source engine'in bütün bağlantısız paketleri, ayarlanmış dört baytla (0xffffffff) başlar, çoktan bağlanmış oyuncuların trafiğinde ise bu başlık yoktur. Tam buna nftables ile kaynak adres başına bir hız sınırlaması konabilir:

table inet gmod {
    chain input {
        type filter hook input priority -10; policy accept;
        udp dport 27015 @th,64,32 0xffffffff \
            meter a2sflood { ip saddr limit rate over 8/second burst 20 packets } drop
    }
}

Dosyayı nft -f ile yüklersiniz. -10 önceliği, kuralın UFW'nin filtre zincirinden önce etki etmesini sağlar ve @th,64,32 ifadesi UDP başlığının arkasındaki ilk dört baytı okur. Klasik iptables ile aynı işi bir u32 karşılaştırması yapar:

iptables -A INPUT -p udp --dport 27015 \
  -m u32 --u32 "0>>22&0x3C@8=0xFFFFFFFF" \
  -m hashlimit --hashlimit-name gmod_a2s --hashlimit-mode srcip \
  --hashlimit-above 8/sec --hashlimit-burst 20 -j DROP

Ağdaki neredeyse her rehberin atladığı bir nokta: Yalnızca sunucu sorgusu bağlantısız değildir, bağlantı kurulumu da bağlantısızdır. Katılan bir oyuncu, oyunun içine girmeden önce aynı başlığa sahip birkaç paket gönderir. Bu yüzden fazla sıkı bir sınır, sunucu erişilebilir kalsa da yeni oyuncuları dışarıda bırakır. Cömert başlayın (adres ve saniye başına 8 ila 15 paket) ve sınırı ancak bir hafta normal işletim ölçtükten sonra sıkın.

4. RCON'u güvene alma ya da tamamen kapatma

RCON, Source sunucularında sevilen bir hedeftir ve bu aynı anda üç nedenden kaynaklanır. Birincisi, oyunla aynı port numarasında, yalnızca TCP üzerinde durur ve böylece aramaya gerek kalmadan bulunur. İkincisi, Source RCON protokolü parolayı düz metin olarak, TLS olmadan ve anahtar değişimi olmadan iletir: Trafiği okuyan kişi parolayı ele geçirir. Üçüncüsü, kazanç en yüksektir, çünkü RCON'a sahip olan kişi haritayı değiştirebilir, bütün oyuncuları banlayabilir, yapılandırmayı değiştirebilir ve sunucuyu durdurabilir. RCON'u ele geçiren bir saldırganın artık hiç bant genişliğine ihtiyacı kalmaz.

rcon_password değerini asla boş bırakmayın ve asla tahmin edilebilir seçmeyin, openssl rand -base64 32 çıktısındaki bir değer yeter. Giriş denemelerine karşı engine kendi frenini taşır:

rcon_password "UZUN_RASTGELE_PAROLA"
sv_rcon_minfailures 3
sv_rcon_maxfailures 5
sv_rcon_minfailuretime 30
sv_rcon_banpenalty 1440

Böylece bir adres, 30 saniye içindeki üç başarısız denemeden sonra bir gün boyunca banlanır. Buna dair iki uyarı. Birincisi, tam bu mekanizma, eski bir parola kaydedilmişse kendi yönetim panelinizi de dışarıda bırakır: İşletmecilerin “RCON birdenbire çalışmıyor” diye bildirdiği şey çoğunlukla kendi banıdır. İkincisi, 2. adımdaki güvenlik duvarı kısıtlaması daha etkili kalır, çünkü denemeyi uygulamaya kadar hiç geçirmez. RCON'a yalnızca ara sıra ihtiyaç duyan kişi portu tamamen kapatır ve bir SSH port yönlendirmesi üzerinden çalışır:

ssh -N -L 27015:127.0.0.1:27015 root@SUNUCU.IP.ADRESİNİZ

5. Lua ağ mesajlarını sınırlama, en sık görülen kendi elinizle yarattığınız kesinti

DDoS olarak bildirilen Garry's Mod kesintilerinin önemli bir bölümü DDoS değildir. Bunlar, saniyede birkaç kilobitle bağlı tek bir istemcinin tetiklediği Lua aşırı yüklenmeleridir. Neden, net kütüphanesinin yapısındadır: Bir addon util.AddNetworkString ile bir ağ olayı kaydettiği ve net.Receive ile onu dinlediği anda, her istemci bu olayı bir döngü içinde tetikleyebilir. Kendi sınırlaması olmadan sunucu her bir mesajı tek tek yürütür. Facepunch bunu kendi hata bildirimlerinde birçok kez belgeledi ve engine içinde bir çözüm öngörmedi, sınırlama açıkça addon yazarının görevidir.

Bu yüzden kendi yazdığınız ve satın aldığınız her addon'u üç şey açısından kontrol edin: oyuncu ve saniye başına bir üst sınır, mesaj uzunluğunun denetimi ve oyuncunun mesajın içeriğinden değil, sunucu tarafında ikinci parametreden belirlenmesi. Taşıyıcı bir kalıp şöyle görünür:

util.AddNetworkString("khrp_buy")

local budget = {}

net.Receive("khrp_buy", function(len, ply)
    if not IsValid(ply) then return end
    if len > 256 then return end

    local now = CurTime()
    local b = budget[ply]

    if not b or now - b.start >= 1 then
        b = { start = now, count = 0 }
        budget[ply] = b
    end

    b.count = b.count + 1
    if b.count > 10 then return end

    KHRP.HandleBuy(ply, net.ReadString())
end)

hook.Add("PlayerDisconnected", "khrp_budget_cleanup", function(ply)
    budget[ply] = nil
end)

Buna server.cfg dosyasındaki iki satır eşlik eder. sv_allowcslua Garry's Mod'da standart olarak 1 değerindedir ve istemcilerin lua_run_cl ile lua_openscript_cl kullanarak kendi kodlarını yürütmesine izin verir: Herkese açık bir sunucuda bu değer 0 olmalıdır. sv_kickerrornum ise belirtilen sayıdan fazla istemci tarafı hata üreten istemcilerin bağlantısını keser (ön ayar 0, yani kapalı):

sv_allowcslua 0
sv_kickerrornum 25

6. Workshop içeriklerini ve FastDL'i oyun sunucusundan ayırma

Workshop addon'ları Garry's Mod'da kenarda kalan bir konu değil, normal durumdur: Bir DarkRP topluluğu koleksiyonunu +host_workshop_collection ile bağlar ve istemciler bu içerikleri doğrudan Steam'den indirir. Bu, hattınıza yük getirmez. -authkey içindeki anahtar bir Steam Web API anahtarıdır ve bir parola gibi ele alınmalıdır: başlatma betiğine, herkese açık bir depoya değil ve bir Discord kanalına değil.

Bant genişliğine mal olan, ikinci yoldur. Workshop'tan gelmeyen her şey (kendi haritalarınız, sesler, materyaller) indirme kanalı üzerinden gider. sv_downloadurl olmadan bu kanal oyun portunun kendisi üzerinden çalışır ve doğrudan oyun trafiğiyle yarışır. FastDL ile HTTP üzerinden çalışır. Bu web sunucusu aynı makinede ve aynı IP adresinde duruyorsa ikisi aynı hattı paylaşır: Bir katılım dalgası ya da 80/TCP üzerine bir saldırı böylece oyunu da vurur. Şu değerler mantıklıdır:

sv_downloadurl "https://fastdl.alan-adiniz.com.tr/garrysmod/"
sv_allowdownload 1
sv_allowupload 0
net_maxfilesize 64

sv_allowupload 0 istemcilerden kendi dosyalarını sunucuya gönderme olanağını alır ve böylece ne ihtiyaç duyulan ne de denetlenen bir yolu kapatır. net_maxfilesize oyun kanalı üzerinden aktarılan dosyaların boyutunu megabayt cinsinden sınırlar. FastDL'i mümkünse başka bir makineye ya da kendi adının arkasına koyun, o zaman yük oyun portuyla aynı adreste olmaz.

7. Katılım flood'unu ve slot tükenmesini karşılama

Slot tükenmesi, bant genişliği gerektirmeyen bir saldırıdır: Saldırgan otomatik bağlantılarla bütün boş yerleri doldurur, böylece gerçek oyuncular dolu bir sunucu görür. Garry's Mod'da işi zorlaştıran bir nokta daha var: Oyuncu oyunun içine girmeden çok önce kaynak listesi ve oyun modu üzerinde uzlaşıldığı için her katılım sunucuya iş çıkarır.

Buna karşı dört şey işe yarar. Birincisi gerçekçi bir üst sınır: +maxplayers değerini oyun modunuzun taşıyabileceğinden yükseğe koymak yalnızca saldırı yüzeyini büyütür. İkincisi sv_timeout, yani bir istemcinin mesaj göndermeden kaç saniye sonra bağlantısının kesileceğini belirleyen değer (yaygın yapılandırmalarda 120): Takılı kalmış yarı açık bağlantılardan daha hızlı kurtulmak isteyen kişi bu değeri düşürür. Üçüncüsü, 3. adımdaki bağlantısız paketlerin hız sınırlaması, çünkü bağlantı kurulumu tam oradan geçer. Dördüncüsü, kapalı gruplar için bir sunucu parolası:

sv_password "sabit_grup_2026"
sv_timeout 90
sv_filterban 1
sv_region 3

Garry's Mod gerçek bir beyaz liste ile gelmez, bu ULX gibi eklentiler üzerinden ya da CheckPassword hook'unda kendi denetiminizle gelir. Ve bir şey net olmalı: Beyaz liste oyun mantığınızı korur, hattınızı korumaz. Sunucunuzu flood ile dolduran bir saldırgan zaten katılmak istemiyor. Paketleri reddedilir, ama buna rağmen ulaşmıştır ve mesele tam olarak budur.

8. Kernel'in yükünü azaltma: bağlantı izleme ve alma arabelleği

Bu adım, hacimsel bir saldırıya benzeyen ama öyle olmayan kesintileri açıklar. Kernel, UDP trafiği için bağlantı izlemede (conntrack) kayıtlar oluşturur ve sahte gönderen adreslerinde her adres yeni bir kayıt anlamına gelir. Tablo dolduğunda kernel paketleri ayrım yapmadan düşürür: Saldırı ve oyuncularınız birlikte dışarı atılır ve sistem logunda “nf_conntrack: table full” yazar. Durumu ve üst sınırı şu komut gösterir:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

En etkili adım, oyun trafiğini hiç izlettirmemektir, çünkü engine oturumlarını kendisi yönetir:

table inet raw {
    chain prerouting {
        type filter hook prerouting priority raw; policy accept;
        udp dport { 27015, 27020 } notrack
    }
    chain output {
        type filter hook output priority raw; policy accept;
        udp sport { 27015, 27020 } notrack
    }
}

iptables ile karşılığı iptables -t raw -A PREROUTING -p udp --dport 27015 -j NOTRACK ve OUTPUT için --sport ile aynı satırdır. Port bundan sonra açık bir izin gerektirir, çünkü izleme olmadan var olan bir duruma bakan hiçbir kural artık işlemez. Bunun dışında paketler srcds onları almaktan daha hızlı geliyorsa alma arabelleği taşar ve oyuncular için bu, hat boşken paket kaybı gibi görünür:

net.core.rmem_max = 16777216
net.core.rmem_default = 1048576
net.core.netdev_max_backlog = 16384

Bu satırlar /etc/sysctl.d/ altındaki bir dosyaya aittir ve sysctl --system ile etkin olur. Gerekli olup olmadıklarını kernel'in kendisi söyler: nstat -az içinde UdpRcvbufErrors değeri artıyorsa işe yararlar. Sayaç sıfırda kalıyorsa bu ayarlama hiçbir şeyi değiştirmez. Bu bir yedektir, koruma değil.

9. Her şey normal çalışırken ölçüm değerlerini kaydetme

En önemli adım, neredeyse hiç kimsenin önceden atmadığı adımdır: bir karşılaştırma temeli oluşturmak. Normal değer olmadan bir olaydan sonra saniyede 40.000 paketin çok mu olduğunu yoksa sadece cumartesi akşamı mı olduğunu söyleyemezsiniz. Sunucunuz için normal değeri bir kez hesaplayın: cl_cmdrate 66 ile 64 oyuncu, saniyede yaklaşık 4.200 gelen paket üretir, bunun belirgin biçimde üzerindeki her şey açıklama gerektirir. apt-get install -y vnstat sysstat ile ölçüm kalıcı olarak arka planda çalışır. Bir olay sırasında dört komut yeter:

sar -n DEV 1 10
ip -s link show eth0
nstat -az | grep -i udp
tcpdump -ni eth0 -c 200 "udp port 27015 and udp[8:4] = 0xffffffff"

İlki saniyedeki paket ve bayt sayısını, ikincisi arayüzün düşürülen paket sayaçlarını, üçüncüsü ise kernel'in UDP hata sayaçlarını gösterir. Dördüncü satır yalnızca bağlantısız paketleri, yani bir sorgu flood'unun kötüye kullandığı sınıfın tam olarak kendisini gösterir: Neredeyse kimse bağlı değilken sayaç saniyeler içinde doluyorsa yanıtınızı almışsınızdır. tcpdump komutunu her zaman -c ile sınırlayın, tam yük altında alınan bir paket kaydı hâlihazırda aşırı yüklü bir sunucuya ek yük getirir. Değerleri nasıl yorumlayacağınız DDoS saldırısını tanıma yazısında.

A2S yansıtma açığı nedir ve beni hâlâ etkiliyor mu

A2S yansıtması, sunucunuzun hedef değil araç olduğu bir saldırıdır. Saldırgan sahte gönderen adresiyle binlerce oyun sunucusuna küçük bir sorgu gönderir ve bunların belirgin biçimde daha büyük yanıtlarının hepsi asıl kurbanda toplanır. Tarihsel olarak bir A2S_INFO isteği 25 bayt büyüklüğündeydi (4 bayt 0xFFFFFFFF, 1 bayt 0x54, buna ek olarak “Source Engine Query” karakter dizisi için 20 bayt), yanıt ise birkaç yüz bayttı. US-CERT, Steam protokolünü amplifikasyon saldırıları listesinde 5,5 faktörüyle veriyor; bu şu anlama gelir: Saldırgandaki bir gigabit, kurbanda 5,5 gigabite dönüşür.

Valve bu açığı Kasım 2020'den itibaren iki yoldan kapattı. Bağlantısız sorgu paketlerinin o tarihten beri gönderen tarafından 1.200 bayta kadar doldurulması gerekiyor; böylece istek yanıttan büyük oluyor ve amplifikasyon faktörü 1'in altına düşüyor. Geçiş sırasında işletmeciler daha sıkı davranışı STEAM_GAMESERVER_MIN_CONNECTIONLESS_PACKET_SIZE=1200 ortam değişkeniyle önceden zorlayabiliyordu. Buna ek olarak sunucu, A2S_PLAYER ve A2S_RULES durumunda hemen veriyle değil, soran tarafın ikinci bir istekte geri göndermesi gereken bir challenge ile (S2C_CHALLENGE) yanıt veriyor. Gönderen adresini sahteleyen kişi bu challenge'ı hiç göremez.

Sizin için bundan iki şey çıkar. Sunucu binary'sini güncel tutun, çünkü koruma Steam oyun sunucusu altyapısında durur, sizin yapılandırmanızda değil. Ve yansıtmayı, size karşı yapılan bir sorgu flood'uyla karıştırmayın: İkinci biçime karşı yalnızca 3. adımdaki hız sınırlaması ve bunun ötesinde sunucunun önündeki ağda yapılan filtreleme yardımcı olur.

Bu önlemlerin bittiği yer: bant genişliği ve paket hızı

Şimdi hiçbir yapılandırma dosyasının çözemeyeceği bölüm. Buraya kadar anlatılan her şey sizin sunucunuzda, yani hattın sonunda çalışır. Bir güvenlik duvarı kuralı, kabloyu çoktan geçmiş bir paket hakkında karar verir. Paketi düşürebilirsiniz, ama gönderilmemiş hâle getiremezsiniz.

Bir kez birlikte hesaplayalım. Tipik bir oyun sunucusu 1 Gbit/s'lik bir hatta bağlıdır, bu saniyede 125 megabayttır ve biri bundan fazlasını gönderdiği anda hat dolar. İkinci büyüklük çoğunlukla daha önce vurur: 64 baytlık mümkün olan en küçük paketlerde 1 Gbit/s içine saniyede yaklaşık 1,49 milyon paket, 10 Gbit/s içine ise yaklaşık 14,88 milyon paket sığar. Normal bir sunucu kernel'i, CPU ve ağ kartına bağlı olarak bunların birkaç yüz binini işler, ardından düşürmeye başlar. Yani hattınızı üçte birine kadar bile doldurmayan bir saldırı sunucunuzu felç edebilir, çünkü işlem zamanı düşürme işine gider. İşletmeciler bunu “doluluk hiç de yüksek değildi, buna rağmen herkeste lag sıçramaları oldu” biçiminde yaşar.

Gösterge Değer
A2S_INFO isteği, tarihsel boyut 25 bayt
Steam protokolünün amplifikasyon faktörü (US-CERT) 5,5
2020'den bu yana bağlantısız sorgu paketlerinin asgari boyutu 1.200 bayt
Normal trafik: cmdrate 66 ile 64 oyuncu saniyede yaklaşık 4.200 gelen paket
64 baytlık paketlerde 1 Gbit/s saniyede yaklaşık 1,49 milyon paket (saniyede 125 megabayt)
64 baytlık paketlerde 10 Gbit/s saniyede yaklaşık 14,88 milyon paket
Topluluk oyun sunucularına yönelik tipik saldırı hacmi 5 ila 50 Gbit/s
KernelHost sunucularında ölçülen zirve saniyede 41,5 milyon pakette 473,4 Gbit/s

Gerçekte hangi büyüklüklerin görüldüğüne dair bir fikir vermek için: KernelHost sunucularında, diğerlerinin yanında bir oyun sunucusuna karşı saniyede 8,7 milyondan fazla pakette 112,2 Gbit/s'yi aşan bir UDP flood'u ve bir ses sunucusuna karşı saniyede 41,5 milyondan fazla pakette 473,4 Gbit/s'yi aşan çok vektörlü bir saldırı filtrelendi. 473,4 Gbit/s, 1 Gbit/s'lik bir bağlantının yaklaşık 470 katıdır ve 10 Gbit/s'lik bir bağlantının hâlâ yaklaşık 47 katıdır. Bunun için yerel bir ayar yoktur. Hacimsel saldırılar sunucunun önündeki ağda son bulmalıdır.

KernelHost buna karşı ne koyuyor

Her sunucu paketinde dâhil olan sürekli koruma

KernelHost'un DDoS koruması iki kademeli kuruludur ve siz herhangi bir şeyi açmak, sipariş etmek veya yapılandırmak zorunda kalmadan kalıcı olarak etkindir:

  • 1. kademe: küresel scrubbing ağında 17 Tbps mitigasyon kapasitesi. Hacimsel saldırılar, veri merkezine ulaşmadan önce kaynaklarına yakın bir noktada temizlenir.
  • 2. kademe: Frankfurt am Main'de 3,2 Tbps ile Arbor gerçek zamanlı filtreleme. Doğrudan sunucunun önünde protokole özgü kalıplar tanınır ve paket paket düşürülür.

İki özellik belirleyicidir. Koruma kalıcı olarak çalışır ve önce bir saldırıya tepki vermek zorunda değildir, yani oyuncularınızın dışarı atıldığı bir geçiş süresi yaşanmaz. Ayrıca null routing kullanılmaz: IP adresiniz ağda kalır, yalnızca zararlı paketler düşürülür. IP adresini ağdan çeken kişi, sizin açınızdan saldırganla aynı sonuca ulaşır. Konum Frankfurt am Main'dir. Hangi oyunların ve protokollerin kapsandığını Gerçek zamanlı oyun sunucusu DDoS koruması yazısı listeliyor.

Sürekli ateş altındaki topluluklar için Advanced DDoS Protection

Bazı projelere ara sıra değil, hedefli biçimde ve haftalar boyunca, değişen kalıplarla ve hep tam en yoğun saatte saldırılır. Bunun için ayda 50,00 EUR'dan başlayan, PrePaid ve asgari süresi olmayan Advanced DDoS Protection var. Fark, daha fazla kapasitede değil, kontrolde:

  • Dedicated koruma IP'si: Frankfurt çekirdek ağından verilir ve sunucunuz kendi ağımızın içinde bu adrese geçirilir. Sizin tarafınızda hiçbir değişiklik gerekmez.
  • Kendiniz yönetebileceğiniz, port ve protokol başına koruma kuralları: Müşteri panelinde 27015/UDP üzerinde neye ve 27015/TCP üzerinde neye izin verildiğini, bunun için bir talep yazmak zorunda kalmadan ayarlarsınız.
  • Değişiklikler gerçek zamanlı etki eder, yani bir sonraki bakım penceresini beklemek yerine süren bir saldırı sırasında ince ayar yapabilirsiniz.
  • Her oyuna uygun koruma profili, Garry's Mod ve diğer Source başlıkları için olduğu gibi, değiştirilmiş sunucular ve kendi uygulamalarınız için serbest TCP ve UDP profilleri de.

Burada da PrePaid modeli geçerlidir: asgari süre yok, fesih bildirim süresi yok, sözleşme yok ve kurulum ücreti yok. Saldırı dalgası bittiğinde yenilemezsiniz, bu kadar. Garry's Mod sunucusunu şimdiye kadar başka bir yerde işleten kişi bu korumayı KernelHost'a bir taşınma üzerinden alır, çünkü filtreleme kendi ağımızda yapılır, yabancı altyapıda değil.

İki koruma kademesinin karşılaştırması

Özellik Dâhil olan sürekli DDoS koruması Advanced DDoS Protection
Fiyat her sunucu paketinde dâhil, ek ücret olmadan ayda 50,00 EUR'dan başlar, PrePaid
Etkinleştirme teslimden itibaren etkin, kurulacak bir şey yok sipariş edilir, koruma IP'si alınır, sunucu geçirilir
Filtreleme kapasitesi 17 Tbps küresel scrubbing artı Frankfurt am Main'de 3,2 Tbps ile Arbor gerçek zamanlı filtreleme aynı iki kademeli filtreleme
IP adresi sunucunuzun IP adresi ek dedicated koruma IP'si
Kural seti otomatik profiller, yapılandırma gerekmez müşteri panelinde port ve protokol başına kendi kurallarınız
Değişiklikler otomatik olarak birlikte ilerler gerçek zamanlı etki eder, bir saldırı sırasında da
Oyun profili Garry's Mod dâhil yaygın oyunlar için optimize edilmiş profiller port başına seçilebilen profil, değiştirilmiş sunucular için de
Saldırı sırasında null routing hayır hayır
Süre sunucu paketine bağlı PrePaid, asgari süre yok, fesih bildirim süresi yok, kurulum ücreti yok

Garry's Mod topluluklarının çoğu için, dâhil olan sürekli koruma düzgün bir sunucu yapılandırmasıyla birlikte yeterlidir. Advanced DDoS Protection ise birinin meseleyi kişisel almasına verilen yanıttır.

Sık yapılan hatalar ve çözümleri

“Sunucu çalışıyor, ama sunucu tarayıcısından kayboldu”: Çoğunlukla 27015/UDP toptan engellenmiştir ya da fazla sıkı hız sınırlaması almıştır. Oyun trafiği ile sorgu aynı portu paylaştığı için kaba bir kural ikisini birden vurur. Bunun yerine bağlantısız paketlerle karşılaştırma yapan yöntemle çalışın. Port erişilebilir olduğu hâlde sunucu görünmez kalıyorsa sv_setsteamaccount ayarını kontrol edin: Geçerli bir Game Server Login Token olmadan bir Garry's Mod sunucusu listede ciddi biçimde geri düşürülür ve her sunucu kendi token'ına ihtiyaç duyar.

“iptables kuralım doğru ve buna rağmen etki etmiyor”: Üç neden sıktır. Kural UFW zincirlerinin arkasında duruyor ve hiç ulaşılmıyordur, son yeniden başlatmadan sonra kaybolmuştur (o zaman apt-get install -y iptables-persistent ile netfilter-persistent save komutları ya da /etc/ufw/before.rules dosyasındaki bir kayıt yardımcı olur) ya da saldırı hacimseldir ve kural, zaten dolu olan bir hatta doğru biçimde çalışıyordur. iptables -L INPUT -n -v komutuyla eşleşme sayaçlarının artıp artmadığını kontrol edin. Sayaçlar sıfırda kalıyorsa kurala ulaşılmıyor.

“DarkRP sunucum herkes için takılıyor, ama hat boş”: Bu neredeyse her zaman Lua'dır, hatta yapılan bir saldırı değil. Sunucu logunda hangi ağ olayının dikkat çekici sıklıkta geldiğine bakın ve ilgili addon'u oyuncu başına bir sınırlama açısından kontrol edin. sar -n DEV 1 10 ve düşürülen paket sayaçları dikkat çekmiyorsa bu bir DDoS saldırısı değildi.

“RCON birdenbire çalışmıyor”: DDoS değil, çoğunlukla kendi banınız. Eski parolaya sahip bir yönetim paneli sv_rcon_minfailures değerini tetikler ve sv_rcon_banpenalty adresi ayarlanan dakika sayısı boyunca banlar. Parolayı düzeltin, banı kaldırın, ardından portu kendi adresinize sınırlayın.

“IP adresini değiştirdim ve iki gün sonra yine çevrimdışıydım”: Bu normal durumdur. Sunucunuz ana sunucuya yeniden kaydolduğu anda yeni adresi kendisi yayınlar ve herkese açık adresi olmayan bir oyun sunucusunun oyuncusu olmaz. Bir adres değişikliği saatler ya da günler kazandırır, çözüm değildir.

“Önceki sağlayıcım IP adresimi kapattı”: Bu null routing'dir. Sağlayıcı bununla kendi ağını korur, sizin için sonuç başarılı bir saldırıyla aynıdır, genellikle sonrasında saatlerce de sürer. Tereddüt ederseniz filtreleme mi yapıldığını yoksa null routing mi uygulandığını sorun. Yanıt, erişilebilirliğiniz hakkında herhangi bir donanım bilgisinden daha çok şey belirler.

“tcpdump çıktısında dikkat çekici bir şey görmüyorum”: Trafik zaten önündeki ağda filtreleniyorsa sunucuya beklendiği gibi hiçbir şey ulaşmaz. Filtreleme çalışırken normal durum budur. Tersi de geçerlidir: Hat doyuma ulaştığında, ölçüm yapmak istediğiniz SSH oturumu bile size ulaşmayabilir. O durumda müşteri panelindeki VNC konsolunu kullanın.

Kısaca özetle

  • Bir Garry's Mod sunucusunun tam olarak bir açık porta ihtiyacı vardır: 27015/UDP. Oyun trafiği ile A2S sorgusu orada birlikte çalışır, ayrı bir sorgu portu yoktur.
  • RCON 27015/TCP üzerinde durur, parolayı düz metin olarak iletir ve yalnızca kendi adresiniz için açılmalı ya da bir SSH port yönlendirmesi üzerinden kullanılmalıdır.
  • Portu değil, 0xffffffff başlığına sahip bağlantısız paketleri sınırlayın. 27015/UDP üzerindeki toptan bir engelleme kendi oyuncularınızı dışarı atar.
  • En sık görülen Garry's Mod kesintisi bir DDoS saldırısı değil, sınırlaması olmayan bir ağ olayıdır: util.AddNetworkString ile kaydedilen her olay, oyuncu ve saniye başına bir üst sınıra ihtiyaç duyar.
  • 64 baytlık paketlerde 1 Gbit/s'lik bir hat saniyede yaklaşık 1,49 milyon paket taşır. Bunun üzerinde kayıp öndeki yönlendiricide oluşur ve her yerel kural etkisiz kalır.
  • KernelHost'ta iki kademeli sürekli koruma her sunucu paketinde ek ücret olmadan dâhildir: küresel scrubbing ağında 17 Tbps mitigasyon kapasitesi ve Frankfurt am Main'de 3,2 Tbps ile Arbor gerçek zamanlı filtreleme, null routing olmadan.
  • Kalıcı olarak hedefli biçimde ateş altında olan kişi, ayda 50,00 EUR'dan başlayan Advanced DDoS Protection'ı ekler: dedicated koruma IP'si, port ve protokol başına kendiniz yönetebileceğiniz kurallar, gerçek zamanlı etkili.

Sunucunuz hâlihazırda KernelHost'ta çalışıyorsa filtreleme, siz hiçbir şey yapmak zorunda kalmadan etkindir. Buna rağmen dikkat çekici bir durum fark ederseniz, IP adresiniz için filtreleme kurallarının yeniden ayarlanması amacıyla bir destek talebi açın. Bu sırada dört bilgiyi hemen verin: IP adresi, port, kendi saat diliminizdeki zaman aralığı ve ne gördüğünüz (oyuncular dışarı atılıyor, sunucu tarayıcıda yok, lag sıçramaları). Süren bir saldırı sırasında bize ek olarak +43 650 8209883 numarasındaki WhatsApp acil durum sohbeti üzerinden ulaşabilirsiniz.

Garry's Mod'un yanında başka Source başlıkları işleten kişi ortak temelleri CS2 ve Source sunucularını DDoS saldırılarına karşı koruma yazısında bulur, altyapının temiz biçimde nasıl kurulduğu ise SteamCMD ile oyun sunucusu kurma yazısında.

Sıkça sorulan sorular

Garry's Mod sunucum şu anda çevrimdışı. Bu bir DDoS saldırısı mı?
Önce CPU yükünü değil, paket hızını kontrol edin. sar -n DEV 1 10 komutu saniyedeki paket ve bayt sayısını, ip -s link show eth0 arayüzün düşürülen paket sayaçlarını, nstat -az ise kernel'in UDP hata sayaçlarını gösterir. Neredeyse kimse bağlı değilken gelen paketler normal değerinizin çok üzerine çıkıyorsa bu bir saldırıdır. Ağ sayaçları dikkat çekmiyor ve buna rağmen her şey takılıyorsa neden neredeyse her zaman Lua'dadır: O zaman bir addon ya da korunmasız bir ağ olayı işlem zamanını yer ve dünyadaki hiçbir filtreleme bunu değiştirmez.
Bir Garry's Mod sunucusu gerçekten hangi portlara ihtiyaç duyar?
Tam olarak birine: -port başlatma parametresiyle ayarlanan 27015/UDP portuna. Oyun trafiği ile sunucu tarayıcısının A2S sorgusu bu tek port üzerinden birlikte çalışır, Garry's Mod'da ayrı bir sorgu portu yoktur. RCON 27015/TCP üzerinde durur ve yalnızca kendi adresiniz için açılmalıdır. 27020/UDP portuna yalnızca SourceTV üzerinden yayın yapıyorsanız ihtiyaç duyarsınız. 27005/UDP istemci portu oyuncunun tarafından gider ve sunucuda kural gerektirmez. DarkRP için MySQL 127.0.0.1 adresine bağlanmalıdır ve asla açık ağa ait değildir.
Sorgu flood'u bitsin diye sorgu portunu engelleyebilir miyim?
Hayır, çünkü ayrı bir sorgu portu yok. 27015/UDP portunu engelleyen ya da toptan hız sınırlaması getiren kişi aynı hamleyle kendi oyuncularını dışarı atar ve sunucu tarayıcısından kaybolur. Doğru olan, yalnızca bağlantısız paketleri vuran bir sınırlamadır: Source engine'in bütün sunucu sorguları ve bağlantı kurulumları 0xffffffff dört baytıyla başlar, çoktan bağlanmış oyuncuların trafiğinde ise bu başlık yoktur. Tam bu kalıba nftables ya da iptables ile kaynak adres başına bir sınır koyarsınız, başlangıç değeri olarak saniyede yaklaşık sekiz paket.
Garry's Mod'da RCON neden bu kadar sevilen bir saldırı hedefi?
Çünkü kazanç en yüksek, eşik ise düşük. RCON oyunla aynı port numarasında, yalnızca TCP üzerinde durur ve böylece aramaya gerek kalmadan bulunur. Source RCON protokolü parolayı düz metin olarak, TLS olmadan ve anahtar değişimi olmadan iletir. Ve RCON'u ele geçiren kişi haritayı değiştirebilir, bütün oyuncuları banlayabilir, yapılandırmayı değiştirebilir ve sunucuyu durdurabilir, hem de hiç bant genişliği kullanmadan. Bu yüzden uzun ve rastgele bir parola koyun, sv_rcon_minfailures ile sv_rcon_banpenalty değerlerini etkinleştirin ve 27015/TCP portunu yalnızca kendi adresiniz için açın.
A2S yansıtma açığı nedir ve beni hâlâ etkiliyor mu?
A2S yansıtması, sunucunuzun hedef değil araç olduğu bir saldırıdır: Saldırgan sahte gönderen adresiyle binlerce oyun sunucusunu sorgular ve belirgin biçimde daha büyük yanıtlar asıl kurbanda toplanır. Bir A2S_INFO isteği tarihsel olarak 25 bayt büyüklüğündeydi ve US-CERT, Steam protokolünü 5,5 amplifikasyon faktörüyle veriyor. Valve bu açığı Kasım 2020'den itibaren kapattı: Sorgu paketlerinin 1.200 bayta kadar doldurulması gerekiyor, A2S_PLAYER ile A2S_RULES ise bir challenge talep ediyor. Sunucu binary'sini güncel tutun, o zaman bu koruma işler.
Güvenlik duvarı kuralım saldırı sırasında neden bir işe yaramıyor?
Çünkü ancak paket ulaştığında etki eder. 1 Gbit/s'lik bir hat, 64 baytlık paketlerde saniyede yaklaşık 1,49 milyon paket taşır, 10 Gbit/s'lik bir hat ise yaklaşık 14,88 milyon. Saldırı bunun üzerindeyse kayıp öndeki yönlendiricide oluşur ve kuralınız hiç yürütülmez. Bunun dışında hat dolmadan çok önce CPU tükenir, çünkü her paket ağ yığınından bir geçiş maliyeti çıkarır, sonradan düşürülse bile. Bu noktadan sonra yalnızca sunucunun önündeki ağda yapılan filtreleme yardımcı olur.
DarkRP sunucumda lag sıçramaları var, ama hat boş. Bunun nedeni nedir?
O zaman bu neredeyse her zaman Lua'dır, hatta yapılan bir saldırı değil. Bir addon util.AddNetworkString ile bir ağ olayı kaydettiği ve net.Receive ile onu dinlediği anda, bağlı her istemci bu olayı bir döngü içinde tetikleyebilir ve sunucu her bir mesajı tek tek yürütür. Bunun için saniyede birkaç kilobitle bağlı bir oyuncu yeterlidir. Çözüm güvenlik duvarında değil addon'da durur: oyuncu ve saniye başına bir üst sınır, mesaj uzunluğunun denetimi ve oyuncunun mesajın içeriğinden değil sunucu tarafında belirlenmesi.
KernelHost'taki sunucum bir saldırı sırasında çevrimdışı olur mu?
Hayır. Null routing kullanılmaz. IP adresiniz ağda kalır, yalnızca zararlı paketler düşürülür. Koruma iki kademeli kuruludur: küresel scrubbing ağında 17 Tbps mitigasyon kapasitesi ve Frankfurt am Main'de 3,2 Tbps ile Arbor gerçek zamanlı filtreleme. Koruma kalıcı olarak çalışır ve önce bir saldırıya tepki vermek zorunda değildir, yani oyuncularınızın dışarı atıldığı bir geçiş süresi yaşanmaz. Bu sürekli koruma her sunucu paketinde ek ücret olmadan bulunur ve teslimden itibaren etkindir.
Advanced DDoS Protection'a ne zaman ek olarak ihtiyaç duyarım?
Topluluğunuza ara sıra değil hedefli biçimde ve haftalar boyunca saldırıldığında ve filtrelemeyi kendiniz yönetmek istediğinizde. Dedicated bir koruma IP'si alırsınız ve koruma kurallarını port ile protokol başına, yani örneğin 27015/UDP için 27015/TCP'den farklı biçimde, müşteri panelinde kendiniz yönetirsiniz. Değişiklikler gerçek zamanlı etki eder, bu yüzden süren bir saldırı sırasında ince ayar yapabilirsiniz. Fiyat ayda 50,00 EUR'dan başlar, PrePaid, asgari süre, fesih bildirim süresi ve kurulum ücreti olmadan.

Garry's Mod Garry's Mod DDoS koruması DarkRP Source Engine A2S sorgusu Oyun sunucusu koruması Port 27015 Advanced DDoS Protection