Jak ochránit server Garry's Mod před DDoS útoky

Publikováno 22 min čtení

U Garry's Mod běží herní provoz a serverový dotaz přes stejný port 27015. Která pravidla na serveru skutečně účinkují, jak zabezpečíte RCon a síťové události v Lua, a od jaké velikosti útoku pomůže už jen filtrace v síti před serverem.

Server Garry's Mod, který večer v osm na tři minuty zmizí a pak se zase vrátí, má jen zřídka problém s hardwarem. V naprosté většině případů běží útok, a běží právě tehdy, když je připojeno nejvíc hráčů. Ochrana proti DDoS u Garry's Mod proto znamená nejdřív jedno: vědět, které pakety vůbec smějí na váš server dorazit. Tento článek ukazuje v tomto pořadí, co si v následujících deseti minutách bez jediné koruny zabezpečíte sami, kde tato opatření fyzikálně končí a co se potom musí odehrát v síti před serverem.

Všechny údaje se vztahují k serveru srcds na Debianu 12, Debianu 13, Ubuntu 22.04 LTS nebo Ubuntu 24.04 LTS. Konfigurační soubor leží v garrysmod/cfg/server.cfg, příkazy jsou psané pro uživatele root, jako běžný uživatel před ně předřaďte sudo. Vždy je míněn provoz na vlastním root serveru nebo dedikovaném serveru, ne slot u poskytovatele herních serverů.

Pokud útok právě probíhá: teď neměňte nic v souboru server.cfg a nerestartujte srcds. Nejdřív si zajistěte naměřené hodnoty (oddíl 9), po útoku už budou pryč. Restart vás připraví o čítače a server pak vrátí zpátky do téže záplavy.

Proč server Garry's Mod potřebuje ochranu proti DDoS

Server Garry's Mod svou IP adresu a svůj port zveřejňuje sám. To není omyl, ale předpoklad: kdo nestojí v prohlížeči serverů, nedostane nové hráče. Záznam vzniká tím, že se server přihlásí u Steam master serveru a potom odpovídá na každý dotaz A2S, který přijde zvenčí. Otázka tedy nikdy nezní, jestli útočník vaši adresu najde, ale jen co se stane, když na ni začne střílet.

K tomu přistupuje povaha komunit. Garry's Mod se převážně nehraje v kolech, ale v trvalých světech: komunita DarkRP vede hráčské účty, majetek, profese a postup celé měsíce v databázi. Výpadek v pátek večer proto stojí víc než prohraný zápas, stojí stálé hráče. Právě proto jsou konkurenční komunity, zabanovaní hráči a koupené server booter služby (služby, které za pár eur měsíčně spustí útok na libovolnou adresu) třemi nejčastějšími spouštěči. Útočník k tomu nepotřebuje ani schopnosti, ani znatelné peníze.

Technicky se sbíhají tři zvláštnosti. Herní provoz jede přes UDP, a UDP nezná navázání spojení, které by se dalo vyžadovat: zdrojové adresy se dají podvrhnout. Serverový dotaz leží na stejném portu jako hra, hrubá blokace tedy vždy zasáhne obojí. A nad tím vším leží Lua: každý doplněk z Workshopu přináší vlastní kód do téhož procesu a stačí jediná nechráněná síťová událost, aby jediný klient zpomalil server bez jakékoli šířky pásma. Co je DDoS útok obecně, vysvětluje článek Co je DDoS útok?.

Porty, o které u Garry's Mod ve skutečnosti jde

Server Garry's Mod startuje ve výchozím stavu na portu 27015, a to na UDP pro hru včetně serverového dotazu a na TCP pro RCON. Číslo se mění při spuštění parametrem -port, u více instancí se počítá nahoru (27016, 27017 a tak dále). Typický startovací příkaz vypadá takto:

./srcds_run -game garrysmod -console \
  -port 27015 \
  +maxplayers 64 \
  +gamemode darkrp \
  +map rp_downtown_v4c_v2 \
  +sv_setsteamaccount VAS_GSLT_TOKEN \
  +host_workshop_collection 123456789 \
  -authkey VAS_STEAM_WEB_API_KLIC

Z toho vyplývá celá útočná plocha. Následující tabulka je základem pro každé pravidlo firewallu dál v textu:

Port a protokol K čemu slouží Nastavitelné přes Patří do otevřené sítě
27015/UDP herní provoz a dotaz A2S na stejném portu -port ano, to je jediný port, který skutečně musí být otevřený
27015/TCP RCON, protokol Source RCON -port (stejné číslo jako hra) ne, jen pro vaši vlastní adresu
27005/UDP klientský port, vychází od hráče -clientport ne, na serveru není žádné pravidlo potřeba
27020/UDP SourceTV +tv_port jen pokud skutečně vysíláte
26901/UDP přihlášení u Steam master serveru odchozí ne, žádné příchozí pravidlo není potřeba
80/TCP a 443/TCP FastDL přes sv_downloadurl, pokud webový server leží na stejném stroji webový server jen pokud tam FastDL leží (lepší je oddělit)
3306/TCP MySQL pro DarkRP a hráčská data (přes modul mysqloo) bind-address ne, výhradně 127.0.0.1
22/TCP přístup SSH sshd_config ano, ale omezeně

Z těchto osmi záznamů patří do otevřené sítě bez omezení přesně jeden: 27015/UDP. Všechno ostatní se buď omezí na vaši vlastní adresu, naváže na 127.0.0.1, nebo se vůbec nespustí. Nejdražší myšlenkovou chybou v této oblasti je domněnka, že u Garry's Mod existuje oddělený query port, který se dá jednoduše zavřít. Ten neexistuje.

Co můžete udělat sami, než utratíte peníze

Tento oddíl je nejdelší, a to záměrně. Čistě nakonfigurovaný server Garry's Mod ustojí malé a střední útoky vlastními silami, nezávisle na tom, u koho stojí. Nic z toho nestojí peníze a většina je hotová za čtvrt hodiny.

1. Inventura: co vlastně naslouchá

Než napíšete jediné pravidlo, podívejte se, co váš server nabízí navenek. Nehádat, podívat se:

ss -lntup

Zajímavý je sloupec s lokální adresou. 0.0.0.0:27015 a [::]:27015 znamenají „dosažitelné z celého internetu“, 127.0.0.1:3306 znamená „jen lokálně“ a nepotřebuje žádné pravidlo firewallu. Na vzrostlém DarkRP serveru se tam téměř vždy najde víc služeb, než se čekalo: MariaDB, webový server pro FastDL, panel, Discord bot, druhý testovací server na 27016 a zapomenutá hlasová služba. Pohled útočníka poskytne sken portů zvenčí:

nmap -Pn -sU -sT -p- --min-rate 1000 VASE.IP.ADRESA.SERVERU

2. Nechat otevřené jen porty, které srcds skutečně potřebuje

Garry's Modu stačí jediné uvolnění navenek, k tomu SSH a omezený přístup k RCon. S UFW to vypadá takto, a to přesně v tomto pořadí, abyste se sami nevyzamkli:

ufw allow 22/tcp comment 'SSH'
ufw allow 27015/udp comment 'Garrys Mod hra a 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

Nahraďte 203.0.113.10 svou vlastní adresou. SourceTV na 27020/UDP uvolňujte jen tehdy, když skutečně vysíláte. Úplný návod včetně záchranné cesty najdete v článku Jak nastavit firewall UFW, aniž byste se sami vyzamkli. Pokud se to přesto stane: KVM root servery a dedikované servery od KernelHost nemají IPMI ani iDRAC, zpátky se dostanete přes VNC konzoli v zákaznické sekci. Ta nevisí na síťovém stacku hostovaného systému, pravidlo firewallu uvnitř ji zablokovat nemůže.

Databáze do otevřené sítě v žádném případě nepatří. Zkontrolujte v /etc/mysql/mariadb.conf.d/50-server.cnf, že tam stojí:

bind-address = 127.0.0.1

3. Omezit dotaz A2S, aniž byste vypadli ze seznamu serverů

Tady leží chyba, která stojí většinu serverů Garry's Mod. Protože herní provoz a serverový dotaz zabírají stejný port, vyhodí paušální blokace nebo příliš těsné omezení rychlosti na 27015/UDP vaše vlastní hráče a dokoná útok za útočníka. Správným bodem pro zásah je rozlišení mezi dotazovacími a herními pakety.

Engine k tomu přináší tři konzolové proměnné, které patří do souboru server.cfg. Jejich výchozí hodnoty jsou konzervativní, ale jsou nastavené:

sv_max_queries_sec 3
sv_max_queries_sec_global 60
sv_max_queries_window 30

sv_max_queries_sec omezuje zodpovězené dotazy na jednu zdrojovou adresu (výchozí 3 za sekundu), sv_max_queries_sec_global zastropuje součet přes všechny adresy (výchozí 60 za sekundu), sv_max_queries_window určuje okno pro průměrování (výchozí 30 sekund). Tyto hodnoty chrání procesor před tím, aby zbytečně vytvářel odpovědi. Nezabrání tomu, aby pakety dorazily, a kdo globální hodnotu nastaví velmi těsně, zmizí během útoku z prohlížeče serverů, protože nezodpovězené zůstanou i dotazy stránek se seznamy.

O úroveň níž se dá dotazovací provoz čistě oddělit. Všechny pakety bez spojení u Source Engine začínají čtyřmi nastavenými bajty (0xffffffff), provoz už připojených hráčů tuto hlavičku nemá. Přesně na to se dá pomocí nftables položit omezení rychlosti podle zdrojové adresy:

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
    }
}

Soubor nahrajete pomocí nft -f. Priorita -10 zajistí, že pravidlo zabere před filtrovacím řetězcem UFW, a @th,64,32 čte první čtyři bajty za hlavičkou UDP. S klasickým iptables odvede totéž porovnání pomocí u32:

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

Jeden bod, který skoro každý návod na internetu zamlčuje: bez spojení není jen serverový dotaz, ale i navázání spojení. Přicházející hráč posílá několik paketů se stejnou hlavičkou, než je ve hře. Příliš těsná mez proto vyzamkne nové hráče, přestože server zůstane dosažitelný. Začněte velkoryse (8 až 15 paketů za sekundu a adresu) a mez přitáhněte teprve tehdy, když jste měřili týden normálního provozu.

4. Zabezpečit RCon, nebo ho úplně vypnout

RCon je u serverů na Source oblíbeným cílem, a to ze tří důvodů zároveň. Zaprvé leží na stejném čísle portu jako hra, jen na TCP, a je tedy nalezený bez hledání. Zadruhé protokol Source RCON přenáší heslo v otevřeném textu, bez TLS a bez výměny klíčů: kdo provoz odposlouchává, má ho. Zatřetí je zisk maximální, protože kdo má RCon, může měnit mapu, zabanovat všechny hráče, změnit konfiguraci a server zastavit. Útočník, který přebere RCon, už žádnou šířku pásma nepotřebuje.

rcon_password nikdy nenechávejte prázdné a nikdy uhodnutelné, hodnota z openssl rand -base64 32 stačí. Proti pokusům o přihlášení přináší engine vlastní brzdu:

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

Tím se adresa po třech neúspěšných pokusech během 30 sekund zablokuje na jeden den. Dvě varování k tomu. Zaprvé přesně tento mechanismus vyzamkne i váš vlastní administrátorský panel, pokud je tam uložené staré heslo: to, co provozovatelé hlásí jako „RCon najednou nefunguje“, je většinou vlastní blokace. Zadruhé zůstává omezení ve firewallu z kroku 2 účinnější, protože pokus vůbec nepustí až k aplikaci. Kdo RCon potřebuje jen občas, nechá port úplně zavřený a pracuje přes přesměrování portu v SSH:

ssh -N -L 27015:127.0.0.1:27015 root@VASE.IP.ADRESA.SERVERU

5. Omezit síťové zprávy v Lua, nejčastější vlastní výpadek

Značná část výpadků serverů Garry's Mod hlášených jako DDoS žádným DDoS není. Jsou to přetížení v Lua, vyvolaná jediným připojeným klientem s několika kilobity za sekundu. Důvod leží ve stavbě knihovny net: jakmile doplněk zaregistruje pomocí util.AddNetworkString síťovou událost a pomocí net.Receive na ni naslouchá, může každý klient tuto událost vyvolávat ve smyčce. Bez vlastního omezení server provede každou jednotlivou zprávu. Facepunch to ve svých hlášeních o chybách několikrát zdokumentoval a řešení v engine nepředpokládal, omezení je výslovně úkolem autora doplňku.

Zkontrolujte proto každý vlastní i každý zakoupený doplněk na tři věci: horní mez na hráče a sekundu, kontrolu délky zprávy a to, že se hráč zjišťuje na straně serveru z druhého parametru, a ne z obsahu zprávy. Nosný vzor vypadá takto:

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)

K tomu patří dva řádky v souboru server.cfg. sv_allowcslua je v Garry's Mod ve výchozím stavu na 1 a dovoluje klientům spouštět vlastní kód pomocí lua_run_cl a lua_openscript_cl: u veřejného serveru patří hodnota na 0. A sv_kickerrornum odpojí klienty, kteří vytvoří více než uvedený počet chyb na straně klienta (výchozí 0, tedy vypnuto):

sv_allowcslua 0
sv_kickerrornum 25

6. Oddělit obsah z Workshopu a FastDL od herního serveru

Doplňky z Workshopu nejsou u Garry's Mod okrajové téma, ale běžný stav: komunita DarkRP připojuje svou kolekci pomocí +host_workshop_collection a klienti si tento obsah stahují přímo ze Steamu. Vaši linku to nezatěžuje. Klíč z -authkey je klíč Steam Web API a patří s ním zacházet jako s heslem: do spouštěcího skriptu, ne do veřejného repozitáře a ne do kanálu na Discordu.

Šířku pásma stojí druhá cesta. Všechno, co nepřichází z Workshopu (vlastní mapy, zvuky, materiály), jde přes stahovací kanál. Bez sv_downloadurl běží tento kanál přes samotný herní port a soutěží přímo s herním provozem. S FastDL běží přes HTTP. Když tento webový server leží na stejném stroji a na stejné IP adrese, dělí se oba o stejnou linku: vlna připojení nebo útok na 80/TCP tím zasáhne i hru. Rozumné jsou tyto hodnoty:

sv_downloadurl "https://fastdl.vase-domena.cz/garrysmod/"
sv_allowdownload 1
sv_allowupload 0
net_maxfilesize 64

sv_allowupload 0 bere klientům možnost posílat vlastní soubory na server a zavírá tím cestu, která není ani potřeba, ani pod kontrolou. net_maxfilesize omezuje v megabajtech velikost souborů přenášených herním kanálem. Pokud to jde, položte FastDL na jiný stroj nebo za vlastní jméno, pak zátěž neleží na stejné adrese jako herní port.

7. Zachytit záplavu připojení a vyčerpání slotů

Vyčerpání slotů je útok, který nepotřebuje šířku pásma: útočník obsadí automatizovanými spojeními všechna volná místa, takže skuteční hráči vidí plný server. U Garry's Mod k tomu přitěžuje, že každé připojení stojí server práci, protože se vyjednává seznam prostředků a herní režim, dávno předtím, než je hráč ve hře.

Proti tomu působí čtyři věci. Zaprvé realistická horní mez: nastavit +maxplayers výš, než váš herní režim snese, jen zvětšuje útočnou plochu. Zadruhé sv_timeout, které určuje, po kolika sekundách bez zprávy se klient odpojí (v rozšířených konfiguracích 120): kdo se chce visících polovičních spojení zbavit rychleji, nastaví hodnotu nižší. Zatřetí omezení rychlosti paketů bez spojení z kroku 3, protože navázání spojení jde právě přes ně. Začtvrté, pro zavřené skupiny, heslo serveru:

sv_password "stala_skupina_2026"
sv_timeout 90
sv_filterban 1
sv_region 3

Skutečnou whitelist Garry's Mod nepřináší, ta přichází přes rozšíření jako ULX nebo přes vlastní kontrolu v hooku CheckPassword. A jedno musí být jasné: whitelist chrání vaši herní logiku, ne vaši linku. Útočník, který váš server zaplavuje, vůbec nechce vstoupit. Jeho pakety budou odmítnuty, ale přesto dorazily, a právě v tom je ten bod.

8. Odlehčit jádru: sledování spojení a přijímací vyrovnávací paměť

Tento krok vysvětluje výpadky, které vypadají jako objemový útok, ale nejsou jím. Jádro zakládá pro provoz UDP záznamy ve sledování spojení (conntrack) a při podvržených zdrojových adresách znamená každá adresa nový záznam. Když se tabulka naplní, zahazuje jádro pakety bez rozdílu: útok i vaši hráči vylétnou společně a v systémovém protokolu stojí „nf_conntrack: table full“. Stav a horní mez ukáže:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

Nejúčinnějším krokem je herní provoz vůbec nenechat sledovat, protože engine si své sezení spravuje sám:

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
    }
}

S iptables je obdobou iptables -t raw -A PREROUTING -p udp --dport 27015 -j NOTRACK a stejný řádek pro OUTPUT s --sport. Port potom potřebuje výslovné uvolnění, protože bez sledování už nezabere žádné pravidlo, které kontroluje existující stav. Pokud navíc pakety přicházejí rychleji, než je srcds odebírá, přeteče přijímací vyrovnávací paměť, a pro hráče to vypadá jako ztráta paketů na volné lince:

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

Řádky patří do souboru v /etc/sysctl.d/ a aktivují se pomocí sysctl --system. Jestli jsou potřeba, prozradí jádro samo: stoupá-li UdpRcvbufErrors v nstat -az, pak zabírají. Zůstává-li čítač na nule, úprava nic nezmění. To je rezerva, ne ochrana.

9. Zajistit naměřené hodnoty, dokud vše běží normálně

Nejdůležitější krok je ten, který skoro nikdo neudělá předem: založit si srovnávací základnu. Bez normální hodnoty nedokážete po incidentu říct, jestli bylo 40 000 paketů za sekundu hodně, nebo jestli to byl prostě sobotní večer. Normální hodnotu pro svůj server si jednou spočítejte: 64 hráčů s cl_cmdrate 66 vytvoří zhruba 4 200 příchozích paketů za sekundu, všechno výrazně nad tím si žádá vysvětlení. S apt-get install -y vnstat sysstat běží měření trvale. Během incidentu stačí čtyři příkazy:

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"

První ukáže pakety a bajty za sekundu, druhý čítače zahozených paketů na rozhraní, třetí čítače chyb UDP v jádře. Čtvrtý řádek ukáže výhradně pakety bez spojení, tedy právě tu třídu, kterou záplava dotazů zneužívá: naplní-li se čítač během sekund, zatímco je připojeno málo lidí, máte svou odpověď. tcpdump vždy omezte pomocí -c, záznam při plném zatížení dodatečně zatěžuje už tak přetížený server. Jak naměřené hodnoty vyhodnotit, stojí v článku Jak poznat DDoS útok na serveru.

Co je A2S reflection a týká se mě ještě

A2S reflection je útok, u kterého není váš server cílem, ale nástrojem. Útočník posílá malý dotaz s podvrženou zdrojovou adresou na tisíce herních serverů a jejich výrazně větší odpovědi se sbíhají u skutečné oběti. Historicky měl dotaz A2S_INFO 25 bajtů (4 bajty 0xFFFFFFFF, 1 bajt 0x54, k tomu 20 bajtů pro řetězec „Source Engine Query“), odpověď naopak několik set bajtů. US-CERT vede protokol Steamu ve svém seznamu zesilovacích útoků s faktorem 5,5, což znamená: z jednoho gigabitu u útočníka se u oběti stane 5,5 gigabitu.

Valve tuto mezeru od listopadu 2020 zavřelo, a to dvěma cestami. Dotazovací pakety bez spojení musí od té doby odesílatel vyplnit na 1 200 bajtů, čímž je dotaz větší než odpověď a faktor zesílení spadne pod 1. Během přechodu si provozovatelé mohli přísnější chování vynutit předem pomocí proměnné prostředí STEAM_GAMESERVER_MIN_CONNECTIONLESS_PACKET_SIZE=1200. Navíc server u A2S_PLAYER a A2S_RULES neodpovídá hned daty, ale výzvou (S2C_CHALLENGE), kterou musí tazatel poslat zpátky ve druhém dotazu. Kdo zdrojovou adresu podvrhuje, tuto výzvu nikdy neuvidí.

Pro vás z toho plynou dvě věci. Udržujte binárku serveru aktuální, protože ochrana je uložená v podloží Steam Gameserveru, a ne ve vaší konfiguraci. A nezaměňujte reflection se záplavou dotazů proti vám samotným: proti druhé formě pomůže výhradně omezení rychlosti z kroku 3 a nad to filtrace v síti před serverem.

Kde tato opatření končí: šířka pásma a paketová rychlost

Teď část, kterou nevyřeší žádný konfigurační soubor. Všechno dosud popsané běží na vašem serveru, tedy na konci linky. Pravidlo firewallu rozhoduje o paketu, který už po kabelu proběhl. Můžete ho zahodit, ale nemůžete ho udělat neodeslaným.

Spočítejte si to jednou. Typický herní server visí na 1 Gbit/s, to je 125 megabajtů za sekundu, a linka je plná, jakmile někdo pošle víc. Druhá veličina udeří většinou dřív: u nejmenších možných paketů o velikosti 64 bajtů se do 1 Gbit/s vejde zhruba 1,49 milionu paketů za sekundu, do 10 Gbit/s zhruba 14,88 milionu. Běžné serverové jádro jich podle procesoru a síťové karty zpracuje několik set tisíc, než začne zahazovat. Útok, který vaši linku nezaplní ani do třetiny, tedy může váš server položit, protože výpočetní čas padne na zahazování. Provozovatelé to zažívají jako „vytížení přece vůbec nebylo vysoké, a stejně měli všichni lag spiky“.

Ukazatel Hodnota
dotaz A2S_INFO, historická velikost 25 bajtů
faktor zesílení protokolu Steamu (US-CERT) 5,5
minimální velikost dotazovacích paketů bez spojení od roku 2020 1 200 bajtů
normální provoz: 64 hráčů při cmdrate 66 zhruba 4 200 příchozích paketů za sekundu
1 Gbit/s při paketech o velikosti 64 bajtů zhruba 1,49 milionu paketů za sekundu (125 megabajtů za sekundu)
10 Gbit/s při paketech o velikosti 64 bajtů zhruba 14,88 milionu paketů za sekundu
typická velikost útoku proti komunitním herním serverům 5 až 50 Gbit/s
špička naměřená na serverech KernelHost 473,4 Gbit/s při 41,5 milionu paketů za sekundu

Pro zařazení, jaké velikosti se reálně vyskytují: na serverech KernelHost byl mimo jiné odfiltrován UDP flood s více než 112,2 Gbit/s a více než 8,7 milionu paketů za sekundu proti hernímu serveru, a dále útok s mnoha vektory s více než 473,4 Gbit/s a více než 41,5 milionu paketů za sekundu proti hlasovému serveru. 473,4 Gbit/s je zhruba 470násobek přípojky 1 Gbit/s a stále ještě zhruba 47násobek přípojky 10 Gbit/s. Na to neexistuje žádné lokální nastavení. Volumetrické útoky musí skončit v síti před serverem.

Co proti tomu staví KernelHost

Trvalá ochrana, která je v každém serverovém balíčku

Ochrana proti DDoS od KernelHost je postavená dvoustupňově a je trvale aktivní, aniž byste museli cokoli zapínat, objednávat nebo konfigurovat:

  • Stupeň 1: 17 Tbps mitigační kapacity v globální scrubbingové síti. Volumetrické útoky se čistí blízko svého zdroje, ještě než vůbec dorazí do datacentra.
  • Stupeň 2: filtrace Arbor v reálném čase s 3,2 Tbps ve Frankfurtu nad Mohanem. Přímo před serverem se rozpoznávají a zahazují vzory specifické pro jednotlivé protokoly, paket po paketu.

Rozhodující jsou dvě vlastnosti. Ochrana běží trvale a nemusí na útok teprve reagovat, nejsou tedy žádné doby přepnutí, ve kterých by vaši hráči vylétli. A nepoužívá se nullrouting: vaše IP adresa zůstává v síti, zahazují se jen škodlivé pakety. Kdo IP adresu ze sítě stáhne, dosáhne pro vás stejného výsledku jako útočník. Stanovištěm je Frankfurt nad Mohanem. Které hry a protokoly jsou pokryté, vypisuje článek Ochrana herních serverů proti DDoS v reálném čase.

Advanced DDoS Protection pro trvale ostřelované komunity

Některé projekty nejsou napadány příležitostně, ale cíleně a celé týdny, s měnícími se vzory a vždy přesně v hlavním čase. Pro ty existuje Advanced DDoS Protection od 50,00 EUR měsíčně, PrePaid a bez minimální doby trvání. Rozdíl neleží ve větší kapacitě, ale v kontrole:

  • Dedikovaná chráněná IP z frankfurtského jádra, na kterou se váš server v naší vlastní síti přepne. Na vaší straně není žádná přestavba nutná.
  • Vlastnoručně spravovatelná ochranná pravidla podle portu a protokolu v zákaznické sekci: nastavíte, co je povolené na 27015/UDP a co na 27015/TCP, bez toho, abyste k tomu psali ticket.
  • Změny se projeví v reálném čase, můžete tedy doladit nastavení i během probíhajícího útoku, místo abyste čekali na nejbližší servisní okno.
  • Ochranný profil odpovídající dané hře, pro Garry's Mod a ostatní tituly na Source stejně jako volné profily TCP a UDP pro upravené servery a vlastní aplikace.

I zde platí model PrePaid: žádná minimální doba trvání, žádná výpovědní lhůta, žádná smlouva a žádný zřizovací poplatek. Když vlna útoků skončí, jednoduše neprodloužíte. Kdo svůj server Garry's Mod dosud provozuje jinde, dostane tuto ochranu přes přesun ke KernelHost, protože se filtruje ve vlastní síti, a ne na cizí infrastruktuře.

Srovnání obou stupňů ochrany

Vlastnost Zahrnutá trvalá ochrana proti DDoS Advanced DDoS Protection
Cena obsažena v každém serverovém balíčku, bez příplatku od 50,00 EUR měsíčně, PrePaid
Aktivace aktivní od zřízení, není co nastavovat objednat, obdržet chráněnou IP, server se přepne
Filtrační kapacita 17 Tbps globální scrubbing plus filtrace Arbor v reálném čase s 3,2 Tbps ve Frankfurtu nad Mohanem stejná dvoustupňová filtrace
IP adresa IP adresa vašeho serveru navíc dedikovaná chráněná IP
Sada pravidel automatické profily, žádná konfigurace není nutná vlastní pravidla podle portu a protokolu v zákaznické sekci
Změny probíhají automaticky projeví se v reálném čase, i během útoku
Herní profil optimalizované profily pro běžné hry, Garry's Mod včetně profil volitelný podle portu, i pro upravené servery
Nullrouting během útoku ne ne
Doba trvání vázaná na serverový balíček PrePaid, žádná minimální doba trvání, žádná výpovědní lhůta, žádný zřizovací poplatek

Většině komunit Garry's Mod stačí zahrnutá trvalá ochrana spolu s čistou konfigurací serveru. Advanced DDoS Protection je odpovědí na to, že si to někdo vzal osobně.

Časté chyby a jejich řešení

„Server běží, ale zmizel z prohlížeče serverů“: Většinou byl 27015/UDP paušálně zablokován nebo příliš těsně omezen v rychlosti. Protože herní provoz a dotaz sdílejí stejný port, zasáhne hrubé pravidlo obojí. Pracujte místo toho s porovnáním na pakety bez spojení. Zůstává-li server neviditelný i při dosažitelném portu, zkontrolujte sv_setsteamaccount: bez platného Game Server Login Tokenu je server Garry's Mod v seznamu silně znevýhodněn a každý server potřebuje vlastní token.

„Moje pravidlo iptables je správné a přesto nezabírá“: Časté jsou tři příčiny. Pravidlo stojí až za řetězci UFW a nikdy se na ně nedojde, po posledním restartu bylo pryč (pak pomůže apt-get install -y iptables-persistent a netfilter-persistent save nebo záznam v /etc/ufw/before.rules), nebo je útok volumetrický a pravidlo pracuje správně na lince, která je už plná. Zkontrolujte pomocí iptables -L INPUT -n -v, zda stoupají čítače zásahů. Zůstávají-li na nule, pravidlo se nedostane ke slovu.

„Můj DarkRP server se trhá všem, ale linka je klidná“: To je téměř vždy Lua a ne útok na linku. Podívejte se do serverového protokolu, která síťová událost přichází nápadně často, a zkontrolujte u příslušného doplňku omezení na jednoho hráče. Zůstávají-li sar -n DEV 1 10 a čítače zahozených paketů nenápadné, nebyl to DDoS útok.

„RCon najednou nefunguje“: Žádný DDoS, ale většinou vlastní blokace. Administrátorský panel se starým heslem spustí sv_rcon_minfailures a sv_rcon_banpenalty zablokuje adresu na nastavený počet minut. Opravit heslo, zrušit blokaci, potom omezit port na vlastní adresu.

„Vyměnil jsem IP adresu a za dva dny jsem byl zase offline“: To je běžný stav. Váš server novou adresu zveřejní sám, jakmile je znovu přihlášený u master serveru, a herní server bez veřejné adresy nemá hráče. Výměna adresy získá hodiny až dny, řešení to není.

„Můj dosavadní poskytovatel zablokoval moji IP adresu“: To je nullrouting. Poskytovatel tím chrání vlastní síť, pro vás je výsledek totožný s úspěšným útokem, většinou ještě hodiny poté. V případě pochybností se ptejte, zda se filtruje, nebo nulluje. Odpověď rozhoduje o vaší dostupnosti víc než jakýkoli údaj o hardwaru.

„V tcpdump nevidím nic nápadného“: Když se provoz filtruje už v síti před serverem, na server podle očekávání nic nedorazí. To je při funkční filtraci normální stav. Naopak platí: je-li linka nasycená, nemusí se k vám dostat ani SSH relace, kterou jste chtěli měřit. Použijte pak VNC konzoli v zákaznické sekci.

Stručné shrnutí

  • Server Garry's Mod potřebuje přesně jeden otevřený port: 27015/UDP. Herní provoz a dotaz A2S tam běží společně, oddělený query port neexistuje.
  • RCon leží na 27015/TCP, přenáší heslo v otevřeném textu a patří uvolnit výhradně na vlastní adresu nebo k němu chodit přes přesměrování portu v SSH.
  • Neomezujte port, ale pakety bez spojení s hlavičkou 0xffffffff. Paušální blokace na 27015/UDP vyhodí vaše vlastní hráče.
  • Nejčastější výpadek u Garry's Mod není DDoS útok, ale síťová událost bez omezení: každá událost zaregistrovaná pomocí util.AddNetworkString potřebuje horní mez na hráče a sekundu.
  • Při paketech o velikosti 64 bajtů unese linka 1 Gbit/s zhruba 1,49 milionu paketů za sekundu. Nad tím vzniká ztráta na routeru před ní a každé lokální pravidlo je bez účinku.
  • U KernelHost je dvoustupňová trvalá ochrana obsažena v každém serverovém balíčku bez příplatku: 17 Tbps mitigační kapacity v globální scrubbingové síti a filtrace Arbor v reálném čase s 3,2 Tbps ve Frankfurtu nad Mohanem, bez nullroutingu.
  • Kdo je trvale a cíleně ostřelován, doplní Advanced DDoS Protection od 50,00 EUR měsíčně: dedikovaná chráněná IP, vlastnoručně spravovatelná pravidla podle portu a protokolu, účinná v reálném čase.

Běží-li váš server už u KernelHost, je filtrace aktivní, aniž byste museli cokoli dělat. Pokud přesto zaznamenáte nesrovnalosti, otevřete ticket na podporu, aby se filtrační pravidla pro vaši IP adresu doladila. Uveďte přitom hned čtyři údaje: IP adresu, port, časové rozmezí ve vašem časovém pásmu a co vidíte (hráči vylétávají, server není v prohlížeči, lag spiky). Během probíhajícího útoku nás navíc zastihnete přes nouzový chat na WhatsAppu na čísle +43 650 8209883.

Kdo vedle Garry's Mod provozuje další titul na Source, najde společné základy v článku Jak ochránit servery CS2 a Source před DDoS útoky, a jak se čistě postaví podloží, stojí v článku Instalace herního serveru pomocí SteamCMD.

Časté dotazy

Můj server Garry's Mod je právě offline. Je to DDoS útok?
Zkontrolujte nejdřív paketovou rychlost, ne zatížení procesoru. Příkaz sar -n DEV 1 10 ukáže pakety a bajty za sekundu, ip -s link show eth0 čítače zahozených paketů na rozhraní, nstat -az čítače chyb UDP v jádře. Stoupají-li příchozí pakety výrazně nad vaši normální hodnotu, zatímco je připojeno málo lidí, jde o útok. Zůstávají-li síťové čítače nenápadné a přesto se všechno trhá, leží příčina téměř vždy v Lua: pak výpočetní čas žere doplněk nebo nechráněná síťová událost a žádná filtrace na světě s tím nic neudělá.
Které porty server Garry's Mod skutečně potřebuje?
Přesně jeden: 27015/UDP, nastavený startovacím parametrem -port. Přes tento jediný port běží společně herní provoz a dotaz A2S z prohlížeče serverů, oddělený query port u Garry's Mod neexistuje. RCon leží na 27015/TCP a patří uvolnit výhradně pro vaši vlastní adresu. 27020/UDP potřebujete jen tehdy, když vysíláte přes SourceTV. Klientský port 27005/UDP vychází od hráče a na serveru žádné pravidlo nepotřebuje. MySQL pro DarkRP patří navázat na 127.0.0.1 a nikdy do otevřené sítě.
Můžu zablokovat query port, aby záplava dotazů přestala?
Ne, protože oddělený query port neexistuje. Kdo zablokuje 27015/UDP nebo na něm paušálně omezí rychlost, vyhodí tím zároveň vlastní hráče a zmizí z prohlížeče serverů. Správné je omezení, které zasáhne jen pakety bez spojení: všechny serverové dotazy a navázání spojení u Source Engine začínají čtyřmi bajty 0xffffffff, provoz už připojených hráčů tuto hlavičku nemá. Přesně na tento vzor položíte pomocí nftables nebo iptables mez podle zdrojové adresy, jako výchozí hodnotu třeba osm paketů za sekundu.
Proč je RCon u Garry's Mod tak oblíbeným cílem útoku?
Protože zisk je maximální a překážka nízká. RCon leží na stejném čísle portu jako hra, jen na TCP, a je tedy nalezený bez hledání. Protokol Source RCON přenáší heslo v otevřeném textu, bez TLS a bez výměny klíčů. A kdo RCon přebere, může měnit mapu, zabanovat všechny hráče, změnit konfiguraci a server zastavit, úplně bez šířky pásma. Nastavte proto dlouhé náhodné heslo, zapněte sv_rcon_minfailures a sv_rcon_banpenalty a 27015/TCP uvolněte jen pro svou vlastní adresu.
Co je mezera A2S reflection a týká se mě ještě?
A2S reflection je útok, u kterého váš server není cílem, ale nástrojem: útočník se dotazuje tisíců herních serverů s podvrženou zdrojovou adresou a výrazně větší odpovědi se sbíhají u skutečné oběti. Dotaz A2S_INFO měl historicky 25 bajtů a US-CERT vede protokol Steamu s faktorem zesílení 5,5. Valve tuto mezeru od listopadu 2020 zavřelo: dotazovací pakety musí být vyplněné na 1 200 bajtů a A2S_PLAYER i A2S_RULES vyžadují výzvu. Udržujte binárku serveru aktuální, pak tato ochrana zabírá.
Proč moje pravidlo firewallu během útoku nic nepřinese?
Protože zabere teprve tehdy, když už paket dorazil. Linka 1 Gbit/s unese při paketech o velikosti 64 bajtů zhruba 1,49 milionu paketů za sekundu, linka 10 Gbit/s zhruba 14,88 milionu. Leží-li útok nad tím, vzniká ztráta na routeru před ní a vaše pravidlo se nikdy neprovede. Dávno předtím, než je linka plná, je navíc na konci procesor, protože každý paket stojí jeden průchod síťovým stackem, i když se pak zahodí. Od tohoto bodu pomůže jen filtrace v síti před serverem.
Můj DarkRP server má lag spiky, ale linka je klidná. Čím to je?
Pak je to téměř vždy Lua a ne útok na linku. Jakmile doplněk zaregistruje pomocí util.AddNetworkString síťovou událost a pomocí net.Receive na ni naslouchá, může každý připojený klient tuto událost vyvolávat ve smyčce a server provede každou jednotlivou zprávu. Stačí k tomu hráč s několika kilobity za sekundu. Řešení leží v doplňku, a ne ve firewallu: horní mez na hráče a sekundu, kontrola délky zprávy a zjištění hráče na straně serveru místo z obsahu zprávy.
Půjde můj server u KernelHost během útoku offline?
Ne. Nullrouting se nepoužívá. Vaše IP adresa zůstává v síti, zahazují se jen škodlivé pakety. Ochrana je postavená dvoustupňově: 17 Tbps mitigační kapacity v globální scrubbingové síti a filtrace Arbor v reálném čase s 3,2 Tbps ve Frankfurtu nad Mohanem. Běží trvale a nemusí na útok teprve reagovat, není tedy žádná doba přepnutí, ve které by vaši hráči vylétli. Tato trvalá ochrana je obsažena v každém serverovém balíčku bez příplatku a je aktivní od zřízení serveru.
Kdy potřebuji navíc Advanced DDoS Protection?
Když je vaše komunita napadána ne příležitostně, ale cíleně a celé týdny, a chcete filtraci řídit sami. Dostanete dedikovanou chráněnou IP a ochranná pravidla podle portu a protokolu spravujete sami v zákaznické sekci, tedy 27015/UDP jinak než 27015/TCP. Změny se projeví v reálném čase, můžete tedy doladit nastavení i během probíhajícího útoku. Cena začíná na 50,00 EUR měsíčně, PrePaid, bez minimální doby trvání, bez výpovědní lhůty a bez zřizovacího poplatku.

Garry's Mod Garry's Mod ochrana proti DDoS DarkRP Source Engine dotaz A2S ochrana herního serveru Port 27015 Advanced DDoS Protection