Skip to content
Powrót do bloga
Minecraft-XDP-eBPF: Ochrona serwerów Java przed atakami DDoS

Minecraft-XDP-eBPF: Ochrona serwerów Java przed atakami DDoS

Alexandru Maftei
Alexandru Maftei
@ice
Updated
8 wyświetleń
TL;DR:Minecraft-XDP-eBPF to zapora na poziomie jądra, która chroni serwery Java przed atakami DDoS warstwy 7, usuwając złośliwe pakiety na sterowniku sieciowym, zanim dotrą do oprogramowania serwera. Jest bezpłatny, otwartoźródłowy i wykorzystuje eBPF, aby zapewnić ochronę bez kopii z minimalnym obciążeniem.
🐙 Otwartoźródłowy projekt Minecraft

Outfluencer/Minecraft-XDP-eBPF

Pierwszy i jedyny publicznie dostępny filtr Minecraft XDP, chroniący serwer przed atakami DDoS warstwy 7

⭐ 169 gwiazdek🖥️ C📄 BSD-3-Clause
Wyświetl na GitHub ↗

Jeśli kiedykolwiek uruchamiałeś publiczny serwer Minecraft, znasz to uczucie - ktoś wysyła zalew bezużytecznego ruchu do Twojej sieci i nagle wszyscy gracze doświadczają opóźnień. Ataki DDoS warstwy 7 (typ na poziomie aplikacji) są niedrogie, łatwe do przeprowadzenia i niesamowicie trudne do obrony za pomocą tradycyjnych zapór ogniowych. Minecraft-XDP-eBPF rozwiązuje to, usuwając złośliwe pakiety, zanim dotrą do oprogramowania serwera - bezpośrednio na poziomie jądra.

Co robi ten projekt

Minecraft-XDP-eBPF to zapora XDP (eXpress Data Path) napisana w C, która wykorzystuje eBPF (extended Berkeley Packet Filter) do inspekcji ruchu Minecraft na poziomie sterownika sieciowego. Jeśli to brzmi przerażająco, pomyśl o tym w ten sposób: zamiast pozwolić śmieciowym pakietom podróżować aż do serwera Java, to narzędzie je przechwytuje na karcie sieciowej i mówi "nie", zanim zużyją jakiekolwiek zasoby serwera.

Projekt obsługuje to, co wiele osób nie zdaje sobie sprawy, że ataki wykorzystują: nieprawidłowe pakiety protokołu Minecraft. Analizuje handshake'i, pingi statusu i żądania logowania, a następnie usuwa wszystko, co narusza specyfikację protokołu Minecraft lub wygląda podejrzanie. Chodzi o to, że nieprawidłowe VarInty, nonsensowne sekwencje pakietów, zniekształcone próby połączenia - wszystko się znika.

Obecnie obsługuje Minecraft 1.8 do 26.1.2 na IPv4, domyślnym portem jest 25565 (oczywiście). Wbudowane jest również ograniczanie szybkości SYN, limitujące połączenia do 10 SYN-ów na 3 sekundy na adres IP domyślnie. Całe filtrowanie odbywa się bez wiedzy kodu serwera o istnieniu tych pakietów.


Dlaczego byś tego chciał

Potrzebujesz tego, jeśli prowadzisz publiczny serwer i chcesz przestać być bombardowany przypadkowymi atakami. Ataki DDoS warstwy 7 są znacznie bardziej powszechne niż myślą ludzie, i to jest rodzaj rzeczy, którą trudno bronić się tylko za pomocą ISP upstream. Oni patrzą na przepustowość, ty patrzysz na utrzymanie responsywności serwera.

Wyobraź sobie to: ktoś (lub botnet) odkrywa adres IP serwera i zaczyna wysyłać tysiące fałszywych prób logowania Minecraft na sekundę. Serwer musi teraz wydatkować cykle CPU na analizowanie tych pakietów, odrzucanie ich i czyszczenie. Twoi gracze mają opóźnienia, ponieważ serwer jest zajęty tonięciem w śmieci. Za pomocą tego narzędzia te fałszywe pakiety nigdy nie dotrą do serwera.

Prawdziwa wygrana to usuwanie bez kopii. Złośliwy ruch jest usuwany na poziomie XDP (XDP_DROP), zanim jądro nawet przydział pamięci na niego. To nie tylko szybkie - mówimy o mikrosekundach szybkie.

Jeśli prowadzisz mały serwer survivalu z przyjaciółmi, prawdopodobnie tego nie potrzebujesz. Jeśli prowadzisz coś publicznego lub konkurencyjnego - zwłaszcza serwer PvP, gdzie ludzie mogą ciebie dokuczać - warto o tym pomyśleć.


Uruchamianie w działaniu

Instalacja ma kilka części, ale to nie szaleństwo. Będziesz potrzebować systemu Linux (narzędzie jest tylko dla Linuksa) z dostępem roota.

Najpierw zainstaluj wymagania wstępne. Jeśli korzystasz z Ubuntu lub Debian:

bash
sudo apt update
sudo apt install -y gcc-multilib wget gnupg software-properties-common git libbpf-dev

Następnie pobierz LLVM/Clang. Projekt potrzebuje niedawnej wersji (CI testuje z LLVM 21):

bash
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 21 all

Będziesz także potrzebować zainstalowanego łańcucha narzędzi Rust. Gdy już masz wszystko, sklonuj repozytorium i uruchom skrypt budowania:

bash
git clone https://github.com/Outfluencer/Minecraft-XDP-eBPF.git
cd Minecraft-XDP-eBPF
./build.sh

Po pomyślnym zbudowaniu, masz binarny plik w `target/release/xdp-loader`. Aby faktycznie załadować zaporę na swój interfejs sieciowy:

bash
sudo ./target/release/xdp-loader eth0

(Zamień eth0 na jakikolwiek jest twój rzeczywisty interfejs sieciowy. Jeśli nie wiesz, `ip link show` ci to powie.)

I to wszystko. Zapora jest teraz aktywna i filtruje ruch. Chcesz monitorować, co robi? Dodaj punkt końcowy metryk Prometheus:

bash
sudo ./target/release/xdp-loader eth0 -metrics-addr 0.0.0.0:1999

Następnie wejdź na `http://your-server-ip:1999/metrics`, aby zobaczyć liczby pakietów, upuszczenia i inne fajne statystyki.


Funkcje, które mają znaczenie

Głęboka inspekcja pakietów

Narzędzie nie tylko patrzy na nagłówki pakietów, ale kopie się w rzeczywisty protokół Minecraft. Waliduje kodowanie VarInt (co wiele narzędzi atakowych robi źle), sprawdza strukturę pakietu i wymusza reguły sekwencji. Pakiety, które są syntaktycznie nieprawidłowe dla protokołu Minecraft, są natychmiast usuwane.

Ograniczanie szybkości połączeń

Domyślnie ogranicza nowe połączenia TCP do 10 SYN-ów na 3 sekundy na źródłowy adres IP. Możesz zmienić to w pliku `build.rs`, jeśli twój rzeczywisty legalny ruch jest bombardowany (może migrujesz serwery i masz skok), ale ustawienie domyślne jest rozsądne dla większości konfiguracji.

Usuwanie bez kopii

Najfajniejsza część, szczerze mówiąc. XDP działa na poziomie sterownika, zanim normalny stos sieciowy jądra nawet się zaangażuje. Złośliwe pakiety są usuwane bez kiedykolwiek kopiowania do pamięci jądra. Serwer się nie budzi z powodu tego. To prawdziwa poprawa wydajności, nie tylko teoretyczna.


Pułapki i jak ich unikać

Musisz uruchomić to jako root lub z odpowiednimi uprawnieniami eBPF. Jeśli otrzymujesz błędy uprawnień, sprawdź, czy używasz `sudo`. To nie jest zaskoczenie, ale to najczęstszy problem.

Jeśli zmieniasz konfigurację w `build.rs` (zmienianie portów, szybkości ograniczenia itd.), pamiętaj, że musisz ponownie skompilować po edycji. Nie uruchamiaj binarnego ponownie i nie oczekuj, że podniesie twoje zmiany. Nie będzie. Zrobiłem ten błąd raz i spędziłem dziesięć minut zastanawiając się, dlaczego moja konfiguracja portu nie miała żadnego efektu (a właściwie, to nie był ja, po prostu... hipotetycznie mówiąc).

Kolejna pułapka: jeśli konfiguracja mapy się zmieni - powiedzmy, że włączysz mapy Per-CPU lub zamieszasz rozmiary struktury danych - czasami system plików BPF się myli przy ponownym uruchomieniu. Naprawą jest jądrowa, ale działała:

bash
sudo rm -r /sys/fs/bpf

To wymazuje system plików BPF. Gdy ponownie uruchomisz ładowarkę, stworzy świeże mapy. Rób to tylko, jeśli otrzymujesz błędy dotyczące tworzenia mapy - nie jest to coś, co musisz robić regularnie.

Pamiętaj także, że program w przestrzeni użytkownika musi pozostać uruchomiony, aby zarządzać mapami eBPF. Jeśli zabijesz proces ładowarki, zapora natychmiast zostanie wyładowana. Prawdopodobnie będziesz chciał uruchomić to pod kontrolą systemd lub innego nadzorcy, aby się restartował, jeśli ulegnie awarii.


Co z alternatywami?

Nie ma wielu narzędzi robienia dokładnie tego, co to robi. Większość ludzi albo polega na ochronie DDoS ISP, używa usługi handlowej jak Cloudflare, albo po prostu akceptuje, że czasami zostaną uderzeni.

Cloudflare ma usługę specyficzną dla Minecraft, która proxy twój ruch, ale za to płacisz i twój adres IP serwera jest ukryty za proxy. To narzędzie jest samodzielnie hostowane i bezpłatne (licencja BSD, więc open source). Różne kompromisy.

Niektórzy ludzie używają podstawowego ograniczania szybkości w oprogramowaniu serwera lub zaporze, ale to się dzieje po przybyciu pakietów do serwera. To narzędzie je zatrzymuje na poziomie sterownika, co jest szybsze i wydajniejsze.

Jeśli dopiero zaczynasz z hostingiem serwera, najpierw sprawdź wbudowaną ochronę DDoS hosta. Ale jeśli prowadzisz na metalu zwykłym lub potrzebujesz większej kontroli, Minecraft-XDP-eBPF jest naprawdę wyjątkowy w tym, co oferuje.


Zanim wdrażasz

Testuj to w środowisku przejściowym, jeśli możesz. Uruchom go na nie-produkcyjnym serwerze lub testowym VPS, aby upewnić się, że nie filtruje przypadkowo legalnego ruchu (nie powinno, ale błędy konfiguracji się zdarzają). Ponadto sprawdź, że działa z twoją konkretną wersją serwera Minecraft, zanim włączysz go dla prawdziwych graczy.

Jeśli chroniasz serwer survivalu, jest to niskie ryzyko. Jeśli prowadzisz konkurencyjny serwer PvP lub frakcji, gdzie legalni gracze już są sfrustrowani, błąd konfiguracji, który blokuje ich pakiety logowania, mógłby być katastrofą.

Projekt ma 169 gwiazdek na GitHub i jest aktywnie utrzymywany. Ta najnowsza wersja poprawiła metodę czytania varint, co jest dokładnie tym rodzajem nudnego, ale krytycznego, co chcesz widzieć w narzędziu bezpieczeństwa. To solidna praca.

Skonfiguruj ten export metryk Prometheus. Monitoruj to. Obserwuj szybkości upuszczania pakietów - jeśli coś wygląda dziwnie, zauważysz to wcześnie. I jeśli naprawdę martwisz się DDoS i prowadzisz legalny publiczny serwer, to narzędzie jest warte twojego czasu.

About the author
Alexandru Maftei
Alexandru MafteiLead Writer

Lead writer at minecraft.how. Long-time Minecraft player running a small SMP server, testing every build, mod, and seed before writing about it.

Share with your friends!