良い機会なので、私が整地鯖運営を通して経験した闘DDoS録を残しておくことにしました。
同様の事象でお困りの皆さんの参考になれば。
わいのスペック
- 社会人2年目(駆け出しインフラエンジニア)
- Minecraftサーバー「ギガンティック☆整地鯖」の管理人。大学時代の2016年7月に設立、運営継続中
- DDoS対策については完全独学です(仕事でも触れてません)。もっというとネットワークに関しても私は専門ではありません。ので間違ったこと書いてたり、知識がふわっとしすぎて超抽象的な表現をしている箇所が大量にありますがご容赦をば
DDoSとの馴れ初め
2016年7月に整地鯖を本格的に運営開始しました。周りの運営メンバーのアイデアと努力にも恵まれ、プレイヤー数も順調に増えていきました。「マイクラサーバー運営楽しいなおいwwww」なんて優越に浸っていたかもしれません。
そんな中 "彼" は突然やってきました。
2016年9月
前のサーバー機管理者が諸事情によりサーバーを置けなくなってしまったため、私の自宅に新規サーバー作ってそこに移転することになりました。元々家にあったJCOMクソ回線だとまともに通信できないので回線を新規契約しています。
ちなみにマイクラサーバーでそこそこの規模であればプロバイダーはちゃんと吟味が必要です。「光ならなんでもいいでしょwww」なんて言って適当なプロバイダーを契約すると上りトラフィックの使いすぎで封書が送られてきて回線停止を迫られます(マジです)。封書が送られてこなくても、しれっと通信制限かけるところがほとんどだったりします(固定回線でも通信制限という概念は存在する)。上りトラフィックの総量規制が(今のところ)無いnuro光がおススメです。
2016年10月
この頃から、通信が不安定になってきました。具体的には断続的に数分〜数時間の通信不通が発生。ONU(ルーター)の管理画面にはログインできるけどONUへのpingが通らないという謎事態…サポートに問い合わせて調べてもらいましたが、家までの回線は生きているっぽく、ONUの初期不良を疑われ交換。
……だけど症状が改善しない。
僕はこの時DDoSのディの字も知らなかったので、「初期不良をまた引いてしまったのか」「そもそも業者はちゃんと家までの回線調べてるのか」「適当なことを抜かしているのでは」なんて思いから完全に通信業者に疑いの目を向けておりました。2度目の問い合わせの電話ではブチ切れた記憶があります(この時取ったオペさんごめんなさい!!!!!!)。
結局調べてもらった結果は1回目と同じで、またONUを交換する運びになりました。
……だけど症状が改善しない(2回目)。
3連続で初期不良を引くことなんて天文学的確率だろうし流石に変だなと思い(ONUはお国柄由来の悪評と高品質で名高いHuawei製だし…)別の原因を考え始めました。
このONUにはDMZホスト設定なるものがあり、(厳密に言うと企業でいうDMZネットワークを作るわけでは無いのですが)インターネット側からの通信を全部ローカルの特定ホストに流せる様なので、症状発生中に試しに設定してみたわけです。
設定後ネットワークモニターをみて愕然しました。
なんなんだこのトラフィック量は?!?!?!
これが私とDDoSのはじめての出会いでした。
DDoS攻撃とは
DDoS攻撃とは、日本語訳すると分散型サービス拒否攻撃?と呼ぶそうです。
現在の地球上の広大なネットワーク(インターネット)は様々な標準化された仕組み(OSIの7階層なんちゃらとか、TCP/IPとか)によって相互通信を可能にしているわけですが、ざっくりいうとこの標準的な設計の欠陥を突くことで、世界のどこかの悪い人が落としたいサーバーを通信不能に陥れることができちゃうって感じです。
詳しくは…
???『google先生!出番よ!』
ポイッ
DDoS攻撃といっても色々種類があるようで、現在だとパケットでかい通信を大量に送りつけて、一般人による通信が入る隙間を完全に埋めてしまって通信不能状態にするのが主流らしいです。
しかもタチ悪いことに、悪い人はウイルスとかばらまいて一緒に攻撃してくれる子分をいっぱい作っていて(botネットワークとか言われるやつ)、超本人はそいつらに命令出して攻撃させてるだけなので足も付きにくいと。
僕の把握してる限りだと、うちのサーバに来てた攻撃は結構多種多様でした。以下に列挙しておきますね。
- tcp ackがいっぱいとんでくるやつ(ACK Flood攻撃)
- 名前解決要求してもないのにとあるドメインのDNSクエリ結果がいっぱいとんでくるやつ(DNSリフレクション攻撃)
- 時刻合わせなんて要求してないのに世界各地のヤンデレNTPサーバからラブレター送られまくる(NTPリフレクション攻撃)
※wiresharkのスクショ撮っとけばよかった…
ちなみに一度攻撃を受けると、基本は攻撃が終了するまで通信不能な状態が続きます。
数分でパッと終わることもあれば、毎日ゴールデン時間帯だけ落とされたりとか、ひどい時は丸一日なんてこともありました。どんな原因であれ、まともに遊ばせてくれないサーバーからはプレイヤーは離れてしまうものです。運営チームの士気も下がっちゃいますし、ddos攻撃の常態化は負のスパイラル祭りです。攻撃者の思うツボってことです。
…控えめに言っても最悪ですね。
ネットに転がってた対策に対する僕の誤解
この時点で既に記事としては長いわけですが、最終的にうちのサーバーで取ってる対策の解説までしますので、もう少しお付き合いください。
DDoS攻撃を受けていることはわかりました。あとはどう対策するか?ですが、これはかなり試行錯誤がありました。試行錯誤するにあたって、対策を取る人が陥りやすいであろう誤った解釈をお伝えしておきます。
今回はminecraftの通信に的を絞ってお話ししますので、これ以外の通信(例えばウェブサイトで使うhttpとか)だと必ずしもそうとは限らない点はご容赦ください。
クライアントFWで絞っても意味がない攻撃がある
対策法をググるにあたってよく出てくるワード第1位です(私の主観調べ)。これは具体的にどーするかというと、サーバOS側のファイアウォール機能で他国のIPをブロックするとか、分間ないしは秒間のリクエスト数を制限するとか、そんなのです。
これはDDoS攻撃の種類によっては全く意味がありません。なんでかというと、契約している回線のキャパシティを超える通信量の攻撃を受けると、そもそも正常な通信がサーバまで降ってすらこないからです。サーバ側に設定したFWはサーバまで降ってきた通信に対してのみ機能しますので、サーバまで攻撃パケットも正常なパケットもぜーんぶ降ってくれば意味があるものと思います。ですが最近流行りのDDoS攻撃はそのさらに上の段階でめちゃくちゃな量のパケットを送りつけているため、サーバまで降りてくる頃には正常なパケットは欠けてしまっていて意味を成さなくなってしまっています。
これはどこで対策するかというと、個人レベルで手元の回線と設定だけで対策できる方法を僕は知りません。
ちゃんと調べたわけではないのでアレですが、個人レベルで契約回線のキャパシティをあげようと思ったら10Gbps止まり(しかもベストエフォート)だろうし、最近のDDoS攻撃は平気でギガビット級の攻撃を繰り出してきますし、そもそもギガビット(bps)捌けてもパケット数(pps)の方で勝負を仕掛けてこられたらそっちのキャパが根を上げるんじゃないかなーって思ってます。
つまるところ、個人レベルだと上位回線側で対策して、自宅の契約回線自体にキャパオーバーの通信を送らせないようになんとかするしかないんじゃないかなーと僕は思っています。
CloudFlareは無料版/廉価サブスクリプションだとウェブサイト用通信だけしか対策出来ない
また、今回対策しないといけない通信はちと特殊です。要はMinecraftの通信なんです。これはどういうことかっていうと、http でも httpsでもないんです。
DDoS対策としてよくCDNという言葉を聞きますよね。
詳細な説明はググると出てくるので割愛するとして、CDNはcloudflareが有名かなーと思います(確かあの某漫画村も使ってましたね)。あれは無料版もしくは廉価サブスクリプションだとhttp or httpsプロトコルしか対応していません。プロトコルは触りを知ってるだけなのでアレなのですが、minecraft java editionはtcp通信の独自プロトコル?だったと思います。他のプロトコルも守ってくれるオプションは有料プラン…しかも企業向けのプランのみ対応で、価格はお問い合わせ下さいの世界です(でもしれっとMinecraftサーバー最大手のhypixelは使っているみたいで、ちゃんと事例が載ってます)。問い合わせたわけではないですが、企業向けプランの一個下が月200ドル(だいたい2万円)なので、確実にこれを超える値段がかかるでしょう。
僕はただのそこらへんのしがない社会人なので、cloudflareでminecraftの通信を対策するのは早々に断念しています。
整地鯖はどうやって対策したのか
cloudflareも使えないし、fwも設定してみたけど結局ダメだった。でも通信不能な時間があればあるほどプレイヤーは離れていってしまう。
さてやっと本題です。整地鯖の対策方法を公開します。名付けて…
屍(しかばね)戦法
実はネットにうちの対策法と似たような事例がありました。この記事は最後まで図表なしで突っ走る気満々なので、なんのこっちゃという方は↓も参考にしてみてください。こっちの1000倍分かりやすいです。
DDoS攻撃との終わりなき戦い/endless_battle_with_ddos_attack - Speaker Deck
材料はこちら。
以下の様に調理します。
- vpsにhaproxyを入れる
- haproxyに大元のminecraftサーバへの通信設定を入れて、vpsのipを叩いたらhaproxyを経由して大元のMinecraftサーバーに繋がる様にする
- 2.の設定を全vpsにぶち込む
- 全vpsのipをGSLBの設定にぶち込む
- プレイヤーにはGSLBのFQDN名で接続させる、またはお手持ちのドメインのCNANEレコードにぶち込む
- 大元のIPはなんらかの手段で変更しておく
完成♡
…
…
…
解説します。
vpsってなんぞや
vpsとは、ざっくりいうと自宅サーバーとか建てなくても自分だけのサーバーを持つことができるサービスのことです。詳細はググればいっぱい出てきますので割愛します。
haproxyってなんぞや
haproxyとは、リバースプロキシのオープンソースソフトウェアです。こちらも詳細はggればでてきますので割愛しますが、色々な通信を中継させることができる機能を持っています。配下のサーバーに均等にアクセスを振り分けたり(負荷分散)、一時的に死んでるサーバを避けて通信を振り分けたり(冗長構成,縮退運行)するために使うのが主流っぽいです。今回はプレイヤーからの接続を大元のMinecraftサーバーの代わりに受け付けてもらう為に使います。
GSLBってなんぞや
広域負荷分散っていうそうです。名前解決時点で負荷分散や死活監視をおこなってくれます。今回はプレイヤーからの接続を死んでいないvps(haproxy)に誘導する為に使います。
GSLB(広域負荷分散) | さくらのクラウド ドキュメント
接続経路
調理方法に沿って調理すると、プレイヤーの接続経路は以下のように変化します。
(Before)
①DNSに問い合わせて、大元のMinecraftサーバーのIPを取得
②プレイヤー -(接続)-> 大元のMinecraftサーバー
(After)
①DNSに問い合わせて、GSLBによって選択されたvpsのIPを取得
②プレイヤー -(接続)-> vps(haproxy) -(中継)-> 大元のMinecraftサーバー
このような構成にすると、プレイヤー側から大元のMinecraftサーバーのIPアドレスは見えなくなり、代わりにvpsのIPアドレスが見えるようになります。ddos攻撃を受けた場合は大元のMinecraftサーバーではなく、手前のvpsが受ける形になります。
攻撃を受けて通信不能となったvpsはGSLBの死活監視機能によってDOWN検知され、自動的に切り離されます。通信不能になったvps経由で接続していたプレイヤーは一旦ゲームから切断されてしまいますが、再接続するとGSLBによって生存している他のvpsのIPを振り出される為、攻撃終了を待たずにプレイを再開することが可能となります。
このような仕組みで長期的な通信断を防ぐというのが、屍戦法のカラクリです。
VPSの部分をどうチョイスするか?
ここが、今回の対策方法のミソになる部分です。ddosが来た時にどのように対応するかは、事業者によってピンからキリまでありますのでしっかりと選びましょう。さくらのGSLBに組み込めるIPアドレスはグローバルIPであればなんでも良い為、複数社のvpsを組み合わせるのもいいと思います。海外のvpsを使う場合は、通信がいちいち太平洋をシャトルランするようになりますので、通信ラグに注意が必要です。
ピンからキリの部分が具体的にどういうことかは以下の記事にきれいにまとまっていました。
事業者によるddos対策の違いは、以下に僕が知ってる範囲で軽く解説しておきます。
さくらのvpsのDDoS対策
vpsに限らずさくらで作るサーバ全般に言えること?と思いますが、ddos攻撃が来ると攻撃終了まで攻撃対象ホスト宛の全通信を遮断される仕組みになっているようです。フィルタリング機能はあるみたいで、それでフィルタリングしきれる場合は攻撃終了を待たずに回復しますが、実体験上これは稀です。
対策手法について、記事が古いですが公式で以下に解説がありました。
海外のddos protection付vpsのDDoS対策
ddos protection付vpsだと、契約するvpsにもよりますが、ddos攻撃来た時の挙動がさくらのvpsより良心的になります。
具体的にどうなるかというと、
- 余程大きいのでなければ攻撃中も正常に通信が可能
- 攻撃食らったタイミングで一時通信不能になる(既存のセッションは切れる)が、すぐに通信可能な状態に復旧する
…などです。ここら辺は契約する会社によってまちまちなので、ご自分で調べてみてください。
何故わざわざ海外も検討するかというと、簡単な話です。
まともなddos protectionがついてて、かつ僕の財力で契約できるvpsが海外にしかないんです…
この対策のポイント
一通りカラクリは説明し終えましたので、最後にこの対策のポイントをまとめておきます。
大元のIPに攻撃を寄せ付けない
大抵の方は、自宅サーバーのIPにDDoS攻撃が来てしまった時に打てる有力な手段がないと思います(お金が無限にあれば別かもしれませんが…)。様々な手段を駆使して大元のIPの存在感をインターネット上から限りなく薄めることが大切です。
大元のIPを直接ネットに公開してしまった後にこの対策を実施した場合は、大元のIPをきちんと変えておきましょう。攻撃者が大元のIPを把握している可能性があり、わざわざそのIPめがけて攻撃してくることがあります。これだと折角対策したのに旨味が全くでません。かくいう僕も対策後1ヶ月ぐらいこれで悩まされました。
コストパフォーマンスに優れている
ddos対策は金がかかるものだと思いがちですが、今回紹介した対策法だと
…なので、まともに対策法を考えるよりは格段にリーズナブルかなーと思います。
ちなみに、僕の環境の場合は月6000~7000円程度です。
…
…(地味に高いな)
攻撃発生時の通信一時切断は妥協している
DDoS攻撃が来てもプレイヤーのゲームプレイに一切影響しないのが理想的な対策かと思いますが、今回はそこは妥協しています。
そこを突き詰めると、海外のddos protection付vpsだけにして太平洋シャトルランを許容するか(ラグによりプレイの快適性が損なわれるのを許容するか)、国内でクッソ高い金をかけて対策をとるかの2択になります。
今の所は、国内vpsと海外vpsのハイブリッド構成とすることで、プレイの快適性とサービスの継続性を両立させています。
[余談]GSLBの割り当てリストをさくらのクラウドAPIでコントロール
さっきしれっとハイブリッド構成と言いましたが、何も考えずにGSLBに全てのIPを放り込んでしまうと、通常時でも割り当てによっては太平洋シャトルランしてしまう(海外vps経由でラグる)という症状が発生します。
さくらのクラウドAPIを使うと「通常時はGSLBの割り振りを国内サーバに限定してプレイの快適性を重視。攻撃時は海外サーバを割り振りリストに自動追加してサービスの継続性を確保。」なーんてことができたりします。
この記事長すぎて書くのが疲れてきたので、詳しく書くのはまた今度にします。
[余談]さくらのGSLBだとさくらのvpsのDDoS攻撃によるDOWNをうまく拾ってくれない
最初の頃はなんともなかったのですが、ある時からさくらのvps宛にDDoS攻撃がきた時に、死活監視がうまく機能しなくなってしまいました。
今はすでに改善されているかもしれませんが、これもさくらのクラウドAPIを使うことで暫定対策を組むことができます。
…
…この記事長すぎて書くのが疲れてきたので、詳しく書くのはまた今度にします。
おわりに
気がついたら7000文字を超える超大作になっていました。流石に書くのつかれました。校正する気力すら湧きません。誤字脱字ありましたら教えてください。
本当は実際に施してる設定とかも書くべきだったのですが、対策法の概念を伝えるだけでもこの文字数だったので勘弁してやってください。気が向いたら書くことにします。
整地鯖のDDoS対策を記事に書いて欲しいという要望は前々からあったのですが、正直内容が内容だけに、書くのをためらっていたところがありました。書いて公開することはこの世のどこかにいる攻撃者の方に情報を与えてしまうことにもつながるわけで、この記事がきっかけで弱点を突かれてしまうなんてこともあり得るわけですしね。ですが最近になって、折角の自分の努力の成果をアピールしないのはそれはそれでもったいない・機会損失なのではという考えの方が強くなりました。そんな心情の変化もあって、今回公開するに至っていたりします。
対策に困っている方にとって、この方法が少しでも役に立てば…と願っています。
後日談