Skip to content
ブログに戻る
Minecraft-XDP-eBPF: JavaサーバーのカーネルレベルDDoS保護

Minecraft-XDP-eBPF: JavaサーバーのカーネルレベルDDoS保護

Alexandru Maftei
Alexandru Maftei
@ice
Updated
9 閲覧
TL;DR:Minecraft-XDP-eBPFは、悪意のあるパケットをサーバーソフトウェアに到達させる前のネットワークドライバレベルで破棄することで、JavaサーバーをLayer 7 DDoS攻撃から保護するカーネルレベルファイアウォールです。無料でオープンソース、eBPFを使用して最小限のオーバーヘッドでゼロコピー保護を提供します。
👈 オープンソースのMinecraftプロジェクト

Outfluencer/Minecraft-XDP-eBPF

最初で唯一の公開されているMinecraft XDPフィルター。Layer 7 DDoS攻撃からサーバーを保護します

⭐ 169スター💻 C📄 BSD-3-Clause
GitHubで表示 ↗

公開Minecraftサーバーを運用している人なら誰もが経験していることです。誰かが大量の不要なトラフィックを送ってくると、プレイヤーが急にラバーバンディングの被害に遭います。Layer 7 DDoS攻撃(アプリケーションレベルの攻撃)は安く、簡単に仕掛けられ、従来のファイアウォールで防ぐのが信じられないほど難しいです。Minecraft-XDP-eBPFはこの問題を解決します。悪意のあるパケットがサーバーソフトウェアに到達する前に破棄し、カーネルレベルで直接処理します。

このプロジェクトが行うこと

Minecraft-XDP-eBPFはCで書かれたXDP(eXpress Data Path)ファイアウォールで、eBPF(拡張Berkeley Packet Filter)を使用してMinecraftトラフィックをネットワークドライバレベルで検査します。複雑に聞こえるなら、こう考えてください。ゴミパケットをJavaサーバーまで全部送る代わりに、このツールがネットワークカードの時点で「ダメ」と言って止めるわけです。

このプロジェクトが対処するのは、多くの人が気づかない攻撃が悪用する点です。形式が不正なMinecraftプロトコルパケットです。ハンドシェイク、ステータスピング、ログイン要求を分析して、Minecraftプロトコル仕様に違反するか疑わしい内容をドロップします。無効なVarInt、意味不明のパケットシーケンス、形式の不正な接続試行、すべて消えます。

現在IPv4でMinecraft 1.8から26.1.2をサポートし、デフォルトポートは25565です。SYN接続制限も組み込まれており、デフォルトではIPアドレスごと3秒あたり10 SYNに制限されます。すべてのフィルタリングはサーバーコードが存在することすら知らないレベルで実行されます。


これが必要な理由

公開サーバーを運用していて、ランダムな攻撃で完全に叩きのめされるのを避けたいなら、このツールが必要です。Layer 7 DDoSは人々が考えるよりずっと一般的で、ISPのDDoS対策だけでは防げない種類の攻撃です。ISPは帯域幅を見ていますが、あなたはサーバーの応答性を保つことに関心があります。

こういう状況を想像してください。誰かがサーバーのIPを見つけ出して、1秒あたり数千の偽のMinecraftログイン試行を送信し始めます。サーバーはこれでCPU時間を費やしてパケットをパース、拒否、クリーンアップします。本当のプレイヤーはサーバーがゴミに溺れているため遅延します。このツールを使えば、偽のパケットはサーバーに到達しません。

本当の利点はゼロコピードロップです。悪意のあるトラフィックはXDP層(XDP_DROP)でドロップされ、カーネルがメモリを割り当てる前に。それは単に速いだけではなく、マイクロ秒単位のパフォーマンス向上です。

友達とのサバイバルサーバーなら、おそらくこれは必要ありません。公開またはコンペティティブサーバー、特にPvPサーバーを運用していて嫌がらせされる可能性があるなら、検討する価値があります。


動かし始める

インストールにはいくつかのステップがあります。難しくはありませんが、複数の部品が必要です。Linuxシステム(このツールはLinux専用)とルートアクセスが必要です。

まず前提条件をインストールします。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://your-server-ip:1999/metrics`にアクセスしてパケット数、ドロップ、その他の統計情報を確認できます。


重要な機能

深いパケット検査

ツールはパケットヘッダーを見るだけではなく、実際のMinecraftプロトコルに掘り下げます。VarIntエンコーディングを検証し(多くの攻撃ツールはこれを誤ります)、パケット構造をチェック、シーケンスルールを実施します。Minecraftプロトコルにとって構文的に無効なパケットは即座にドロップされます。

接続スロットリング

デフォルトでは、新しいTCP接続をソースIPあたり3秒ごとに10 SYNに制限します。実際の正当なトラフィックが多い場合(サーバー移行で急増があるかもしれません)、`build.rs`ファイルでこれを調整できます。ほとんどの設定ではデフォルトが適切です。

ゼロコピードロップ

本当に最高の機能です。XDPはドライバレベルで動作し、カーネルの通常のネットワークスタックが介入する前です。悪意のあるパケットはカーネルメモリにコピーされることなくドロップされます。サーバーは起動しません。これは理論的ではなく、本当のパフォーマンス向上です。


落とし穴と回避方法

このツールはrootか適切なeBPF権限で実行する必要があります。権限エラーが出たら、`sudo`を使用していることを確認してください。特に珍しくありませんが、これが最も一般的な問題です。

`build.rs`の設定を調整している場合(ポート、スロットル速度など)、編集後に再コンパイルしなければなりません。バイナリを再実行するだけで、変更を認識するわけではありません。私はこのミスをして、ポート設定に効果がない理由で10分悩みました。

もう一つの落とし穴、マップ設定が変わった場合 - CPU単位マップを有効にするか、データ構造サイズをいじったか - 時々BPFファイルシステムが再起動で混乱します。修正は極端ですが動作します:

bash
sudo rm -r /sys/fs/bpf

これはBPFファイルシステムをクリアします。ローダーを再起動すると、新しいマップを作成します。マップ作成エラーが発生している場合のみこれを実行してください。定期的に実行する必要はありません。

ユーザースペースプログラムがeBPFマップを管理し続ける必要があることも覚えておいてください。ローダープロセスを終了すると、ファイアウォールは即座にアンロードされます。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!