Ping je nejlevnější útok, jaký existuje
Každý Minecraft klient, který má váš server v seznamu, posílá stavový dotaz: jaká verze, kolik hráčů, jaká zpráva. Odpovídat na něj je naprosto normální chování a je to důvod, proč se v seznamu vůbec něco ukazuje.
Zároveň se posílá zdarma, odpovídá se na něj trochu draze a nic před ním nestojí. Tahle kombinace udělala z pingu do seznamu serverů trvalý způsob, jak zatěžovat server, který nic neudělal. Nikoho nevyhodí ze světa, takže se dá snadno odbýt — přesně do chvíle, kdy si všimnete, že během ping floodu váš záznam zhasne, každý, kdo si prochází seznam serverů, vidí mrtvou položku, a lidé, které už máte, se začnou ptát, jestli je server dole.
Řešením je přestat na ně odpovídat serverem
Když na stavové dotazy odpovídá něco před vaším serverem ze snímku, který si drží, a ten snímek obnovuje v intervalu bez ohledu na to, kolik pingů dorazí, asymetrie zmizí. Deset pingů a deset milionů pingů stojí váš server totéž: jedno obnovení za interval. Flood stojí síť před vámi vyhledání v cachi, což je nejlevnější operace v systému.
Implementaci, která pomáhá, oddělují od té, která škodí, dva detaily:
Nikdy nefalšujte číslo protokolu. Je lákavé odpovídat pevnou hodnotou, jenže číslo protokolu klientovi říká, jestli se může připojit. Špatné způsobí, že každý klient zobrazí „nekompatibilní verze" a váš server vypadá rozbitě místo chráněně — což je horší než flood, proti kterému jste se bránili.
Držte snímek dost čerstvý, aby byl poctivý. Počet hráčů deset minut starý je záznam, který lže. Interval obnovení je skutečný kompromis mezi přesností a zátěží originu a má být krátký natolik, aby čísla, která lidé vidí, byla ta, která dostanou.
Druhá polovina: co dělat, když je server opravdu plný
Plný server není útok. Je to úspěch — a většina serverů to řeší tím nejhorším možným způsobem: příchozí hráč dostane odmítnutí a jde si najít jiný server.
Fronta z toho udělá čekání místo odmítnutí. Hráč se podrží, uvidí, kolikátý je a jak dlouho to zhruba potrvá, a pustí se dovnitř, jak se sloty uvolňují. Rozdíl ve výsledku není jemný — hráč, který vidí, že je 47. a že se to hýbe, obvykle počká; hráč, který dostal chybu, ne.
Je tu druhý důvod, proč fronta patří před server, a ne dovnitř. Fronta řešená pluginem pořád vyžaduje, aby se hráč k serveru připojil a teprve tam se dozvěděl, že má počkat — takže server vydává prostředky na každého, kdo čeká. Fronta vepředu je podrží, aniž by server věděl, že existují.
Kam fronta v pořadí patří
Na pořadí záleží a snadno se obrátí naruby.
Za ověření. Pozice ve frontě má bota stát stejný důkaz jako připojení. Když se příchozí řadí dřív, než jsou ověřeni, útočník zaplní linku spojeními, která nikdy neměla hrát, a vaši skuteční hráči čekají za nimi. Ověření napřed znamená, že bot zaplatí za vyřešení výzvy dřív, než vůbec může zabrat pozici.
Před rate limity. Vpuštění kupuje místo, ne imunitu. Hráč, který se dostane na začátek fronty, dál podléhá každému limitu na adresu, každému banu a každé další kontrole. Fronta, která uděluje výjimky, se stane cílem útočníků.
Těžká část: jedna fronta, mnoho lokalit
Když vaše ochrana běží ve víc než jedné lokalitě — a to je smyslem globální sítě — má pod sebou fronta opravdu obtížný problém. Každá lokalita vidí jen své vlastní příchozí, a přitom pozice hráče má být jeho pozicí v jediné globální linii.
Poctivá implementace jasně říká, které části jsou přesné a které odhad:
- Limit — kolik hráčů může být připojených najednou — musí být přesný, protože se proti němu měří plán zákazníka. To znamená sečíst, co hlásí každá lokalita. Součet má známé zkreslení: hráč, který se znovu připojil a přistál v jiné lokalitě, se může započítat dvakrát. To hodnotu nadhodnocuje a nikdy nepodhodnocuje, což je u čísla rozhodujícího o vpuštění bezpečný směr.
- Pozice je těžší. Seřadit globální linii všude stejně bez koordinace mezi lokalitami vyžaduje sdílenou značku, a dokud ji každá lokalita nemá, je pozice čekajícího hráče jeho pozicí mezi příchozími, které daná lokalita vidí. Je to odhad a tak se to má popisovat.
- Odhad čekání se odvozuje z toho, jak rychle se linka poslední dobou vyprazdňuje, což je klouzavý průměr hlučné veličiny. Zaslouží si být ukazován hrubě. Odpočet po sekundách naznačuje přesnost, která neexistuje.
A je tu porucha, se kterou je potřeba počítat: když koordinační služba ztichne, musí každá lokalita spadnout zpět na vlastní počet, což znamená, že se každá chová, jako by jí patřil celý limit. Během takového výpadku může vpuštění limit přestřelit. Je to vědomý kompromis — alternativou je, že se výpadek koordinace stane úplným výpadkem zákazníka, což je horší.
Obojí je ochrana, ne funkce navíc
Je snadné zařadit cache stavu a frontu pod „hezké mít". Při útoku nejsou ani jedno.
Cache stavu je to, co udrží váš server dohledatelný, zatímco se ho někdo snaží udělat neviditelným. Fronta je to, co zabrání tomu, aby se špička provozu — včetně té legitimní, po videu nebo akci — proměnila ve zeď odmítnutí, která pošle vaše nové hráče jinam. Obojí funguje tak, že přesune cenu z vašeho stroje na něco, co je postavené ji pohltit — a to je stejná myšlenka jako u všeho v článku DDoS ochrana Minecraft serveru.
Ochrana herních serverů od Itnetic odpovídá na pingy do seznamu serverů z uloženého snímku a příchozí drží ve srovnané frontě, když je server na svém limitu hráčů.