Skip to content
返回博客
Minecraft-XDP-eBPF: 为Java服务器提供的内核级DDoS防护方案

Minecraft-XDP-eBPF: 为Java服务器提供的内核级DDoS防护方案

Alexandru Maftei
Alexandru Maftei
@ice
Updated
11 次浏览
TL;DR:Minecraft-XDP-eBPF是一款内核级防火墙,可在网络驱动层直接丢弃恶意数据包,保护Java服务器免受第7层DDoS攻击。它完全免费且开源,利用eBPF技术实现零拷贝防护,性能开销极小。
🐙 开源Minecraft项目

Outfluencer/Minecraft-XDP-eBPF

首款且唯一公开可用的Minecraft XDP过滤工具,保护服务器免受第7层DDoS攻击

⭐ 169个星标💻 C📄 BSD-3-Clause
在GitHub上查看 ↗

如果你曾经运营过公开的Minecraft服务器,你就会知道那种感觉: 有人发来一堆垃圾流量,瞬间所有玩家都开始卡顿。第7层DDoS攻击(应用层攻击)成本低廉,容易发动,用传统防火墙防御极其困难。Minecraft-XDP-eBPF通过在内核级别拦截恶意数据包来解决这个问题,直接在网络驱动层丢弃数据包,在它到达你的服务器软件之前就被彻底消除。

这个项目的作用

Minecraft-XDP-eBPF是一款用C语言编写的XDP(eXpress Data Path)防火墙,利用eBPF(扩展伯克利数据包过滤)技术在网络驱动层检查Minecraft流量。如果这听起来很复杂,想象一下: 与其让垃圾数据包一路跑到你的Java服务器,这个工具反而在网卡这边就截住它们,一声"不"打回去,服务器资源一点都用不了。

这个项目处理的是很多人都没意识到的攻击方式: 格式不正确的Minecraft协议数据包。它会检查握手协议、状态ping和登录请求,然后丢弃任何违反Minecraft协议规范或看起来可疑的东西。关键是,那些编码错误的VarInt、乱七八糟的数据包序列、畸形的连接尝试,统统没了。

目前它支持Minecraft 1.8到26.1.2版本,使用IPv4协议,默认端口是25565(显然)。它还内置了SYN限速,默认每个IP地址每3秒最多10个SYN连接。所有这些过滤都发生在你的服务器代码毫不知情的情况下。


为什么需要它

如果你运营公开服务器,又不想被随意的攻击轰炸得七荤八素,那你就需要它。第7层DDoS的出现频率远比人们想象的要高,这种攻击用ISP级别的防护也很难应对。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-eBPF.git
cd Minecraft-XDP-eBPF./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://你的服务器IP:1999/metrics`就能看到数据包计数、丢包数和其他有趣的统计数据。


重要功能

深度数据包检查

这个工具不只看数据包头,它会深入到实际的Minecraft协议内容。它校验VarInt编码(很多攻击工具都搞错了),检查数据包结构,实施序列规则。任何在Minecraft协议上语义不合法的数据包都会被立即丢弃。

连接限速

默认情况下,它限制每个源IP的新TCP连接为每3秒10个SYN。如果你的正常流量确实很猛(也许你在迁移服务器,产生了流量峰值),你可以在`build.rs`文件中调整这个值,但对大多数设置来说默认值很合理。

零拷贝丢弃

这是我觉得最酷的部分。XDP在驱动层运行,在内核的常规网络栈涉及之前。恶意数据包被丢弃,从不被复制到内核内存。你的服务器根本不会为此唤醒。这是真正的性能提升,不是纸上谈兵。


坑与绕过方法

你需要用root身份运行,或者有相应的eBPF权限。如果遇到权限错误,检查一下你是否在用`sudo`。没啥惊喜,不过这是最常见的问题。

如果你要改`build.rs`里的配置(改端口、限速等),记住改完后要重新编译。不要期望只是重新运行二进制就能生效。不会的。我曾经犯过这个错误,花了十分钟想为什么我的端口配置没有效果(实际上不是我,就,假设吧)。

另一个坑: 如果你改了map配置,比如启用Per-CPU maps或改数据结构大小,有时BPF文件系统会在重启时搞糊涂。解决方法有点狠但有效:

bash
sudo rm -r /sys/fs/bpf

这会清空BPF文件系统。当你重新启动加载器时,它会创建新的maps。只有在遇到map创建错误时才这样做,平时不需要。

还要记住用户态程序必须保持运行来管理eBPF maps。如果你杀掉加载器进程,防火墙立即卸载。你可能想用systemd或其他监管器来运行它,这样崩溃时会自动重启。


其他选择呢?

做同样事情的工具不多。大多数人要么依赖ISP的DDoS防护,要么用Cloudflare之类的商业服务,要么就接受偶尔被黑的命运。

Cloudflare有一个Minecraft专用服务,但你得为此付费,而且你的服务器IP被隐藏在代理后面。这个工具是自托管的且免费的(BSD许可证,所以开源)。不同的权衡。

有人会在他们的服务器软件或防火墙里用基本的限速,但那是数据包到达你的服务器后。这个工具在驱动层阻止它们,更快更高效。

如果你才开始玩服务器托管,先检查一下你的主机商内置的DDoS防护。但如果你跑的是裸金属或需要更多控制,Minecraft-XDP-eBPF真的是独一无二的。


部署前

如果可能,在测试环境试试。在非生产服务器或测试VPS上跑一下,确保它不会不小心过滤正常流量(不应该,但配置错误会发生)。在真正的玩家上线前也要验证它能跟你的特定Minecraft服务器版本配合。

如果你在保护生存服,风险很低。但如果你跑的是竞争性的PvP或派系服,而玩家已经很烦躁,一个配置失误导致他们的登录数据包被拦截,那可能是场灾难。

这个项目在GitHub上有169个星标,而且维护活跃。最新版本改进了varint读取方法,这正是你想在安全工具里看到的那种无聊但关键的东西。这是扎实的工作。

设置那个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!