3種類の攻撃
ネットワークへの大量通信
膨大な量の通信がサーバーの回線を埋め尽くします。サーバーに接続できなくなるか、全員にラグが出ますが、接続履歴には何も新しく表示されません。
大量接続
プレイヤーにはならない何千もの接続やサーバーリストのpingです。回線を埋めるほどではありませんが、プロキシサーバーが本物のプレイヤーに応答しなくなるまで負荷をかけ続けます。
ボット攻撃
偽のプレイヤーが接続を完了し、枠を埋め、チャットをスパムで荒らします。ボットはそれぞれ実際の接続で、たいていはプロキシリストを経由しているため、サーバーからはプレイヤーに見えます。
プラグインでDDoSを止められない理由
プラグインはプロキシサーバーやサーバーの中で動きます。回線が埋まっていたり、マシンがパケットの破棄で手一杯だったりすると、プラグインは動く機会すらありません。フィルタリングは、通信がマシンに届く前、つまりホスティング会社のネットワークか、その前に置いたサービスで行う必要があります。
本当のDDoS対策はどこにあるか
- Minecraft向けのホスティング会社の多くや一部のデータセンター(たとえばゲーム向けフィルタリングのあるOVHcloud)にはDDoS対策が含まれており、攻撃が届く前に自社のネットワークでフィルタリングします。
- TCPShieldやCloudflare Spectrum(有料プラン)のような保護プロキシはサーバーの前に置かれます。プレイヤーはそのネットワークに接続し、クリーンな通信だけがサーバーに届きます。サービス側でPROXY protocolをオンにし、
velocity.tomlでhaproxy-protocol = true、またはBungeeCordのconfig.ymlでproxy_protocol: trueを設定してください(サービスのプラグインを入れる方法もあります)。そうしないと、プロキシサーバーにはプレイヤーではなくサービスのアドレスが見え、IPのBANやアドレスのチェックが機能しなくなります。 - 実際のアドレスは隠しておきます。プロキシサーバーやバックエンドの直接のアドレスを攻撃者に知られると保護を回避されるので、そのアドレスはほかの用途に使わず、漏れた場合は変更してください。
これらのサービスは通信をフィルタリングします。VPNの利用者、BAN回避、接続を完了するボットは見分けられません。
プロキシサーバーで設定できること
どちらのプロキシサーバーでも、接続が多すぎるアドレスからの接続を遅らせられます。
- Velocity:
velocity.tomlのlogin-ratelimit。1つのアドレスからの接続の最小間隔をミリ秒で指定します。 - BungeeCord:
config.ymlのconnection_throttleとconnection_throttle_limit。
これは少数のアドレスからの大量接続には効きますが、何千ものアドレスからのものには効きません。自分のマシンでは、アドレスごとの新規接続を制限するファイアウォールのルールが、小規模な大量接続に役立ちます。
ボット攻撃:プラグインが役に立つ場面
ボットはどれも接続としてやって来るので、ボット攻撃こそ、プラグインで対処するのが正しいケースです。Kordonはそれぞれの接続のアドレスをチェックし、波が始まるとサーバーを攻撃対応モードに切り替えて、ボットが使うネットワークを閉じます。攻撃対応モードは無料プランを含むすべてのプランにあります。クリーンなアドレスから来るボットは、Sonarのような検証プラグインが捕まえます。この2つは1つのプロキシサーバーで問題なく併用できます。
Kordonはネットワークの通信をフィルタリングしないため、本物のDDoSにはやはりホスティング会社の対策が必要です。ボット攻撃を受けたときの対処法をご覧ください。
どちらの攻撃かを見分ける方法
サーバーに接続できない、または全員のpingが非常に高いのに、接続履歴に新しい参加がなく、ホスティング会社のグラフで通信量が急増しているなら、DDoSです。ホスティング会社に連絡してください。接続履歴が新しいプレイヤー名で埋まり、枠がふさがっているなら、ボット攻撃です。プロキシサーバーでの保護で対処できます。両方が同時に来ることもあるので、両方を確認してください。