キマグレアドベンチャー!

(中学の時に運営してたブラウザゲームの名前)

なるべくお金をかけずにMinecraftサーバ運営とDDoS対策をするお話(2020年1月現在)

新年あけましておめでとうございます。unchamaです。

Twitterで↓のようなことを呟きつつ、表題の件について最近考えていましたので、自分の頭の整理がてら書いてみようと思いました。

イクラサーバ運営で絶対にお金がかかるところはインフラ基盤

イクラサーバ始める上で、必要なものってなんでしょう?

Minecraftが動くPC、Minecraftのライセンス、ゲームデザインの知識、プログラミング知識、インフラにまつわる知識、ホームページを作る知識、治安マネジメントの知識…必須なもの・必須ではないものも含めて、いろいろあるかと思いますが、絶対に避けて通れない壁があります。それがインフラ基盤への投資です。

インフラ基盤のお金のかかり方は悪い言い方をすると陰湿です。なぜなら一般的な社会人にとっても決して安いものではなく、かつ継続的な投資が必要で、かつ外部的要因によって『必要に応じて』ではなく『必要に迫られて』投資額が変動し、かつ作り方次第で無駄に金を浪費させることが可能であるからです。

この陰湿なお金のかかり方はやがて『経済的にサーバーを維持できない』または『やることのわりにお金がかかりすぎる』という理由を作り出し、サーバ運営をやめてしまった方をたくさん生み出してきたような気がします。

これは非常にもったいない!!!

この話は、私がOwnerとして運営している整地鯖も例外ではありません。どれだけminecraftに対するモチベーションが高くても、現実的に継続可能なお金のかかり方でないと最終的には自分の生活を苦しめることになります。これでは本末転倒です。

そんなわけで、私が3年間費用面の試行錯誤をしてきて思ったことを書いていこうかなと思います。

整地鯖の現在の月額維持費用

現在の整地鯖の月額維持費用はこんな感じです。

以下の記事も参考になるかと。(整地鯖公式ブログにお金の話を書いたときの記事)

www.seichi.network

 

クラウドリソースはまだ高い

整地鯖では、だいたい以下の構成をオンプレミス(要は自宅サーバ)で抱えています。

  • CPU:12コア 24スレッド
  • MEM:128GB
  • ストレージ:SSD1.5TB,HDD5TB

3年でメモリやCPUあたりは増設やアップデートをしていますので、総額費用としては40万円前後です。あくまで総額であり、初期構築時点では10万かかっていなかったと思います。

これをクラウドで継続的に持とうとおもうと結構しんどい金額がかかります。

たとえば、そこそこ安いvultrでも16 vCPU,64GB MEM,1280GB SSD,10TB通信/monthlyで月320ドルかかります。年間約40万円程ですね。

クラウドが一概に悪いわけではありません。インフラ側の障害があった場合は基本的に全て事業者が対応してくれますし、何よりいつ家が燃えるかわからないという恐怖()に怯える必要がありません。そこまで含めての料金ってことですね。

ただし、Minecraftサーバーはぶっちゃけ『リソース食い虫』です。

(生活鯖であれば特に)プレイヤーあたりに必要とするメモリ容量が多く、マップデータの保存にそこそこディスク容量も必要とします。また、通信量もピーク時100人規模ですと、チューニング後でも片道2TB/月程度は必要とします。

チューニング次第で必要スペック上限を下げることはある程度可能ですが、世間一般に漂っている『Minecraftサーバはリソースがかかる』と言う認識は大体合っています。ので、minecraftサーバを建てるなら、いろいろと諦めて物理で持つ…と言う結論に私は達しています。

DDoS対策の都合上、若干必要なクラウドリソースの持ち方を考える

Minecraftサーバ運営やめたくなるランキング(個人主観調べ)第2位。それはDDoSからサーバを守ることです。去年に書いた屍戦法の記事に書いていますが、対策方法の都合上、自宅サーバでも若干のクラウドリソースを持つ必要があります。

unchama.hatenablog.com

 このクラウドリソースの持ち方なのですが、最近の私の主流は『固定課金の安価なクラウド』+『従量課金のDDoS対策ちゃんとやってるクラウド』の併せ持ちです。

実際に整地鯖は以下のような構成でもっています。

攻撃を受けた際はVultr側が落ちるので、自動的にGCPに切り替わりサービス継続する仕組みを構築しています。

GCPの基盤はあのGoogle様が独自に持っている基盤なのでサイツヨなのですが、費用がやばいです。ホットスタンバイで動かしているだけでも良い感じにお金が飛んでいきます。

そこで、GCPをコールドスタンバイ方式に変えてみました。これはつまりどういうことかというと、Vultrがダウンした時だけGCP側のインスタンスを自動で起動させ、サービスを提供させるというものです。

GCPは2020年1月現在ですと、停止されているインスタンスに対して課金を要求してこないので、攻撃を全く受けない月であればDDoS対策としてかかる費用は、vultrとさくらのGSLB(1200円+550円)以外不要となり、良い感じになりました。

この辺りの仕組みを実装するには、『停止状態に対して課金されるかどうか』『スクリプトなどからインスタンスの停止起動を行えるAPIコマンドラインが提供されているか』あたりが大事になって来るかと思います。

個人で従量課金クラウドは高すぎて使えないわ〜とずっと思っていたんですが、結局どうやって上手に使うかなんだなとしみじみ思ってしまいました。

えっ。わたしのサーバ、高すぎ・・・?

以上、Minecraftのインフラのコストのお話でしたが、いかがでしたでしょうか。

『こうすればもっと安くなるわよ!』という鬼嫁もびっくりコストカッターな方がいらっしゃいましたら是非教えてください。喜んで斬られに行きます。今現在世の中にある他のサービス、または将来リリースされるサービスを使えば、さらにコストカットができるかもしれません。クラウド競争激化?で単純に今より費用が下がるかもしれないし。その辺りの動向は今後も追って行きたいですね。

これからサーバ運営を考えている方、または現在サーバ運営されている方は、是非無理のない投資計画を立ててみてください。そうすれば長続きするはずです。くれぐれも、将来の自分の首を絞めないように…お財布ご自愛くださいませ。

GCPの通信量の従量課金の仕組みが初見だと非常に分かりにくかったので備忘録

GCPの通信量の従量課金の説明が個人的にめちゃくちゃ日本人泣かせなので備忘録です。

 

ネットワークの料金  |  Compute Engine ドキュメント  |  Google Cloud

 

"ingress"の日本語訳が"上り"

"egress"の日本語訳が"下り"

"ingress"は"GCPに入ってくる通信"を指す

"egress"は"GCPから出て行く通信"を指す

 

上り下りは"仮想マシンから見た上り下り"ではないことに注意です。日本感覚で捉えるとナンジャコリャ〜となりますたぶん。

 

これ、何がびびったって、GCPのCompute Nodeの通信量課金は"egress"に対して行われるわけですが、これを日本語訳すると"下り"になるわけです。下りって聞いたら、日本の通信文化に慣れ親しんだ人であれば受信側の通信にお金かかるんだーって一瞬なってしまうわけですね。

 

私はanycast ipなどのgoogleのバックボーンをうまく使った強固なddos耐性に惹かれて……つまりddosられる前提でgcpを契約した為、マジで受信通信に課金されたら財務的に殺されるのが目に見えていたのでかなり焦りました。甘い謳い文句でクラウド破産させる気かお前は!!!!

 

実際は日本的にいうと"上り"…つまり送信通信に課金されるので、ddosられたパケットをそっくりそのまま別のデータセンターに垂れ流すみたいな設定になってなければ大丈夫です。

実際、私が運営してる整地鯖はしょっちゅう攻撃が来ますが、L3L4レベルの攻撃は大丈夫そうです。L7レベルの攻撃が来るとそのまま別のデータセンターに垂れ流してしまうので、rate_limittingかけるなどして対策しましょう。

 

ただしロードバランサーなどは受信に対しても課金あるようなのでお気をつけ下さい。私はまだ死にたくないので使っていません。

 

bungeecordでhaproxyを利用しつつ接続元のorigin ipを取得する方法

Javaminecraftサーバ(bungeecord+spigot)を運営されており、DDoS対策などでhaproxyをつかったリバースプロキシを利用されている方向けの記事です。

 

単純にリバースプロキシ(haproxy)を導入するだけだと、bungeecord上で各プレイヤーの接続元のIPアドレスが全てリバースプロキシサーバのIPアドレスになってしまいますので、何かと不都合がでます。proxycheck.ioなどと連携してVPN・プロキシ経由の接続をブロックするプラグインがまともに機能しなくなったり、IP-BANしたら全員入れなくなったり…

この記事では、リバースプロキシ環境配下でもプレイヤーの本来の接続元IPアドレス(これは英語文献ですと大体Origin IPなどと呼んでいます)をbungeecord上で識別できるようにするための設定方法をご紹介します。

ざっくりいうと、http(s)プロトコルでいうx-forwarded-forヘッダみたいなことができるということです。

 

・bungeecordのconfig.ymlを編集

・haproxyのhaproxy.cfgを編集

・【番外編】BotAttack防止設定

 

bungeecordのconfig.ymlを編集

proxy_protocolをfalse->trueに変更します。変更後は再起動で反映されます。

proxy_protocol: true

なお、この設定をすると以後後述の設定を施したhaproxy以外からは接続できなくなりますのでご注意ください。

haproxyのhaproxy.cfgを編集 

/etc/haproxy/haproxy.cfg を編集します。変更後は再起動(systemctl restart haproxy とか。OSによる)で反映されます。

フォワード先のIPアドレスとポートを指定している箇所があるかと思いますが、そこのオプションに”send-proxy-v2”を追加します。

#---------------------------
# minecraft server gateway
#---------------------------
listen minecraftsv01
    bind 0.0.0.0:25565
    mode tcp
    option tcplog
    balance roundrobin
    server mc01 <DestinationIP>:<DestinationPort> send-proxy-v2

【番外編】BotAttack防止設定

上述の設定でこの記事の本来の目標は達成されますが、上述のオプションを利用するとBotAttackに対して脆弱になりますので注意が必要です。

実際、私が運営している整地鯖にも今年(2019年)10月ごろにBotAttackによってサーバが非常に不安定となる事案が発生しました。

本来bungeecordには大量のログインリクエストによりサーバが過負荷となるのを防止するために、config.ymlに”connection_throttle”と”connection_throttle_limit”と呼ばれる、同一IPからの大量リクエストに対する応答を抑制するオプション*1が備わっているのですが、”proxy_protocol”がtrueとなってる環境では意図的に無効化されてしまう挙動となっているみたいです。

この無効化される挙動は2019/3以降にリリースされたbungeecordに該当します。

 

(ちなみに、元々私はこの仕組みを「IP関係なくbungee全体で大量ログインリクエスト発生時それをある程度リクエスト拒否してサーバ過負荷を抑える機能」と認識していたのですが、それはhaproxy環境下でたまたまそのように動作しただけで、その動作自体は不具合として認識されていたっぽいです。)

https://github.com/SpigotMC/BungeeCord/issues/2590

 

で、じゃあどう対策するんですか?という話 ですが、haproxy側で秒間のリクエスト数を制限することができますので、これを利用します。BotAttack中は新規ログインも張りづらくなる副作用は存在しますが、サーバ丸ごと過負荷に陥る事態は回避できますので、ログイン中のプレイヤーは快適にプレイし続けることが可能です。許容するリクエスト数は、サーバのログイン状況に応じて調整が必要です。

haproxy.cfgの編集例を記載しておきます。

#---------------------------------------------------------------------
# minecraft server gateway
#---------------------------------------------------------------------
frontend minecraft
    mode tcp bind 0.0.0.0:25565
    option tcplog

    tcp-request inspect-delay 5s

    acl too_fast fe_sess_rate gt 10
    tcp-request content reject if too_fast

    use_backend seichi

backend seichi
    mode tcp server mc1 <DestinationIP>:<DestinationPort> send-proxy-v2

赤字の部分がミソで、上記の例ですと新規リクエストが秒間10回以上来た場合、以降のリクエストは自動的に拒否してくれます。

ちなみに、”fe_sess_rate"などのhaproxy上で設定できるパラメータに関しては公式ドキュメント↓にかなり詳細な説明があります*2ので、設定を突き詰めたい方は読んでみると良いかもしれません。

https://cbonte.github.io/haproxy-dconv/

 

 

いつも通り勢いで書き切りましたので、ここがわかりづらい・もっと聞きたいなどあればコメント欄にお寄せいただけますと泣いて喜びます。記事ネタリクエストもお待ちしております。

*1:私の実体験上こういうオプションだと思っています 根拠はないんだ〜

*2:英語ですけどね!!!!!!!!!!google 翻訳とkiaiで読めなくはないですが、僕は読み始めて5msで疲れました

Minecraft Bedrock Editionが個人的に激アツなので nginx でMinecraft Bedrock Edition の通信をフォワードする(ついでにdocker-composeでデプロイする)

Minecraft 10周年めでたいですね!unchamaです。

今回も以下の記事の補足的なものです*1

unchama.hatenablog.com

 

私が大学時代から運営しているのはMinecraftのPC版(Java Edition)のマルチプレイサーバーです。それ以外のエディション(スマホでやるやつとか、コンシューマ機でやるやつとか)には全く見向きしていなかったのですが、最近*2Bedrock Editionなるものがリリースされていたようです。

このBedrockというのが個人的に激アツです。なぜかというと、これまでにないレベルでのクロスプラットフォーム対応!!

napoan.com

詳しくは上のナポアンさんの記事がよくまとまっていますのでみていただくとして、このBedrock Edition、対応プラットフォームの量がとにかくすごい(Win10,iOS,Android and more...)。あとはこれはよく調べてないので間違っていたらごめんなさいですが、Xboxアカウントによるプレイヤー認証もやってくれているっぽい(Java版でいうオンラインモードみたいなの)。前はなかったんですよね確か。とにかく知らぬまに色々進化しているっぽいのです。

 

MinecraftJava版だとBukkitのフォーク?であるSpigotなどを使用することでプラグインによる機能拡張が可能なマルチプレイサーバーを立てることが可能ですが、Bedrock EditionにもSpigotのようなものは存在するっぽいです。Nukkitとか、Pockermine-MPとかですね。

ch.nicovideo.jp

NukkitはJavaベースみたいなので、Spigotのプラグインを書いた経験のある方ならちょっと勉強すればかけるようになるかもしれないです。私はずーっとインフラ側を中心に弄ってきた関係でプログラミングには疎いわけですが、これを機に何か書いてみるのも面白いのかなーなんて考えています。

github.com

ちなみにPocketMine-MPはまさかのphpベースらしいです。phpってweb系の言語じゃなかったっけ!?!?!?

 

すみません、やっと本題です

自称通信フォワードおじさんです。今回も根城のIPを隠蔽するためにリバースプロキシサーバーを建ててみました。

unchama.hatenablog.com

まず前置きになりますが、上記の記事では、Minecraft "Java(ここ大事)" Editionの通信をリバースプロキシ噛ませる(中継させる)ためにhaproxyというソフトウェアを使用しています。

実は、haproxyはTCP通信のみ対応でした。それに対してMinecraft Bedrock Editionの通信はUDPです。つまりhaproxyは使えません。

 

…と思ってggりはじめたら割と一瞬で見つかってしまいました。どうやらnginxのロードバランシング機能がudpに対応しているっぽいです。nginxはapacheとかと並んでwebサーバーの代表的なソフトウェアの一つっていう認識があったのですが、こんなこともできるんですね。

tatsushid.github.io

 

そんなわけで、錬成してみました。今回はnukkitの検証も兼ねていたので、一緒にnukkit+nginxのコンテナが立ち上がるdocker-compose.ymlになっています。

なおBedrock Editionのサーバーを運営したことがないため、例えばDDoS攻撃を受けた時に中継サーバーや根城のサーバーがどのような挙動をするかは全く不明です*3。参考にしていただいて構いませんが、自己責任ということでよろしくお願いします。

 

nukkit+nginxのdocker-composeをたててnginx reverse proxy ...

*1:というか、これまで某記事の補足しか書いていない件について

*2:Minecraft史においては最近に分類される筈

*3:そもそもTCPプロトコルではなくUDPプロトコルだし。UDPプロトコル全くわからん。対戦よろしくお願いします

haproxyでMinecraft Java Editionの通信をフォワードする(ついでにdocker-composeでデプロイする)

MacBook Pro 2018年モデルいいぞ。unchamaです。

 今回も、以下の記事の補足的なものになります。

unchama.hatenablog.com

 上の記事の中で、haproxyを使って通信を中継させることで、根城のIPアドレスを隠蔽する方法を紹介していますが、その中継サーバーの設定ファイルの一例を紹介したいと思います。

最近dockerとdocker-composeにはまっているので、dockerでのデプロイに必要なファイル群を一緒に公開していますが、「dockerよくわからないのでとりあえずhaproxyを入れて設定したあと稼働させたい」という方はhaproxy.confファイルだけ参考にしていただければOKかと思います*1

haproxyの導入方法自体はgoogle先生に聞くと先人の方が色々書いてくださっていると思いますので、そちらを参考にしてみてください。

超特急で書いてますので、ここわからねえぞ!!というのがあればコメントください。適宜追記していくこととします。

 

gist11277ce0ce6d3a0b4722afd8dd64461f

*1:FWの設定などなどを忘れずに

さくらのGSLB上の登録アドレスを死活監視に応じて動的にコントロールするスクリプトを書いた

ご無沙汰しております。unchamaです。

前回の記事を書いてから早くも3ヶ月がたってしまいました。時が経つのははやいものですね…

unchama.hatenablog.com

以前の記事ですが、内容が内容だけにいろんな方から反響をいただきました。自分の考えた対策法に対してすげぇって言ってもらえるのは素直に嬉しいですよね。Twitterでリプ+空リプしてくださった皆様などなど、読んでいただきありがとうございました。

あと、これは予想通りの反響といえばそうなのですが、DDoS攻撃の頻度が明らかに増えました。特に先月(2018年4月)は本当にひどくって、ほぼ毎日襲来していました。中には100Gbps超級の攻撃の観測もあったので普通にドン引きしています。

その時点では、国内のvps*1が落とされた時は海外のDDoS Protection付vps*2を経由するようGSLBのレコードをさくらのクラウドAPIで動的に書き換えていました。ただ攻撃の頻度が増したことで、通信が海外経由になってしまう時間が増えてしまい、プレイの際の通信ラグの影響がだんだん無視できなくなってきてしまいました。またvultrのDDoS Protectionは10Gbpsまでしか対応していないため、それを超える攻撃を受けると通信遮断(null route)されてしまうこともわかりました。*3

これは別サービスを検討しないとな〜と考えていたわけですが、 色々あって*4気が付いたら金で殴るインフラを契約してしまっていました。GCP(Google Cloud Platform)というやつです。結果として、上述の挙動はかなりマシになりました。さすが天下のgoogleという感じがします*5。詳しい挙動は気が向いたらまた書こうかと思います。

 

さて、まさかのここから本題なのですが、前回の記事でさくらのGSLB上のIPを動的に書き換えることができると述べた点について、具体的にどうやっているのかについて触れていきたいと思います。

さくらのクラウドにはさくらのクラウドAPIなるものが提供されています。これをつかうことで、さくらのクラウド内の様々なリソースを追加、削除、編集することが可能です。ドキュメントはこちら。

developer.sakura.ad.jp

 さくらのクラウドAPIはRESTベースで提供されています。 

qiita.com

ざっくりいうとプログラムを使って、特定のURLに対して、やってほしいこと(情報の取得だとか、変更だとか、削除だとか)を書いたjsonと自らを証明するシークレットキーを一緒に送ってやることで、GUIを経由せずともリソースの設定情報の自動書き換えが可能になるわけです。かがくのちからってすげー! 

 

参考までに、整地鯖で以前使っていたシェルスクリプトソースコードを以下に貼っておきます。ざっくりいうとやっている内容は以下の通りです。

・対象IPアドレス達にpingを送信して疎通確認する

・結果からGSLBに登録するIPのリストを生成する

・リストを使ってjsonを作る

curlで送信する

・処理結果に異常が見られた場合、Disordに通知しておく

実際に使う際は、APIのシークレットキーやGSLBのアプライアンスID、Discordのwebhookアドレスなどなどを取得する必要がありますのでご注意ください。

あとは、cronで数分おき*6に回すようにしておけば、あとは死活状況に応じて動的にGSLBを書き換えてくれるようになります。

みなさんの参考になれば幸いです。

gist44dbcb21f4545c18993acce8c919c21e

 

*1:ちなみにさくらのVPS

*2:ちなみにvultrのロサンジェルスリージョン

*3:10Gbpsを超える攻撃を観測した時点より、1時間単位でnull routeが適用される仕様っぽい。復旧に1時間以上かかったタイプは経験したことがない

*4:某予定通りいけば令和元年にカットオーバーされる予定のマイクラマルチサーバーが金で殴るインフラを使うという話を耳にした為。僕は常に他人の影響を強くうけるタイプです。対戦よろしくおねがいします。

*5:ただしお財布は常に怯えている

*6:さくらのクラウドAPIに限った話ではないですが、あまり頻度が短いと負荷の面からリクエスト拒否されるかもしれません。良心的な間隔で使いましょう

MinecraftサーバーでDDoS対策やってみた

 

良い機会なので、私が整地鯖運営を通して経験した闘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ネットワークを作るわけでは無いのですが)インターネット側からの通信を全部ローカルの特定ホストに流せる様なので、症状発生中に試しに設定してみたわけです。

設定後ネットワークモニターをみて愕然しました。

 

なんなんだこのトラフィック量は?!?!?!

f:id:unchaman:20190213084218j:image

 

これが私とDDoSのはじめての出会いでした。

 

DDoS攻撃とは

DDoS攻撃とは、日本語訳すると分散型サービス拒否攻撃?と呼ぶそうです。

現在の地球上の広大なネットワーク(インターネット)は様々な標準化された仕組み(OSIの7階層なんちゃらとか、TCP/IPとか)によって相互通信を可能にしているわけですが、ざっくりいうとこの標準的な設計の欠陥を突くことで、世界のどこかの悪い人が落としたいサーバーを通信不能に陥れることができちゃうって感じです。

詳しくは…

???『google先生!出番よ!』

ポイッ

ddos攻撃 - 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

 

材料はこちら。

  1. vps 個数はお好みで
  2. さくらのクラウドのGSLB 1個

 

以下の様に調理します。

  1. vpsにhaproxyを入れる
  2. haproxyに大元のminecraftサーバへの通信設定を入れて、vpsのipを叩いたらhaproxyを経由して大元のMinecraftサーバーに繋がる様にする
  3. 2.の設定を全vpsにぶち込む
  4. vpsのipをGSLBの設定にぶち込む
  5. プレイヤーにはGSLBのFQDN名で接続させる、またはお手持ちのドメインのCNANEレコードにぶち込む
  6. 大元のIPはなんらかの手段で変更しておく

完成♡

 

 

 

 

解説します。

 

vpsってなんぞや

vpsとは、ざっくりいうと自宅サーバーとか建てなくても自分だけのサーバーを持つことができるサービスのことです。詳細はググればいっぱい出てきますので割愛します。

 

haproxyってなんぞや

 haproxyとは、リバースプロキシのオープンソースソフトウェアです。こちらも詳細はggればでてきますので割愛しますが、色々な通信を中継させることができる機能を持っています。配下のサーバーに均等にアクセスを振り分けたり(負荷分散)、一時的に死んでるサーバを避けて通信を振り分けたり(冗長構成,縮退運行)するために使うのが主流っぽいです。今回はプレイヤーからの接続を大元のMinecraftサーバーの代わりに受け付けてもらう為に使います。

 

 GSLBってなんぞや

広域負荷分散っていうそうです。名前解決時点で負荷分散や死活監視をおこなってくれます。今回はプレイヤーからの接続を死んでいないvps(haproxy)に誘導する為に使います。

GSLB(広域負荷分散) | さくらのクラウド ドキュメント

 

接続経路

調理方法に沿って調理すると、プレイヤーの接続経路は以下のように変化します。

 

(Before)

DNSに問い合わせて、大元のMinecraftサーバーのIPを取得

②プレイヤー -(接続)-> 大元のMinecraftサーバー

(After)

DNSに問い合わせて、GSLBによって選択されたvpsのIPを取得

②プレイヤー -(接続)-> vps(haproxy) -(中継)-> 大元のMinecraftサーバー

 

(20190609追記)図で表すとこんな感じ。

f:id:unchaman:20190609130649p:plain

 

このような構成にすると、プレイヤー側から大元のMinecraftサーバーのIPアドレスは見えなくなり、代わりにvpsIPアドレスが見えるようになります。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が海外にしかないんです…

 

(20190711追記)この記事書いた当初はvultrを使っていました。国内リージョンもありますが、ddos protectionは海外リージョンのみで利用可能なオプションです。国内、海外共にスペックの割に安いし回線品質も良さげなのでおすすめしておきます。

 上のツイートのリンクは期間限定らしいので、リンク切れてたら以下から登録してやってください(特典はないけど)。心ばかり紹介マージンが入るので、鯖の維持費の足しにします。

www.vultr.com

ちなみにこの追記を書いている時は何を使っているかというと、vultrの国内リージョンとGCPの国内リージョンを併せ技で使っています。GCPはDDoSからの復旧が早くて優秀なのですが一般人のお財布に全く優しくないので普段は安いvultrを経由させることで費用を圧縮しています。 (追記ここまで)

 

 この対策のポイント

一通りカラクリは説明し終えましたので、最後にこの対策のポイントをまとめておきます。

大元のIPに攻撃を寄せ付けない

大抵の方は、自宅サーバーのIPにDDoS攻撃が来てしまった時に打てる有力な手段がないと思います(お金が無限にあれば別かもしれませんが…)。様々な手段を駆使して大元のIPの存在感をインターネット上から限りなく薄めることが大切です。

大元のIPを直接ネットに公開してしまった後にこの対策を実施した場合は、大元のIPをきちんと変えておきましょう。攻撃者が大元のIPを把握している可能性があり、わざわざそのIPめがけて攻撃してくることがあります。これだと折角対策したのに旨味が全くでません。かくいう僕も対策後1ヶ月ぐらいこれで悩まされました。

 

コストパフォーマンスに優れている 

ddos対策は金がかかるものだと思いがちですが、今回紹介した対策法だと

  • 国内vpsは1台あたり1000円/月程度
  • さくらのGSLBは月額たったの540円
  • 海外のddos protection付vpsも数千円/月程度

…なので、まともに対策法を考えるよりは格段にリーズナブルかなーと思います。

ちなみに、僕の環境の場合は月6000~7000円程度です。

…(地味に高いな)

 

 攻撃発生時の通信一時切断は妥協している

DDoS攻撃が来てもプレイヤーのゲームプレイに一切影響しないのが理想的な対策かと思いますが、今回はそこは妥協しています。

そこを突き詰めると、海外のddos protection付vpsだけにして太平洋シャトルランを許容するか(ラグによりプレイの快適性が損なわれるのを許容するか)、国内でクッソ高い金をかけて対策をとるかの2択になります。

今の所は、国内vpsと海外vpsのハイブリッド構成とすることで、プレイの快適性とサービスの継続性を両立させています。

 

[余談]GSLBの割り当てリストをさくらのクラウドAPIでコントロール

さっきしれっとハイブリッド構成と言いましたが、何も考えずにGSLBに全てのIPを放り込んでしまうと、通常時でも割り当てによっては太平洋シャトルランしてしまう(海外vps経由でラグる)という症状が発生します。

そこで、さくらのクラウドAPIの登場です。

さくらのクラウドAPIを使うと「通常時はGSLBの割り振りを国内サーバに限定してプレイの快適性を重視。攻撃時は海外サーバを割り振りリストに自動追加してサービスの継続性を確保。」なーんてことができたりします。

この記事長すぎて書くのが疲れてきたので、詳しく書くのはまた今度にします。

(20190512追記)書きました。↓

unchama.hatenablog.com

 

 

[余談]さくらのGSLBだとさくらのvpsDDoS攻撃によるDOWNをうまく拾ってくれない

最初の頃はなんともなかったのですが、ある時からさくらのvps宛にDDoS攻撃がきた時に、死活監視がうまく機能しなくなってしまいました。

今はすでに改善されているかもしれませんが、これもさくらのクラウドAPIを使うことで暫定対策を組むことができます。

…この記事長すぎて書くのが疲れてきたので、詳しく書くのはまた今度にします。

(20190512追記)書きました。↓

unchama.hatenablog.com

 

おわりに

気がついたら7000文字を超える超大作になっていました。流石に書くのつかれました。校正する気力すら湧きません。誤字脱字ありましたら教えてください。

本当は実際に施してる設定とかも書くべきだったのですが、対策法の概念を伝えるだけでもこの文字数だったので勘弁してやってください。気が向いたら書くことにします。

整地鯖のDDoS対策を記事に書いて欲しいという要望は前々からあったのですが、正直内容が内容だけに、書くのをためらっていたところがありました。書いて公開することはこの世のどこかにいる攻撃者の方に情報を与えてしまうことにもつながるわけで、この記事がきっかけで弱点を突かれてしまうなんてこともあり得るわけですしね。ですが最近になって、折角の自分の努力の成果をアピールしないのはそれはそれでもったいない・機会損失なのではという考えの方が強くなりました。そんな心情の変化もあって、今回公開するに至っていたりします。

対策に困っている方にとって、この方法が少しでも役に立てば…と願っています。

 

後日談