Ochrona serwera Minecraft Bedrock przed atakami DDoS

Opublikowano 22 min czytania

Których portów serwer Minecraft Bedrock naprawdę potrzebuje, dlaczego RakNet po UDP bez zabezpieczenia na etapie nawiązywania połączenia jest szczególnie podatny, jak zabezpieczyć query, RCON i liczbę pakietów oraz od jakiej skali ataku pomaga już tylko filtrowanie w sieci przed serwerem.

Serwer Minecraft Bedrock, który wieczorami na kilka minut znika z listy serwerów, a potem wraca, rzadko ma problem ze sprzętem. Zwykle trwa atak, i trwa dokładnie wtedy, gdy online jest najwięcej graczy. Ten artykuł pokazuje, jak chronić serwer Minecraft Bedrock przed atakami DDoS: najpierw to, co możesz zabezpieczyć sam i bez dodatkowych kosztów, potem miejsce, w którym te działania kończą się fizycznie, a na koniec to, co musi wydarzyć się w sieci przed serwerem.

Wszystkie informacje dotyczą Bedrock Dedicated Server, PocketMine-MP albo Nukkit na Debianie 12, Debianie 13, Ubuntu 22.04 LTS albo Ubuntu 24.04 LTS. Polecenia są napisane dla użytkownika root, jako zwykły użytkownik poprzedź je poleceniem sudo. Kto prowadzi Java Edition, znajdzie typowe dla niej ataki protokołowe we wpisie Ochrona Minecraft przed DDoS i ochrona nullping. Samą instalację serwera Bedrock opisuje Instalacja serwera Minecraft Bedrock z Nukkit.

Jeśli atak trwa właśnie teraz: nie zmieniaj niczego w konfiguracji i nie restartuj serwera. Zabezpiecz najpierw pomiary (rozdział „Zbieraj pomiary, zanim gruchnie”), po ataku będą bezpowrotnie stracone.

Dlaczego serwery Minecraft Bedrock tak często są celem ataków DDoS

Bedrock Edition to wersja, która działa na konsolach, smartfonach, tabletach i Windowsie, i stanowi największą bazę graczy Minecrafta w ogóle. Gdzie stoi wiele serwerów, tam powstaje największa zachęta do ataków: konkurencyjne sieci, zbanowani gracze, wewnętrzne spory. Atak nie kosztuje przy tym zlecającego ani umiejętności, ani liczących się pieniędzy, a server booter sprzedawany jest w abonamencie.

Powód techniczny leży głębiej. Serwer Bedrock mówi po UDP, a nie po TCP, i odpowiada każdemu, kto zapyta, na długo zanim doszło do jakiegokolwiek logowania. Dokładnie te dwie cechy czynią z portu 19132 UDP wdzięczny cel. Czym zasadniczo jest atak DDoS, wyjaśnia wpis Czym jest atak DDoS?.

RakNet: protokół UDP, który odpowiada, zanim ktokolwiek się zalogował

RakNet to biblioteka sieciowa UDP, przez którą Minecraft Bedrock Edition prowadzi cały swój ruch gry. UDP nie zna nawiązywania połączenia, którego serwer mógłby wymagać, a adresy nadawcy da się przez to podrobić. RakNet buduje nad tym własną warstwę niezawodności: numery sekwencyjne, potwierdzenia (ACK) i potwierdzenia negatywne (NAK), którymi klient może upomnieć się o zgubione pakiety.

Nawiązanie połączenia składa się z siedmiu pakietów, czterech od klienta i trzech od serwera:

Client  -> Server   Open Connection Request 1
Server  -> Client   Open Connection Reply 1
Client  -> Server   Open Connection Request 2
Server  -> Client   Open Connection Reply 2
Client  -> Server   Connection Request
Server  -> Client   Connection Request Accepted
Client  -> Server   New Incoming Connection

Dopiero potem klient wysyła pakiet logowania ze swoimi poświadczeniami Xbox Live. To zdanie decydujące dla każdego, kto chce zabezpieczyć swój serwer Bedrock: serwer przetworzył siedem pakietów, zużył czas procesora i pamięć oraz odpowiedział kilka razy, zanim w ogóle dowiaduje się, kto puka. Każde działanie, które zaczepia się o logowanie, zadziała więc dopiero wtedy, gdy obciążenie już powstało.

Dochodzi do tego drugi, jeszcze wcześniejszy punkt wejścia. Żeby serwer pojawił się na liście serwerów gracza z nazwą, wersją i liczbą graczy, odpowiada on na Unconnected Ping (ID pakietu 0x01) pakietem Unconnected Pong (ID pakietu 0x1C). Ta wymiana odbywa się przed właściwym nawiązaniem połączenia, nie wymaga żadnego poświadczenia i przy Bedrock Dedicated Server nie da się jej wyłączyć bez usunięcia serwera z każdej listy serwerów.

Unconnected Ping jako wektor wzmocnienia: liczby

Atak wzmocnieniowy (amplification) to atak, w którym atakujący wysyła małe zapytania z podrobionym adresem nadawcy do obcych serwerów, żeby ich większe odpowiedzi wylądowały u ofiary. Serwer Bedrock nie jest przy tym atakowany, tylko używany. Przy Unconnected Ping rachunek wygląda tak:

Wielkość Wartość
Unconnected Ping (0x01) 33 bajty ładunku: 1 bajt ID pakietu, 8 bajtów znacznika czasu, 16 bajtów Magic, 8 bajtów identyfikatora klienta
Unconnected Pong (0x1C) 35 bajtów szkieletu plus identyfikacja serwera jako łańcuch znaków
identyfikacja serwera w konfiguracji domyślnej około 96 bajtów, odpowiedź więc około 131 bajtów
współczynnik wzmocnienia na poziomie ładunku około 4
górna granica identyfikacji serwera pole długości jest wartością 16-bitową, technicznie więc do 65 535 bajtów
zawartość odpowiedzi edycja, nazwa serwera, wersja protokołu, nazwa wersji, aktualna i maksymalna liczba graczy, identyfikator serwera, nazwa świata, tryb gry, oba porty
błąd wzmocnienia RakNet z 2024 roku 52 bajty zapytania wyzwalały ponad 8 000 pakietów odpowiedzi po 134 bajty
współczynnik tego błędu teoretycznie do 22 000, w warunkach naturalnych zmierzono około 1 000

Dwie rzeczy wynikają z tego bezpośrednio. Po pierwsze: długa nazwa serwera powiększa odpowiedź, a tym samym współczynnik wzmocnienia, który oddajesz do dyspozycji obcym atakującym. Krótka nazwa to nie kosmetyka, tylko środek ochronny. Po drugie: współczynnik 4 w konfiguracji domyślnej jest na tyle mały, że twój serwer pozostaje nieciekawy jako reflektor, ale na tyle duży, że zalew pingów obciąża twoje własne łącze wyjściowe czterokrotnością tego, co przychodzi.

Błąd wzmocnienia z 2024 roku pokazuje, jak źle może być, gdy nadużyta zostaje sama warstwa niezawodności. W używanej wtedy bibliotece RakNet pakiet Connection Request Accepted był oznaczony jako niezawodny. Atakujący mógł rozegrać nawiązanie połączenia z podrobionym adresem nadawcy aż do tego punktu, a potem wysłać jedno jedyne potwierdzenie negatywne z zakresem od 0 do 8191. Serwer wysyłał w odpowiedzi tysiące pakietów na podrobiony adres, a atakujący nie musiał robić już nic więcej. Naprawiono to, przestawiając ten pakiet na zawodny, dosyłając w Open Connection Reply 1 ciasteczko, które prawdziwy klient odbija z powrotem, oraz wprowadzając granice pakietów: 120 pakietów na adres źródłowy i takt 10 milisekund, 1 000 pakietów łącznie na takt.

Bedrock Edition czy Java Edition: co się różni w ochronie DDoS

Kto zabezpieczał już kiedyś serwer Java, przeniesie prawie wszystko błędnie. Obie edycje dzielą nazwę, ale nie protokół sieciowy:

Cecha Bedrock Edition Java Edition
transport UDP przez RakNet TCP
port domyślny 19132 UDP dla IPv4, 19133 UDP dla IPv6 25565 TCP
nawiązanie połączenia siedem pakietów RakNet w aplikacji, bez weryfikacji kryptograficznej trójstronne powitanie w jądrze systemu operacyjnego
adres nadawcy do podrobienia tak, UDP nie wymaga nawiązywania połączenia nie, trójstronne powitanie to uniemożliwia
środek zaradczy w kernelu żaden, UDP nie zna SYN-cookies SYN-cookies, net.ipv4.tcp_syncookies
uwierzytelnianie Xbox Live, dopiero w pakiecie logowania po nawiązaniu RakNet konto Microsoft, dopiero po nawiązaniu TCP
wpis SRV w DNS nie jest obsługiwany, gracze wpisują adres i port oddzielnie jest obsługiwany
lista serwerów wpis leży w kliencie każdego gracza, brak otwartego serwera głównego rozmaite publiczne usługi list

Wiersz o SYN-cookies jest najważniejszy. Przy Java Edition kernel Linuksa odpiera zalew SYN, a proces Minecrafta niczego z tego nie zauważa. Przy Bedrock Edition tej pomocy nie ma: każdy pojedynczy pakiet UDP jest przepuszczany aż do procesu serwera i tam analizowany. Serwer Bedrock nie ma przeciw floodowi na porcie 19132 żadnej wbudowanej ochrony w systemie operacyjnym, bo UDP takiej nie zna.

Wiersz o braku wpisu SRV ma praktyczną konsekwencję, która wielu zaskakuje: portu przy Bedrock Edition nie da się schować za wpisem DNS. Gracze wpisują adres i port ręcznie. Kto przenosi port, musi podać nowy port każdemu graczowi.

Porty, o które naprawdę chodzi

Bedrock Dedicated Server wiąże się z dokładnie dwoma portami, i to na obu po UDP. W pliku server.properties:

server-port=19132
server-portv6=19133
enable-lan-visibility=true
online-mode=true
allow-list=false
max-players=10
player-idle-timeout=30
max-threads=8

To są ustawienia domyślne Microsoftu, do przeczytania w dokumentacji Bedrock Dedicated Server. Wokół tych dwóch portów leżą kolejne usługi, które działają zależnie od oprogramowania serwerowego:

Port Protokół Do czego Do otwartej sieci?
19132 UDP ruch gry Bedrock przez RakNet, IPv4 (server-port) tak, to jedyny port obowiązkowy
19133 UDP ruch gry Bedrock przez RakNet, IPv6 (server-portv6) tylko jeśli obsługujesz graczy po IPv6
19132 UDP query GS4 przy PocketMine-MP i Nukkit, ten sam port co gra (enable-query, domyślnie włączone) nie, wyłączyć
19132 TCP RCON przy Nukkit: rcon.port bez własnej wartości wraca do server-port (enable-rcon, domyślnie wyłączone) nie, nigdy
19144 TCP debugger skryptów Bedrock Dedicated Server (force-inbound-debug-port) nie
25565 TCP serwer Java Edition za Geyserem (remote.port) nie, wiązać na 127.0.0.1
22 TCP dostęp SSH ograniczyć do stałych adresów

Trzeci i czwarty wiersz to najczęstsze możliwe do uniknięcia błędy na serwerach Bedrock. Przy Nukkit i PocketMine-MP enable-query stoi fabrycznie na włączonym, a przy Nukkit przypadkowo włączony RCON ląduje na 19132 TCP, czyli na tym samym numerze portu co gra. Kto patrzy tylko na „19132 jest otwarty, w porządku”, tego nie zauważy.

Cecha oficjalnego Bedrock Dedicated Server należy tu równie dobrze: on nie zna dyrektywy server-ip. PocketMine-MP i Nukkit ją mają (server-ip, przy PocketMine dodatkowo server-ipv6), oficjalny serwer nie. Nasłuchuje więc zawsze na wszystkich adresach systemu, a firewall jest twoją jedyną możliwością, żeby to ograniczyć.

Co możesz zrobić sam, zanim wydasz pieniądze

Ten rozdział jest najdłuższy i to celowo. Czysto skonfigurowany serwer Bedrock wytrzyma małe i średnie ataki o własnych siłach, niezależnie od tego, u kogo stoi.

1. Inwentaryzacja: co w ogóle nasłuchuje na 19132?

Zanim napiszesz choć jedną regułę, sprawdź, co twój serwer wystawia na zewnątrz. Nie zgaduj, sprawdź:

ss -lntup
ss -lnup sport = :19132

Interesuje cię kolumna z adresem lokalnym. 0.0.0.0:19132 i [::]:19133 oznaczają „osiągalny z całego internetu”. Jeśli obok pojawia się wpis TCP na tym samym numerze portu, działa RCON. Spojrzenie oczami atakującego daje skan portów z zewnątrz, dla UDP z -sU:

nmap -Pn -sU -p 19132,19133 TWOJ.ADRES.IP.SERWERA
nmap -Pn -p- --min-rate 1000 TWOJ.ADRES.IP.SERWERA

2. Zostaw otwarty tylko 19132 UDP, całą resztę zamknij

Dla serwera Bedrock wystarczy jedno udostępnienie na zewnątrz, dwa z IPv6. W UFW wygląda to tak, dokładnie w tej kolejności, żebyś nie zamknął dostępu samemu sobie:

ufw allow 22/tcp comment 'SSH'
ufw allow 19132/udp comment 'Bedrock IPv4'
ufw allow 19133/udp comment 'Bedrock IPv6'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

Jeśli nie masz graczy po IPv6, pomiń wiersz dla 19133 i ustaw przy PocketMine-MP dodatkowo enable-ipv6=false. Każdy port, którego nie udostępnisz, to port, którego nie musisz bronić. Pełną instrukcję razem z drogą ratunkową znajdziesz we wpisie Konfiguracja firewalla UFW bez zamykania sobie dostępu.

3. Wyłącz widoczność w sieci LAN, inaczej 19132 zostaje otwarty

To jest pułapka, w którą wpada prawie każdy, kto chce przenieść port. Dyrektywa enable-lan-visibility stoi fabrycznie na true i sprawia, że serwer odpowiada na zapytania wyszukujące w sieci lokalnej. Microsoft pisze o tym wyraźnie, że serwer wiąże się przez to dodatkowo z portami standardowymi 19132 i 19133, nawet jeśli server-port i server-portv6 mają inne wartości.

Kto więc przenosi port na 19140 i czuje się bezpiecznie, nadal nasłuchuje na 19132. Dla serwera w internecie do server.properties należy więc:

enable-lan-visibility=false

Potem sprawdź przez ss -lnup, czy 19132 naprawdę zniknął. Przy okazji to samo ustawienie rozwiązuje problem, że dwa serwery Bedrock na tym samym hoście odbierają sobie nawzajem port.

4. Wyłącz query i RCON

PocketMine-MP i Nukkit przynoszą ze sobą query GS4, czyli zapytanie o serwer po UDP według wzorca protokołu UT3, i odpowiadają na te zapytania na tym samym porcie 19132, na którym działa gra. Rozbudowana odpowiedź zawiera nazwę serwera, wersję, nazwę świata, stan whitelisty, adres i port, liczbę graczy, nazwy wszystkich połączonych graczy, a przy PocketMine-MP na życzenie pełną listę wtyczek. To wygodne dla stron ze statusem i botów Discord, ale zdradza atakującemu dokładnie, kiedy atak się opłaca, i kosztuje czas procesora przy każdym zapytaniu.

enable-query=off
enable-rcon=off

Przy PocketMine-MP wartości brzmią false zamiast off, a listę wtyczek wyłączasz w pocketmine.yml przez settings.query-plugins: false. Uporządkowanie, które czyta się rzadko: query GS4 z PocketMine-MP sprawdza token zasolony adresem nadawcy. Dużej odpowiedzi nie da się więc odbić na podrobiony adres. Zapytanie kosztuje mimo to czas procesora, a opublikowane dane pomagają atakującemu w doborze celu. Oficjalny Bedrock Dedicated Server nie zna ani query, ani RCON, tam ten punkt odpada.

Jeśli naprawdę potrzebujesz RCON, ustaw przy Nukkit koniecznie rcon.port na własną wartość i udostępnij go tylko dla własnego adresu. Powrót do server-port oznacza inaczej, że zdalne sterowanie twoim serwerem nasłuchuje na 19132 TCP, czyli na tej samej liczbie, którą i tak wszędzie wpisałeś jako „otwartą”.

5. Wymuś uwierzytelnianie Xbox Live

Uwierzytelnianie Xbox Live to sprawdzenie, czy dołączający gracz ma prawdziwe konto podpisane przez Microsoft. We wszystkich trzech programach serwerowych stoi ono fabrycznie na włączonym i tam też musi zostać.

Przy Bedrock Dedicated Server dyrektywa nazywa się online-mode, przy PocketMine-MP i Nukkit nazywa się xbox-auth. W obu przypadkach true jest stanem fabrycznym i wartością właściwą:

online-mode=true
xbox-auth=true

Microsoft formułuje przy tym ważne zastrzeżenie: klienci, którzy łączą się z serwerem poza siecią lokalną, i tak zawsze potrzebują uwierzytelnienia Xbox Live, niezależnie od tego ustawienia. Poświadczenie przenoszone jest jako podpisany łańcuch tokenów w pakiecie logowania, razem z identyfikatorem Xbox (XUID) oraz nazwą wyświetlaną.

A teraz część, która pomaga przeciw nieporozumieniom: uwierzytelnianie Xbox Live chroni twoją logikę gry, a nie twoje łącze. Odbywa się w pakiecie logowania, czyli po pełnym nawiązaniu połączenia RakNet. Atakujący, który zalewa twój serwer, wcale nie chce dołączyć. Jego pakiety zostaną odrzucone, ale i tak już dotarły, i o to właśnie chodzi.

6. Allowlist i górny limit graczy, oraz czego one nie potrafią

Allowlist (dawniej whitelist) to lista graczy, którzy mogą dołączyć. Przy Bedrock Dedicated Server włączasz ją przez allow-list=true, a wpisy stoją w allowlist.json z nazwą, XUID i polem ignoresPlayerLimit. Przy Nukkit i PocketMine-MP dyrektywa nadal nazywa się white-list.

allow-list=true
max-players=60
player-idle-timeout=15

Krótki czas bezczynności przez player-idle-timeout działa przeciw wyczerpaniu slotów: gracze, którzy tylko zajmują miejsce, wylatują po podanej liczbie minut. Wartość 0 oznacza, że nikt nigdy nie zostanie rozłączony z powodu bezczynności, i dokładnie to wykorzystuje atakujący, który blokuje twoje miejsca prawdziwymi kontami.

Także tutaj obowiązuje granica z poprzedniego rozdziału, i jest to punkt przeoczany najczęściej ze wszystkich: allowlist jest sprawdzana dopiero wtedy, gdy pakiet logowania zostanie przetworzony. Zapobiega dołączeniom, a nie pakietom.

7. Ogranicz liczbę pakietów na adres źródłowy

Przeciw małym atakom i niechlujnym botom pomaga górny limit na adres źródłowy. Przy UDP pracuje się z hashlimit, a nie z connlimit, bo UDP nie zna połączeń:

iptables -I INPUT -p udp --dport 19132 -m hashlimit --hashlimit-name bedrock_udp --hashlimit-mode srcip --hashlimit-above 400/sec --hashlimit-burst 600 -j DROP

Reguła odrzuca pakiety UDP, gdy ten sam adres źródłowy wysyła trwale więcej niż 400 pakietów na sekundę. Wartość jest wartością startową, a nie prawdą objawioną: pełny serwer z 60 graczami i dużym zasięgiem widzenia generuje wyraźnie więcej pakietów niż pusty, a kto ustawi zbyt ciasno, wyrzuci własnych graczy. Najpierw mierz przez tydzień w normalnej pracy.

Wyraźnie ostrzej wolno ci ustawić przy Unconnected Ping, bo prawdziwy klient pyta o stan serwera tylko wtedy, gdy lista serwerów jest otwarta, i wtedy w takcie sekundowym. Przez nftables da się trafić dokładnie w ten jeden pakiet, bo ID pakietu to pierwszy bajt za nagłówkiem UDP:

nft add table inet bedrock
nft add chain inet bedrock prerouting '{ type filter hook prerouting priority -150 ; policy accept ; }'
nft add rule inet bedrock prerouting udp dport 19132 @th,64,8 0x01 limit rate over 500/second drop

Wyrażenie @th,64,8 czyta osiem bitów od 64. bitu nagłówka transportowego, czyli pierwszy bajt ładunku UDP. Wartość 0x01 to ID pakietu Unconnected Ping. Tego samego miejsca możesz użyć do obserwacji, zanim cokolwiek odrzucisz:

tcpdump -ni eth0 'udp dst port 19132 and udp[8] = 0x01' -c 200 -q
tcpdump -ni eth0 'udp src port 19132 and udp[8] = 0x1c' -c 200 -q

Pierwszy wiersz liczy przychodzące zapytania o stan, drugi twoje własne odpowiedzi. Jeśli oba idą w takcie sekundowym w tysiące, podczas gdy prawie nikt nie gra, widzisz zalew pingów, a nie swoich graczy.

Dwie uwagi o trwałości. Same reguły iptables znikają po restarcie, na Debianie i Ubuntu zapisuje się je tak:

apt-get install -y iptables-persistent
netfilter-persistent save

A przy UFW takie reguły należą do /etc/ufw/before.rules, bo inaczej znikną przy następnym ufw reload.

8. Odciąż śledzenie połączeń w kernelu

Wąskie gardło, które przy grach po UDP uderza dużo wcześniej niż przy TCP: kernel zakłada dla każdej pary pakietów UDP wpis w śledzeniu połączeń. Przy zalewie z podrobionymi adresami nadawcy każdy pakiet to nowy adres źródłowy, a więc nowy wpis. Gdy tablica się zapełni, serwer odrzuca także legalne pakiety, a w logu stoi „nf_conntrack: table full, dropping packet”.

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

Jeśli licznik stoi trwale blisko górnej granicy, możesz wyjąć ruch gry ze śledzenia. To skuteczne, ale nie bez konsekwencji, dlatego w obu kierunkach i z następującym po tym testem połączenia:

iptables -t raw -I PREROUTING -p udp --dport 19132 -j NOTRACK
iptables -t raw -I OUTPUT -p udp --sport 19132 -j NOTRACK

Potem reguły oparte na stanie nie działają już dla tego ruchu. Twoje udostępnienie dla 19132 UDP musi więc być prawdziwym udostępnieniem portu i nie może polegać na stanie ESTABLISHED. Po ustawieniu sprawdź przez conntrack -L | grep 19132, że nie powstają już wpisy, i połącz się raz z grą, zanim zapiszesz reguły na stałe.

9. Prowadź Geyser i Floodgate porządnie

Geyser to most, który pozwala klientom Bedrock grać na serwerze Java Edition: przyjmuje na 19132 UDP połączenia Bedrock, tłumaczy protokół i rozmawia po drugiej stronie z serwerem Java na 25565 TCP. Floodgate to uzupełnienie, które pozwala tym graczom Bedrock dołączyć bez konta Java. Dla ochrony DDoS oznacza to trzy rzeczy.

Po pierwsze: trzymaj Geyser aktualny. Dokładnie ten most był dwa razy powodem udokumentowanych ataków. W marcu 2024 szeroko wykorzystano opisany wyżej błąd wzmocnienia w bibliotece RakNet, naprawiony od builda 478. W lipcu 2025 nastąpił drugi przypadek: wielokrotnie wysyłany pakiet potwierdzający paczki zasobów tworzył kilka sesji na gracza, a rozłączeni klienci mogli dalej wysyłać pakiety, bo kanał sieciowy nie został zamknięty. Naprawione od builda 897. Oba przypadki projekt opublikował sam wraz z osią czasu.

Po drugie: serwer Java nie należy do otwartej sieci. W konfiguracji Geysera remote.address wskazuje na auto względnie 127.0.0.1, a remote.port na 25565. Zwiąż serwer Java odpowiednio lokalnie i nie udostępniaj 25565 TCP na zewnątrz. Inaczej masz dwie powierzchnie ataku zamiast jednej, a druga to ta, dla której nigdy nie wymyśliłeś żadnych reguł.

Po trzecie: plik key.pem jest tajemnicą. To klucz, którym Floodgate pomija uwierzytelnianie Java dla kont Bedrock. Kto położy go w publicznym repozytorium, skopiuje do zgłoszenia wsparcia albo pokaże na zrzucie ekranu, oddał logowanie swojego serwera. Projekt wyraźnie przed tym ostrzega.

10. Zbieraj pomiary, zanim gruchnie

Najważniejszy krok to ten, którego prawie nikt nie robi wcześniej: przygotuj bazę porównawczą, dopóki wszystko działa normalnie. Bez wartości normalnej po incydencie nie powiesz, czy 40 000 pakietów na sekundę to dużo, czy po prostu sobotni wieczór. Po apt-get install -y vnstat sysstat conntrack pomiar chodzi na stałe w tle.

sar -n DEV 1 10
ip -s link show eth0
ss -lunp sport = :19132
nstat -az | grep -E 'UdpInDatagrams|UdpNoPorts|UdpInErrors|UdpRcvbufErrors'
dmesg -T | tail -50

Trzy z tych wartości są przy serwerze Bedrock szczególnie wymowne. Trwale różne od zera Recv-Q na gnieździe UDP portu 19132 oznacza, że proces serwera nie odbiera już przychodzących pakietów dostatecznie szybko. UdpRcvbufErrors liczy dokładnie te pakiety, które zostały przez to odrzucone, i jest najtwardszym dowodem na to, że wąskim gardłem nie jest łącze, tylko proces. UdpNoPorts rośnie, gdy ktoś ostrzeliwuje porty, na których w ogóle nic nie nasłuchuje, a to typowy obraz przy szeroko zakrojonym skanie portów przed właściwym atakiem.

Przy tcpdump obowiązuje zasada: zawsze ograniczaj przez -c, bo zrzut przy pełnym obciążeniu dodatkowo obciąża i tak przeciążony serwer. Jak odczytać te wartości, opisuje wpis Jak rozpoznać atak DDoS.

Gdzie te działania się kończą: przepustowość i liczba pakietów

Teraz część, której nie rozwiąże żaden plik konfiguracyjny. Wszystkie dotychczasowe działania dzieją się na twoim serwerze, czyli na końcu łącza. Reguła firewalla decyduje o pakiecie, który już przeszedł przez kabel. Możesz go odrzucić, ale nie możesz sprawić, żeby nie został wysłany.

Wskaźnik Wartość
typowe łącze serwera gier 1 Gbit/s, co odpowiada 125 megabajtom na sekundę
pakiety, które przy 64 bajtach mieszczą się w 1 Gbit/s około 1,49 miliona na sekundę
ile z tego przetwarza zwykły kernel serwera kilkaset tysięcy pakietów na sekundę
typowe ataki na projekty Minecraft od 5 do 50 Gbit/s
największy publicznie udokumentowany atak na sieć Minecraft 2,5 Tbit/s w trzecim kwartale 2022, z botnetu Mirai, mieszane zalewy UDP i TCP
odfiltrowane w czasie rzeczywistym na serwerach KernelHost ponad 473,4 Gbit/s przy ponad 41,5 miliona pakietów na sekundę na serwer głosowy
również odfiltrowane flood UDP o wolumenie ponad 112,2 Gbit/s na serwer gier

Policz to razem ze mną. Twoje łącze jest pełne, gdy tylko ktoś wyśle więcej niż 125 megabajtów na sekundę. Atak o wolumenie od 5 do 50 Gbit/s leży przy pięcio- do pięćdziesięciokrotności tego. To, czy twoja reguła hashlimit za tym łączem jest dobra, nie ma już wtedy znaczenia, bo pakiety twoich graczy nie przechodzą już wcześniej.

Druga wielkość to liczba pakietów i przy serwerze Bedrock uderza ona prawie zawsze pierwsza. Cały ruch gry składa się z wielu małych pakietów UDP, a właśnie w tej dyscyplinie atakujący porusza się najtaniej. Atak, który nie zapełnia twojego łącza nawet w jednej trzeciej, może mimo to położyć twój serwer, bo cały czas procesora idzie na analizę i odrzucanie. Operatorzy przeżywają to jako „przecież obciążenie wcale nie było wysokie, a i tak wszyscy wypadli”. W grze objawia się to samo jako lag spikes, efekty gumki i zrywane połączenia w środku budowania.

Na to nie ma żadnego ustawienia lokalnego. Ataki wolumetryczne muszą kończyć się w sieci przed serwerem.

Co KernelHost przeciwstawia atakom DDoS na serwery Bedrock

Stała ochrona wliczona w każdy serwer

Ochrona DDoS w KernelHoście jest zbudowana dwuwarstwowo i stale aktywna, bez konieczności włączania, zamawiania czy konfigurowania czegokolwiek:

  • Warstwa 1: 17 Tbps pojemności mitygacji w globalnej sieci scrubbing. Ataki wolumetryczne są oczyszczane blisko źródła, zanim dotrą do centrum danych.
  • Warstwa 2: filtrowanie Arbor w czasie rzeczywistym o wydajności 3,2 Tbps we Frankfurcie nad Menem. Bezpośrednio przed serwerem rozpoznawane i odrzucane są wzorce specyficzne dla protokołów, pakiet po pakiecie. Należą do nich także wzorce UDP na 19132, które nie wykazują zachowania RakNet.

Decydujące są dwie cechy. Ochrona działa nieprzerwanie i nie musi dopiero reagować na atak, nie ma więc kilku minut na starcie, w których serwer znika. I nie stosuje się null-routingu: twój adres IP zostaje w sieci, odrzucane są wyłącznie szkodliwe pakiety. Kto zdejmuje adres IP z sieci, osiąga dla ciebie ten sam efekt co atakujący. Lokalizacja to Frankfurt nad Menem. Które gry i protokoły są objęte ochroną, wylicza wpis Ochrona DDoS serwerów gier w czasie rzeczywistym.

Advanced DDoS Protection dla projektów pod stałym ostrzałem

Niektóre projekty są atakowane nie okazjonalnie, tylko celowo i przez wiele tygodni. Dla nich jest Advanced DDoS Protection od 50,00 € miesięcznie, w modelu PrePaid i bez minimalnego okresu umowy. Różnica nie polega na większej pojemności, tylko na kontroli:

  • Dedykowany chroniony adres IP z rdzenia sieci we Frankfurcie, na który twój serwer zostaje przełączony w naszej sieci. Po twojej stronie nie trzeba niczego przebudowywać.
  • Samodzielnie zarządzane reguły ochrony na port i protokół w panelu klienta: sam ustawiasz, co jest dozwolone na 19132 UDP, co na 19133 UDP, a co na porcie odbiegającym od standardu, jeśli przeniosłeś swój serwer.
  • Zmiany działają w czasie rzeczywistym, możesz więc korygować ustawienia w trakcie trwającego ataku, zamiast czekać na okno serwisowe.
  • Profil ochrony dopasowany do konkretnej gry. Dla Minecrafta istnieją gotowe profile, tak samo dla zmodyfikowanych i własnych aplikacji na dowolnych portach TCP albo UDP, a więc także dla Nukkit, PocketMine-MP albo instancji Geysera na samodzielnie wybranym porcie.

Porównanie obu wariantów

Cecha Wliczona stała ochrona DDoS Advanced DDoS Protection
Cena zawarta w każdym pakiecie serwerowym, bez dopłat od 50,00 € miesięcznie, PrePaid
Pojemność filtrowania 17 Tbps globalnego scrubbingu plus filtrowanie Arbor w czasie rzeczywistym o wydajności 3,2 Tbps we Frankfurcie nad Menem to samo dwuwarstwowe filtrowanie
Adres IP adres IP twojego serwera dodatkowy dedykowany chroniony adres IP
Zestaw reguł profile automatyczne, konfiguracja niepotrzebna własne reguły na port i protokół w panelu klienta
Zmiany dzieją się automatycznie działają w czasie rzeczywistym, także w trakcie ataku
Profil gry zoptymalizowane profile dla popularnych gier, z Minecraftem włącznie profil dopasowany do gry, także dla zmodyfikowanych aplikacji i odbiegających portów
Null-routing nie nie
Okres umowy powiązany z pakietem serwerowym PrePaid, bez minimalnego okresu umowy, bez okresu wypowiedzenia, bez opłaty aktywacyjnej

Dla większości projektów Bedrock wystarczy wliczona stała ochrona razem z czystą konfiguracją serwera. Advanced DDoS Protection jest odpowiedzią na sytuację, w której ktoś bierze to do siebie osobiście. Kto prowadzi obecnie swój serwer gdzie indziej, rozwiąże problem najpewniej przeprowadzką: filtrowanie działa w sieci przed serwerem, a ta sieć musi należeć do nas.

Typowe błędy i ich rozwiązania

„Zmieniłem port na 19140, a 19132 i tak jest otwarty”: to enable-lan-visibility=true. Bedrock Dedicated Server wiąże się wtedy dodatkowo z 19132 i 19133, niezależnie od tego, co stoi w server-port. Ustawić na false, zrestartować serwer, sprawdzić przez ss -lnup.

„Edytowałem allowlist.json i sam nie mogę już wejść”: częste są dwie przyczyny. W katalogu leży jeszcze stary plik whitelist.json, który serwer czyta zamiast nowego, albo brakuje wpisu XUID względnie jest on błędny. Sama nazwa przy aktywnym uwierzytelnianiu Xbox Live nie wystarcza niezawodnie.

„Mój hoster zablokował mój serwer, chociaż to ja byłem atakowany”: sprawdź, czy twój serwer sam wysyłał pakiety. Dokładnie to działo się przy błędzie wzmocnienia RakNet z 2024 roku: dotknięte serwery wysyłały tysiące pakietów na obce adresy, a w zgłoszeniach abuse stał port 19132 jako źródło. Przez tcpdump -ni eth0 'udp src port 19132' -c 200 -q zobaczysz, dokąd twój serwer odpowiada. Aktualny build usuwa przyczynę.

„Moje reguły iptables nie działają”: częste są trzy przyczyny. Reguły stoją za łańcuchami UFW i nigdy nie zostają osiągnięte, zniknęły po ostatnim restarcie (wtedy pomogą netfilter-persistent save albo wpis w /etc/ufw/before.rules) albo atak jest wolumetryczny, a reguła pracuje poprawnie na łączu, które jest już pełne. Sprawdź przez iptables -L INPUT -n -v, czy liczniki trafień rosną. Jeśli stoją na zerze, reguła nie jest osiągana.

„Serwer jest na liście, ale nikt nie wchodzi”: jeśli wpis pokazuje nazwę i liczbę graczy, to Unconnected Pong działa, czyli port jest zasadniczo osiągalny. Jeśli mimo to dołączenie się nie udaje, wisi to zwykle na logowaniu Xbox Live albo na allowliście. Jeśli odwrotnie nie wchodzą tylko gracze po IPv6, brakuje udostępnienia dla 19133 UDP.

„Serwer działa, ale wszyscy mają lag spikes”: to częściej wtyczka niż atak. Sprawdź najpierw, czy Recv-Q na gnieździe UDP rośnie i czy rośnie UdpRcvbufErrors. Jeśli oba są spokojne, a sar -n DEV 1 10 nie pokazuje nic nietypowego, to nie był atak DDoS, tylko sam proces serwera. Przy Bedrock Dedicated Server pomogą wtedy wachtarze skryptów, których progi stoją w server.properties pod script-watchdog-hang-threshold i script-watchdog-slow-threshold.

„Mój dotychczasowy dostawca zablokował mój adres IP”: to null-routing. Dostawca chroni w ten sposób własną sieć, a dla ciebie wynik jest identyczny z udanym atakiem, zwykle jeszcze przez wiele godzin po nim. W razie wątpliwości zapytaj, czy ruch jest filtrowany, czy null-routowany. Ta odpowiedź decyduje o twojej dostępności bardziej niż jakakolwiek specyfikacja sprzętu.

„W tcpdump nie widzę nic nietypowego”: jeśli ruch jest filtrowany już w sieci przed serwerem, to zgodnie z oczekiwaniem nic na serwer nie dociera. To normalny stan przy działającym filtrowaniu. Odwrotnie też jest prawdą: gdy łącze jest wysycone, może cię nie dosięgnąć nawet sesja SSH, którą chciałeś użyć do pomiaru. Skorzystaj wtedy z konsoli VNC w panelu klienta, która działa niezależnie od sieci systemu gościa.

Krótkie podsumowanie

  • Serwer Minecraft Bedrock potrzebuje na zewnątrz dokładnie jednego otwartego portu: 19132 UDP, do tego 19133 UDP tylko dla graczy po IPv6. Query, RCON, debugger skryptów na 19144 TCP oraz serwer Java za Geyserem na 25565 TCP do otwartej sieci nie należą.
  • Kto przenosi port, musi ustawić enable-lan-visibility=false, bo inaczej Bedrock Dedicated Server wiąże się dodatkowo dalej z 19132 i 19133.
  • Uwierzytelnianie Xbox Live i allowlist działają dopiero w pakiecie logowania, czyli po pełnym nawiązaniu połączenia RakNet. Chronią twoją logikę gry i twoje miejsca, a nie twoje łącze.
  • Unconnected Ping jest pytany 33 bajtami, a odpowiadany około 131 bajtami, czyli ze współczynnikiem wzmocnienia około czterech. Krótka nazwa serwera trzyma ten współczynnik nisko.
  • Przy UDP pomaga hashlimit zamiast connlimit, a śledzenie połączeń w kernelu zapełnia się przy podrobionych adresach nadawcy jako pierwsze. Jedno i drugie powinieneś zmierzyć przed pierwszym atakiem.
  • Od mniej więcej 1 Gbit/s twoje łącze jest pełne, a przy pakietach po 64 bajty mieści się w nim około 1,49 miliona pakietów na sekundę. Powyżej decyduje wyłącznie filtrowanie w sieci przed serwerem.
  • W KernelHoście dwuwarstwowa stała ochrona jest zawarta w każdym pakiecie serwerowym, działa od momentu udostępnienia i obywa się bez null-routingu. Advanced DDoS Protection uzupełnia ją o dedykowany chroniony adres IP oraz samodzielnie zarządzane reguły na port.

Jeśli twój projekt działa już w KernelHoście, filtrowanie jest aktywne i nie musisz nic robić. Gdybyś mimo to zauważył coś nietypowego, załóż zgłoszenie wsparcia, żeby reguły filtrowania dla twojego adresu IP zostały skorygowane. Przy trwającym ataku dotrzesz do nas dodatkowo przez awaryjny czat WhatsApp pod numerem +43 650 8209883.

Najczęstsze pytania

Mój serwer Minecraft Bedrock jest właśnie offline. Po czym rozpoznam atak DDoS?
Spójrz na liczbę pakietów, a nie na obciążenie CPU. Przez sar -n DEV 1 10 zobaczysz pakiety i bajty na sekundę, przez ss -lunp kolejkę gniazda UDP na porcie 19132. Trwale różne od zera Recv-Q oraz rosnące UdpRcvbufErrors z nstat -az oznaczają, że proces serwera nie odbiera już przychodzących pakietów. Jeśli pakiety przychodzące rosną daleko powyżej wartości normalnej, a sam serwer prawie nie pracuje, to jest atak. Jeśli wszystkie liczniki sieciowe są spokojne, a mimo to wszystko się tnie, przyczyną jest proces serwera albo wtyczka.
Które porty muszę zostawić otwarte dla serwera Minecraft Bedrock?
Dokładnie jeden: 19132 UDP, ustawiony przez server-port w server.properties. Jeśli obsługujesz graczy po IPv6, dochodzi 19133 UDP przez server-portv6. Cała reszta zostaje zamknięta. Query GS4 z PocketMine-MP i Nukkit działa na tym samym porcie 19132 UDP i wyłącza się przez enable-query. RCON przy Nukkit bez własnego rcon.port wraca do 19132 TCP. Debugger skryptów Bedrock Dedicated Server leży na 19144 TCP, a serwer Java Edition za Geyserem należy na 127.0.0.1 z portem 25565.
Dlaczego Bedrock Edition jest bardziej podatna na ataki DDoS niż Java Edition?
Bo mówi po UDP. Java Edition działa po TCP na porcie 25565, a kernel Linuksa odpiera zalew SYN przez SYN-cookies, przy czym proces Minecrafta niczego z tego nie zauważa. Bedrock Edition działa przez RakNet na 19132 UDP, a UDP nie zna ani nawiązywania połączenia, którego można by wymagać, ani SYN-cookies. Adresy nadawcy da się podrobić, a każdy pojedynczy pakiet jest przepuszczany aż do procesu serwera i tam analizowany. Serwer Bedrock nie ma więc przeciw zalewowi pakietów na porcie 19132 żadnej wbudowanej ochrony w systemie operacyjnym.
Czym jest Unconnected Ping i dlaczego jest wektorem wzmocnienia?
Unconnected Ping (ID pakietu RakNet 0x01) to zapytanie o stan, którym klient Bedrock pobiera nazwę, wersję i liczbę graczy do swojej listy serwerów. Serwer odpowiada pakietem Unconnected Pong (ID pakietu 0x1C), i nikt nie musi być do tego zalogowany. Zapytanie ma 33 bajty, a odpowiedź składa się z 35 bajtów szkieletu plus identyfikacji serwera, w konfiguracji domyślnej więc około 131 bajtów. Daje to współczynnik wzmocnienia około czterech: atakujący może pytać z podrobionym adresem nadawcy i sprawić, że czterokrotna ilość danych wyląduje u ofiary. Krótka nazwa serwera trzyma ten współczynnik nisko.
Czy uwierzytelnianie Xbox Live chroni przed atakami DDoS?
Nie, chroni twoją logikę gry, a nie twoje łącze. Sprawdzenie odbywa się w pakiecie logowania, a ten pakiet klient wysyła dopiero wtedy, gdy zakończone jest pełne nawiązanie połączenia RakNet złożone z siedmiu pakietów. Serwer zużył w tym momencie już czas procesora i pamięć oraz odpowiedział kilka razy. Ustawienie nazywa się online-mode przy Bedrock Dedicated Server oraz xbox-auth przy PocketMine-MP i Nukkit, wszędzie stoi fabrycznie na true i tam powinno zostać. Przeciw zalewowi pakietów nie pomaga, bo atakujący wcale nie chce dołączyć.
Czy allowlist pomoże przeciw atakowi DDoS na mój serwer Bedrock?
Nie. Allowlist działa przeciw wszystkiemu, co korzysta ze zwykłej drogi dołączania: trollom, zbanowanym graczom, kontom jednorazowym. Sprawdzana jest jednak dopiero wtedy, gdy pakiet logowania zostanie przetworzony, czyli po nawiązaniu połączenia RakNet i po sprawdzeniu Xbox Live. Atakujący, który zalewa twój serwer, nie chce dołączyć. Jego pakiety zostaną odrzucone, ale i tak już dotarły. Przeciw wyczerpaniu slotów działa natomiast bardzo dobrze, razem z realistycznym max-players oraz player-idle-timeout, który nie stoi na 0.
Zmieniłem port, a 19132 i tak jest otwarty. Z czego to wynika?
Z enable-lan-visibility w server.properties, które stoi fabrycznie na true. Microsoft dokumentuje wyraźnie, że Bedrock Dedicated Server wiąże się przez to dodatkowo z portami standardowymi 19132 i 19133, nawet jeśli server-port i server-portv6 mają inne wartości. Ustaw dyrektywę na false, zrestartuj serwer i sprawdź przez ss -lnup, czy 19132 naprawdę zniknął. To samo ustawienie rozwiązuje też konflikt portów, gdy dwa serwery Bedrock działają na tym samym hoście.
Na co muszę uważać przy Geyserze i Floodgate?
Na trzy rzeczy. Trzymaj Geyser aktualny: w marcu 2024 szeroko wykorzystano błąd wzmocnienia w używanej bibliotece RakNet, naprawiony od builda 478, a w lipcu 2025 nastąpił drugi przypadek wokół podwójnie wysyłanych pakietów we wczesnej fazie nawiązywania połączenia, naprawiony od builda 897. Zwiąż serwer Java Edition lokalnie, bo remote.address i remote.port wskazują na 127.0.0.1 z portem 25565, i nie udostępniaj 25565 TCP na zewnątrz. I traktuj plik key.pem jak tajemnicę: to klucz, którym Floodgate pomija uwierzytelnianie Java dla kont Bedrock.
Od jakiej skali ataku mój serwer nie poradzi sobie już sam?
Typowy serwer gier wisi na 1 Gbit/s, co odpowiada 125 megabajtom na sekundę. Ataki na projekty Minecraft mieszczą się zwykle między 5 a 50 Gbit/s, czyli od pięciu do pięćdziesięciu razy powyżej pojemności twojego łącza. Równie ważna jest liczba pakietów: w 1 Gbit/s mieści się przy pakietach po 64 bajty około 1,49 miliona pakietów na sekundę, a zwykły kernel serwera przetworzy tylko kilkaset tysięcy. Przy serwerze Bedrock prawie zawsze pierwsza uderza liczba pakietów, bo cały ruch gry składa się z wielu małych pakietów UDP.
Czy mój serwer Bedrock w KernelHoście przechodzi w offline podczas ataku?
Nie. Null-routing nie jest stosowany. Twój adres IP zostaje w sieci, odrzucane są wyłącznie szkodliwe pakiety. Ochrona jest zbudowana dwuwarstwowo: 17 Tbps pojemności mitygacji w globalnej sieci scrubbing oraz filtrowanie Arbor w czasie rzeczywistym o wydajności 3,2 Tbps we Frankfurcie nad Menem. Działa nieprzerwanie i nie musi dopiero reagować na atak, nie ma więc kilku minut na starcie, w których serwer znika z listy serwerów twoich graczy.
Czy ochrona DDoS w KernelHoście kosztuje dodatkowo i kiedy potrzebuję Advanced DDoS Protection?
Dwuwarstwowa stała ochrona jest zawarta w każdym pakiecie serwerowym bez dopłat i działa od momentu udostępnienia serwera, nie musisz jej ani zamawiać, ani włączać, ani konfigurować. Advanced DDoS Protection potrzebujesz wtedy, gdy twój projekt jest atakowany nie okazjonalnie, tylko celowo i przez wiele tygodni, a ty chcesz sam sterować filtrowaniem. Dostajesz dedykowany chroniony adres IP i samodzielnie zarządzasz regułami ochrony na port i protokół w panelu klienta, czyli oddzielnie dla 19132 UDP i każdego odbiegającego portu. Zmiany działają w czasie rzeczywistym. Cena zaczyna się od 50,00 € miesięcznie, w modelu PrePaid, bez minimalnego okresu umowy i bez opłaty aktywacyjnej.

Minecraft Bedrock Ochrona DDoS Minecraft Bedrock Ochrona serwera gier RakNet Port 19132 Geyser Advanced DDoS Protection Filtrowanie w czasie rzeczywistym