
Minecraft-XDP-eBПФ - защита Java серверов от DDoS атак
Outfluencer/Minecraft-XDP-eBПФ
Первый и единственный доступный для общего пользования фильтр Minecraft XDP, защищающий ваш сервер от DDoS атак 7-го уровня
Посмотреть на 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:
sudo apt update
sudo apt install -y gcc-multilib wget gnupg software-properties-common git libbpf-dev
Затем получите LLVM/Clang. Проекту нужна свежая версия (CI тестирует с LLVM 21):
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 21 all
Вам также потребуется установленная цепочка инструментов Rust. После того как у вас всё есть, клонируйте репозиторий и запустите скрипт сборки:
git clone https://github.com/Outfluencer/Minecraft-XDP-eBПФ.git
cd Minecraft-XDP-eBПФ
./build.sh
После успешной сборки у вас будет бинарник в `target/release/xdp-loader`. Чтобы фактически загрузить брандмауэр на ваш сетевой интерфейс:
sudo ./target/release/xdp-loader eth0
(Замените eth0 на какой-то ваш реальный сетевой интерфейс. Если вы не знаете, `ip link show` вам скажет.)
И это всё. Брандмауэр теперь активен и фильтрует трафик. Хотите мониторить что он делает? Добавьте Prometheus метрики конечную точку:
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ПФ путается при перезагрузке. Исправление ядерное но работает:
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 и запускаете легитимный публичный сервер, этот инструмент стоит вашего времени.
Lead writer at minecraft.how. Long-time Minecraft player running a small SMP server, testing every build, mod, and seed before writing about it.


