Garry's Mod sunucusunu DDoS saldırılarına karşı koruma
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,
0xffffffffbaş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.AddNetworkStringile 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ı?
Bir Garry's Mod sunucusu gerçekten hangi portlara ihtiyaç duyar?
Sorgu flood'u bitsin diye sorgu portunu engelleyebilir miyim?
Garry's Mod'da RCON neden bu kadar sevilen bir saldırı hedefi?
A2S yansıtma açığı nedir ve beni hâlâ etkiliyor mu?
Güvenlik duvarı kuralım saldırı sırasında neden bir işe yaramıyor?
DarkRP sunucumda lag sıçramaları var, ama hat boş. Bunun nedeni nedir?
KernelHost'taki sunucum bir saldırı sırasında çevrimdışı olur mu?
Advanced DDoS Protection'a ne zaman ek olarak ihtiyaç duyarım?
2026 KernelHost GmbH. Tüm hakları saklıdır. Bu rehber telif hakkıyla korunmaktadır. Yazının başka web sitelerinde tamamen, kısmen ya da düzenlenmiş biçimde yayımlanması, yazılı iznimiz olmadan serbest değildir. Kaynak belirtilerek ve bağlantı verilerek yapılan alıntılar ise memnuniyetle karşılanır.

