Proč se herní servery napadají jinak
Každý server má limity — přenosové pásmo, spojení, CPU, paměť — a útok odepření služby existuje proto, aby některý z nich vyčerpal. U webu bývá nejlevnější vyčerpat pásmo nebo propustnost požadavků. U Minecraft serveru to skoro nikdy není pásmo. Je to práce na jedno spojení.
Zamyslete se, co vanilla server udělá, když se někdo připojí. Přijme TCP spojení, přečte handshake, a pokud se spojení chce přihlásit, vygeneruje šifrovací výzvu, počká na odpověď klienta, provede RSA dešifrování a udělá HTTPS dotaz na session servery Mojangu, aby ověřil, že je účet skutečný. Teprve pak začne načítat hráče do světa. Každý z těch kroků je skutečná práce a každý z nich umí spustit spojení, které nikdy nemá v úmyslu hrát.
Přesně v téhle asymetrii je celý útok. Poslat pokus o přihlášení stojí útočníka pár paketů. Odpovědět na něj stojí server kryptografickou operaci a dotaz na třetí stranu. Vynásobte to pronajatým botnetem a serveru nedojde pásmo — dojde mu schopnost dál tikat, a hráči, kteří ve světě už jsou, sledují propad tick rate.
Stejný tvar má i mnohem levnější varianta: ping do seznamu serverů. Posílá ho každý klient, který má váš server v seznamu, a odpovídat na něj je normální chování. Posílá se ale zdarma a odpovídá se na něj trochu draze, což z něj odjakživa dělá způsob, jak zatěžovat server, který nic neudělal. Ping flood nikoho nevyhodí, ale zhasne váš záznam v seznamu přesně ve chvíli, kdy vás lidé hledají.
Čtyři věci, které na server opravdu létají
Floody spojení otevírají TCP spojení a nic s nimi nedělají, případně je otevírají a zavírají tak rychle, jak síť dovolí. Cena je v accept smyčce a stavu na spojení, ne v datech.
Join floody (bot útoky) jdou dál a dokončí přihlášení, obvykle s náhodně vygenerovaným jménem. Tohle je ta drahá varianta a většina lidí ji myslí, když říká, že jim někdo „nabotil" server. Více v článku Bot útoky na Minecraft server.
Ping floody bombardují stavový endpoint pro seznam serverů. Levné na odeslání a shodí veřejný záznam serveru, aniž by se dotkly samotné hry.
Objemové floody jsou klasický případ — hrubý UDP nebo amplifikovaný provoz, který má nasytit síťovou linku. Z těch čtyř jsou nejméně specifické pro Minecraft a jsou tou jedinou věcí, kterou provozovatel serveru opravdu nevyřeší na úrovni softwaru: linka je plná dřív, než pakety dorazí ke stroji. Tuhle vrstvu musí pohltit síť nad vámi, která na to má kapacitu. Obecný přehled najdete v článku Co je DDoS útok?.
| Útok | Co stojí útočníka | Co stojí server |
|---|---|---|
| Flood spojení | TCP handshake | Accept, stav socketu, časovače |
| Join flood | Handshake a přihlašovací paket | Šifrování, dotaz na session server, načtení světa |
| Ping flood | Jeden malý paket | Stavová odpověď, znovu a znovu |
| Objemový flood | Pronajatá amplifikace | Samotnou síťovou linku, ještě než server něco uvidí |
Proč vás plugin nezachrání
Antibot pluginy jsou první věc, po které většina provozovatelů sáhne, a proti nejhrubším útokům pomůžou. Mají ale strukturální strop: plugin běží uvnitř procesu serveru. Ve chvíli, kdy smí rozhodnout, server už spojení přijal, alokoval pro něj stav, rozparsoval protokol a podle typu útoku i provedl kryptografii. Plugin může zabránit tomu, aby se hráč dostal do světa. Nemůže zabránit tomu, že server za ten pokus už zaplatil.
Totéž platí pro pravidla firewallu na samotném stroji. Jsou lepší — pakety se zahodí dřív — ale pořád jsou na stroji, na jehož zdroje útok míří, a rozhodovat umí jen podle adres. Botnet je tisíce adres, z nichž se každá chová normálně.
Ochrana musí sedět tam, kudy útok musí projít dřív, než server vydá cokoli.
Co místo toho dělá ochranná proxy
Reverzní proxy pro Minecraft funguje stejně jako pro web: veřejnou adresu serveru nasměrujete na ochrannou síť místo na svůj stroj a spojení dorazí nejdřív tam. Všechno, co neprojde prověřením, končí tam. Všechno, co projde, se přepošle na váš server.
Právě tohle přemístění umožňuje zbytek:
- Prověření platí síť, ne váš server. Join flood, který by vyčerpal vaše CPU, odbaví hardware postavený na to, aby ho odbavil.
- Ping do seznamu serverů se odpovídá z uloženého snímku místo dotazem na váš stroj, takže vás ping flood nestojí nic a v seznamu se dál ukazuje správný počet hráčů a zpráva. Viz Ping floody a fronta hráčů.
- Bany se vynucují před dveřmi. Zabanovaný hráč nezabírá slot a neotevře spojení na váš stroj.
- Vlastní adresa serveru přestane být tím, co si komunita předává. Viz Jak chránit IP adresu Minecraft serveru.
Pevné prahy jsou špatný nástroj
Nejčastější způsob, jak to pokazit, je vybrat číslo. Dvě stě připojení za sekundu je pohotovost pro malý survival server a obyčejný večer pro velkou síť. Pevný práh si musí jednu z těch situací vybrat a v té druhé se mýlit: nastavte ho nízko a populární server je trestaný za popularitu, nastavte ho vysoko a malý server je bezbranný.
Alternativou je měřit server proti sobě samému. Průběžný odhad toho, jak provoz konkrétního hostname normálně vypadá, a reakce ve chvíli, kdy se aktuální hodnota odchýlí víc, než vysvětlí běžný rozptyl. Velký server pak není trestaný za to, že je velký, a malý nezůstane bez obrany. Pevné stropy pod tím dál existují jako záchytná síť — hodnota, která je útokem pro kohokoli — ale jsou podlahou systému, ne celým systémem.
Jeden detail je důležitější, než zní: základní odhad se musí během útoku zmrazit. Jinak se dlouhotrvající flood pomalu naučí do definice normálu a detektor ztichne přesně tehdy, kdy je potřeba.
Ověřovat, ne blokovat
Instinkt při útoku je blokovat. Je to zároveň nejdražší dostupná chyba, protože cenou za špatnou blokaci je skutečný člen komunity, který se nedostane dovnitř a netuší proč.
Lepší výchozí volba je nechat nejisté spojení něco prokázat. Ten důkaz může být levný pro člověka a zničující pro botnet: mít skutečný Minecraft účet, nebo přečíst krátký kód z obrazovky a napsat ho. Skutečný hráč jednou stráví pár sekund. Automatizovaný nástroj s tisíci připojeními to musí zaplatit za každý účet a každé připojení — a přesně tahle ekonomika dělá útok nerentabilním.
Proto by se provoz z VPN a hostingových sítí měl ověřovat, ne blokovat. Velká část skutečných hráčů se přes ně připojuje a plošné blokování téhle kategorie tiše zahodí členy komunity. Jak takové důkazy vypadají z obou stran, rozebírá CAPTCHA a ověřování hráčů v Minecraftu.
Cheatování je jiný problém se stejnými dveřmi
Udržet server nahoře je jedna polovina. Ta druhá je, co se děje, když je někdo legitimně uvnitř — protože hráč se skutečným účtem, který prošel každým ověřením a chová se jako normální klient, může pořád létat, mlátit skrz zdi nebo vidět rudu skrz kámen. To je samostatná vrstva a věnuje se jí Co je Minecraft anticheat?.
Podle čeho vybírat poskytovatele
- Prověření, které proběhne dřív, než váš server na spojení cokoli vydá.
- Detekci nastavenou podle provozu vašeho serveru, ne podle veřejného čísla.
- Ověřování místo blokování všeho nejistého a nulové nároky na to, aby si hráči něco instalovali.
- Server, který si dál ověřuje hráče sám, aby uniklá adresa backendu nedovolila komukoli připojit se pod libovolným jménem.
- Záznam o tom, co bylo puštěno a co zastaveno a proč — aby otázka „byli jsme v noci pod útokem?" měla odpověď, na kterou jde ukázat.
- Objemovou kapacitu nad vámi, protože tuhle vrstvu na úrovni herního protokolu vyřešit nejde.
Ochrana herních serverů od Itnetic dělá všechno výše uvedené pro servery Java Edition, vanilla i moddované, bez pluginu a bez čehokoli, co by hráči museli instalovat — a je v ceně každého plánu.