
Minecraft-XDP-eBPF: Ochrona serwerów Java przed atakami DDoS
Outfluencer/Minecraft-XDP-eBPF
Pierwszy i jedyny publicznie dostępny filtr Minecraft XDP, chroniący serwer przed atakami DDoS warstwy 7
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:
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):
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:
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:
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:
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:
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.
Lead writer at minecraft.how. Long-time Minecraft player running a small SMP server, testing every build, mod, and seed before writing about it.


