Skip to content
Вернуться в блог
Minecraft-XDP-eBПФ - защита Java серверов от DDoS атак

Minecraft-XDP-eBПФ - защита Java серверов от DDoS атак

Alexandru Maftei
Alexandru Maftei
@ice
Updated
9 просмотров
TL;DR:Minecraft-XDP-eBПФ - это брандмауэр уровня ядра, защищающий Java серверы от DDoS атак 7-го уровня. Он блокирует вредоносные пакеты на уровне сетевого драйвера до того, как они достигнут вашего серверного ПО. Бесплатно, открытый исходный код, использует eBПФ для защиты нулевого копирования с минимальными накладными расходами.
🐙 Проект с открытым исходным кодом Minecraft

Outfluencer/Minecraft-XDP-eBПФ

Первый и единственный доступный для общего пользования фильтр Minecraft XDP, защищающий ваш сервер от DDoS атак 7-го уровня

⭐ 169 звезд💻 C📄 BSD-3-Clause
Посмотреть на GitHub ↗

Если вы когда-нибудь запускали публичный сервер Minecraft, вы знаете это чувство: кто-то отправляет поток мусорного трафика в вашу сторону, и вдруг все начинают лагировать. DDoS атаки 7-го уровня (прикладного уровня) дешевые, легко запускаются и невероятно раздражают при защите с использованием традиционных брандмауэров. Minecraft-XDP-eBПФ решает эту проблему, удаляя вредоносные пакеты перед тем, как они достигнут вашего серверного ПО, прямо на уровне ядра.

Что делает этот проект

Minecraft-XDP-eBПФ - это XDP (eXpress Data Path) брандмауэр, написанный на C, который использует eBПФ (extended Berkeley Packet Filter) для проверки трафика Minecraft на уровне сетевого драйвера. Если это звучит пугающе, думайте об этом так: вместо того чтобы позволить мусорным пакетам пройти всю дорогу до вашего Java сервера, этот инструмент перехватывает их на сетевой карте и блокирует их до того, как они потребляют какие-либо ресурсы сервера.

Проект работает с тем, что многие не понимают в атаках: вредоносно сформированные пакеты протокола Minecraft. Он анализирует рукопожатия, проверки статуса и запросы входа, а затем удаляет всё, что нарушает спецификацию протокола Minecraft или выглядит подозрительно. Суть в том, что неверные VarInts, бессмысленные последовательности пакетов, неправильно сформированные попытки подключения - всё это уходит.

В настоящее время он поддерживает Minecraft 1.8 по 26.1.2 на IPv4, где порт по умолчанию - 25565 (очевидно). Есть встроенное ограничение SYN частоты подключений, ограничивающее подключения на 10 SYN за 3 секунды на IP адрес по умолчанию. Вся эта фильтрация происходит без того, чтобы ваш серверный код даже знал о существовании пакетов.


Почему вам это нужно

Вам это нужно, если вы запускаете публичный сервер и хотите перестать получать постоянные атаки. DDoS 7-го уровня намного более распространён, чем думают люди, и это то, против чего сложно защищаться только с помощью ISP-а вышестоящего уровня. Они смотрят на пропускную способность; вы смотрите на поддержание отзывчивости вашего сервера.

Представьте это: кто-то (или бот-сеть) узнает IP вашего сервера и начинает отправлять тысячи поддельных попыток входа в Minecraft в секунду. Ваш сервер теперь должен тратить циклы CPU на разбор этих пакетов, их отклонение и очистку. Ваши настоящие игроки лагируют потому что сервер утонул в мусоре. С этим инструментом эти поддельные пакеты никогда не достигают вашего сервера.

Настоящий выигрыш здесь - нулевое копирование при удалении. Вредоносный трафик удаляется на уровне XDP (XDP_DROP) перед тем как ядро даже выделит память для него. Это не просто быстро, это микросекунды.

Если вы запускаете небольшой сервер выживания с друзьями, вам это, вероятно, не нужно. Если вы запускаете что-то публичное или конкурентное, особенно PvP сервер где люди могут вас преследовать, это стоит обдумать.


Запуск

Установка имеет несколько компонентов, но это не сложно. Вам понадобится Linux система (инструмент только для Linux) с доступом root.

Сначала установите необходимые компоненты. Если вы используете Ubuntu или Debian:

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

Затем получите LLVM/Clang. Проекту нужна свежая версия (CI тестирует с LLVM 21):

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

Вам также потребуется установленная цепочка инструментов Rust. После того как у вас всё есть, клонируйте репозиторий и запустите скрипт сборки:

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

После успешной сборки у вас будет бинарник в `target/release/xdp-loader`. Чтобы фактически загрузить брандмауэр на ваш сетевой интерфейс:

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

(Замените eth0 на какой-то ваш реальный сетевой интерфейс. Если вы не знаете, `ip link show` вам скажет.)

И это всё. Брандмауэр теперь активен и фильтрует трафик. Хотите мониторить что он делает? Добавьте Prometheus метрики конечную точку:

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

Затем обратитесь к `http://your-server-ip:1999/metrics` чтобы увидеть количество пакетов, удаления и другую интересную статистику.


Функции, которые имеют значение

Глубокая проверка пакетов

Инструмент не просто смотрит на заголовки пакетов, он копается в реальном протоколе Minecraft. Он проверяет кодирование VarInt (что многие инструменты атаки делают неправильно), проверяет структуру пакета и применяет правила последовательности. Пакеты, которые синтаксически неверны для протокола Minecraft, удаляются немедленно.

Дросселирование подключений

По умолчанию он ограничивает новые TCP подключения до 10 SYN за 3 секунды на исходный IP. Вы можете подстроить это в файле `build.rs` если ваш реальный легитимный трафик вдруг скачет (может быть вы мигрируете серверы и у вас скачок), но значение по умолчанию разумно для большинства установок.

Нулевое копирование при удалении

Самая крутая часть, честно говоря. XDP работает на уровне драйвера до того как нормальный сетевой стек ядра даже включится. Вредоносные пакеты удаляются без того чтобы когда-либо копироваться в память ядра. Ваш сервер не просыпается из-за этого. Это реальное улучшение производительности, не просто теоретическое.


Подводные камни и как их избежать

Вам нужно запустить это от root или с соответствующими разрешениями eBПФ. Если вы получаете ошибки разрешения, проверьте что вы используете `sudo`. Никакого сюрприза, но это самая частая проблема.

Если вы подстраиваете конфигурацию в `build.rs` (меняете порты, скорости дросселирования и т. д.), помните что вам нужно пересобрать после редактирования. Не просто заново запускайте бинарник и не ожидайте что он подхватит ваши изменения. Не будет. Я сделал эту ошибку однажды и потратил десять минут, гадая почему моя конфигурация портов не имела эффекта (вообще-то это был не я, просто, гипотетически говоря).

Другой подводный камень: если конфигурация вашей карты меняется - скажем вы включаете Per-CPU карты или возитесь со структурой размеров данных - иногда файловая система BПФ путается при перезагрузке. Исправление ядерное но работает:

bash
sudo rm -r /sys/fs/bpf

Это стирает файловую систему BПФ. Когда вы заново запустите загрузчик, она создаст свежие карты. Делайте это только если вы получаете ошибки о создании карты, это не то что вам нужно делать регулярно.

Также помните что пользовательская программа должна продолжать работать чтобы управлять BПФ картами. Если вы убьёте процесс загрузчика, брандмауэр сразу же выгружается. Вы вероятно захотите запустить его под systemd или под каким-то другим надзирателем, чтобы он перезагружался если он упадёт.


А что с альтернативами?

Нет много инструментов делающих ровно то же самое. Большинство людей либо полагаются на защиту от DDoS своего ISP-а, либо используют коммерческий сервис как Cloudflare, либо просто принимают что их иногда будут бить.

Cloudflare имеет сервис для Minecraft который проксирует ваш трафик, но вы за это платите и IP вашего сервера скрыт позади прокси. Этот инструмент самостоятельный и бесплатный (BSD лицензирован, значит открытый исходный код). Разные компромиссы.

Некоторые люди используют базовое ограничение частоты в их серверном ПО или брандмауэре, но это происходит после того как пакеты достигнут вашего сервера. Этот инструмент их останавливает на уровне драйвера, что быстрее и эффективнее.

Если вы только начинаете с хостинга сервера, сначала проверьте встроенную защиту от DDoS вашего хоста. Но если вы запускаете на голом металле или вам нужно больше контроля, Minecraft-XDP-eBПФ действительно уникален в том что он предлагает.


Перед развёртыванием

Тестируйте его в среде промежуточного хостинга если можете. Запустите его на непроизводственном сервере или тестовом VPS чтобы убедиться что он случайно не фильтрует легитимный трафик (не должен, но ошибки конфигурации случаются). Также проверьте что он работает с вашей конкретной версией Minecraft сервера перед тем как включить его для реальных игроков.

Если вы защищаете сервер выживания, это низкий риск. Если вы запускаете конкурентный PvP или фракционный сервер где легитимные игроки уже раздражены, неправильная конфигурация которая блокирует их пакеты входа может быть катастрофой.

Проект имеет 169 звёзд на GitHub и активно поддерживается. Последний релиз улучшил метод чтения varint, что ровно тот род скучного но критичного stuff который вы хотите видеть в инструменте безопасности. Это солидная работа.

Установите этот Prometheus экспорт метрик. Мониторьте его. Следите за вашей скоростью удаления пакетов - если что-то выглядит странно, вы это рано заметите. И если вы действительно беспокоитесь о DDoS и запускаете легитимный публичный сервер, этот инструмент стоит вашего времени.

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!