なるべくお金をかけずにMinecraftサーバ運営とDDoS対策をするお話(2020年1月現在)
新年あけましておめでとうございます。unchamaです。
Twitterで↓のようなことを呟きつつ、表題の件について最近考えていましたので、自分の頭の整理がてら書いてみようと思いました。
整地鯖の運営を始めて3年と約半年、皆さんから頂いた寄付金が初めて底を尽きました。そもそも、これだけの規模のサーバーをこれまで費用負担無しで運営出来たのは皆さんのお陰であり、感謝しかありません。幸い給与のある社会人になれましたので、当分はポケットマネーで存続できそう。 #整地鯖
— unchama うんちゃま (@tsukkkkkun) 2020年1月18日
マイクラサーバ運営で絶対にお金がかかるところはインフラ基盤
マイクラサーバ始める上で、必要なものってなんでしょう?
Minecraftが動くPC、Minecraftのライセンス、ゲームデザインの知識、プログラミング知識、インフラにまつわる知識、ホームページを作る知識、治安マネジメントの知識…必須なもの・必須ではないものも含めて、いろいろあるかと思いますが、絶対に避けて通れない壁があります。それがインフラ基盤への投資です。
インフラ基盤のお金のかかり方は悪い言い方をすると陰湿です。なぜなら一般的な社会人にとっても決して安いものではなく、かつ継続的な投資が必要で、かつ外部的要因によって『必要に応じて』ではなく『必要に迫られて』投資額が変動し、かつ作り方次第で無駄に金を浪費させることが可能であるからです。
この陰湿なお金のかかり方はやがて『経済的にサーバーを維持できない』または『やることのわりにお金がかかりすぎる』という理由を作り出し、サーバ運営をやめてしまった方をたくさん生み出してきたような気がします。
これは非常にもったいない!!!
この話は、私がOwnerとして運営している整地鯖も例外ではありません。どれだけminecraftに対するモチベーションが高くても、現実的に継続可能なお金のかかり方でないと最終的には自分の生活を苦しめることになります。これでは本末転倒です。
そんなわけで、私が3年間費用面の試行錯誤をしてきて思ったことを書いていこうかなと思います。
整地鯖の現在の月額維持費用
現在の整地鯖の月額維持費用はこんな感じです。
- さくらのVPS(1台):990円
- さくらのクラウド(GSLB):550円
- NURO光(固定回線代):5300円
- Vultr(VPS2台):1200円
- GCP(VPS1台):0円 ※理由は後述
- 自宅サーバの電気代:約4000円
- 合計費用:12040円 / 月
以下の記事も参考になるかと。(整地鯖公式ブログにお金の話を書いたときの記事)
クラウドリソースはまだ高い
整地鯖では、だいたい以下の構成をオンプレミス(要は自宅サーバ)で抱えています。
- 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からサーバを守ることです。去年に書いた屍戦法の記事に書いていますが、対策方法の都合上、自宅サーバでも若干のクラウドリソースを持つ必要があります。
このクラウドリソースの持ち方なのですが、最近の私の主流は『固定課金の安価なクラウド』+『従量課金の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"の日本語訳が"下り"
"egress"は"GCPから出て行く通信"を指す
上り下りは"仮想マシンから見た上り下り"ではないことに注意です。日本感覚で捉えるとナンジャコリャ〜となりますたぶん。
これ、何がびびったって、GCPのCompute Nodeの通信量課金は"egress"に対して行われるわけですが、これを日本語訳すると"下り"になるわけです。下りって聞いたら、日本の通信文化に慣れ親しんだ人であれば受信側の通信にお金かかるんだーって一瞬なってしまうわけですね。
私はanycast ipなどのgoogleのバックボーンをうまく使った強固なddos耐性に惹かれて……つまりddosられる前提でgcpを契約した為、マジで受信通信に課金されたら財務的に殺されるのが目に見えていたのでかなり焦りました。甘い謳い文句でクラウド破産させる気かお前は!!!!
実際は日本的にいうと"上り"…つまり送信通信に課金されるので、ddosられたパケットをそっくりそのまま別のデータセンターに垂れ流すみたいな設定になってなければ大丈夫です。
実際、私が運営してる整地鯖はしょっちゅう攻撃が来ますが、L3L4レベルの攻撃は大丈夫そうです。L7レベルの攻撃が来るとそのまま別のデータセンターに垂れ流してしまうので、rate_limittingかけるなどして対策しましょう。
ただしロードバランサーなどは受信に対しても課金あるようなのでお気をつけ下さい。私はまだ死にたくないので使っていません。
bungeecordでhaproxyを利用しつつ接続元のorigin ipを取得する方法
Java版minecraftサーバ(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となってる環境では意図的に無効化されてしまう挙動となっているみたいです。
まとめると、bungeecordのconnection_throttle_limitが効いていなかった。これがちゃんと聞いてればボットネットによるログインアタック中も新規ログインは貼りにくくとも既存のセッションには影響しないんだが、今年2月のfixでproxy_protocol=trueにした時に限って無効化される挙動に書き換わってた。
— unchama うんちゃま (@tsukkkkkun) 2019年10月13日
この無効化される挙動は2019/3以降にリリースされたbungeecordに該当します。
ちな、今回の事象のトリガーとなったbungeecordのfixはこちらhttps://t.co/LeKI03DGFx
— unchama うんちゃま (@tsukkkkkun) 2019年10月13日
(ちなみに、元々私はこの仕組みを「IP関係なくbungee全体で大量ログインリクエスト発生時それをある程度リクエスト拒否してサーバ過負荷を抑える機能」と認識していたのですが、それはhaproxy環境下でたまたまそのように動作しただけで、その動作自体は不具合として認識されていたっぽいです。)
てか元々のconnection_throttle_limitの想定した動き違ったっぽいな。元々は同一の接続元IPからのリクエスト数を制限するものだったっぽい。それがhaproxy通したことで全部接続元が同じIPとして認識された結果、たまたまボットネットの攻撃に対して良い作用をしてただけっぽい
— unchama うんちゃま (@tsukkkkkun) 2019年10月15日
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/
いつも通り勢いで書き切りましたので、ここがわかりづらい・もっと聞きたいなどあればコメント欄にお寄せいただけますと泣いて喜びます。記事ネタリクエストもお待ちしております。
Minecraft Bedrock Editionが個人的に激アツなので nginx でMinecraft Bedrock Edition の通信をフォワードする(ついでにdocker-composeでデプロイする)
Minecraft 10周年めでたいですね!unchamaです。
今回も以下の記事の補足的なものです*1。
私が大学時代から運営しているのはMinecraftのPC版(Java Edition)のマルチプレイサーバーです。それ以外のエディション(スマホでやるやつとか、コンシューマ機でやるやつとか)には全く見向きしていなかったのですが、最近*2Bedrock Editionなるものがリリースされていたようです。
このBedrockというのが個人的に激アツです。なぜかというと、これまでにないレベルでのクロスプラットフォーム対応!!
詳しくは上のナポアンさんの記事がよくまとまっていますのでみていただくとして、このBedrock Edition、対応プラットフォームの量がとにかくすごい(Win10,iOS,Android and more...)。あとはこれはよく調べてないので間違っていたらごめんなさいですが、Xboxアカウントによるプレイヤー認証もやってくれているっぽい(Java版でいうオンラインモードみたいなの)。前はなかったんですよね確か。とにかく知らぬまに色々進化しているっぽいのです。
MinecraftJava版だとBukkitのフォーク?であるSpigotなどを使用することでプラグインによる機能拡張が可能なマルチプレイサーバーを立てることが可能ですが、Bedrock EditionにもSpigotのようなものは存在するっぽいです。Nukkitとか、Pockermine-MPとかですね。
NukkitはJavaベースみたいなので、Spigotのプラグインを書いた経験のある方ならちょっと勉強すればかけるようになるかもしれないです。私はずーっとインフラ側を中心に弄ってきた関係でプログラミングには疎いわけですが、これを機に何か書いてみるのも面白いのかなーなんて考えています。
ちなみにPocketMine-MPはまさかのphpベースらしいです。phpってweb系の言語じゃなかったっけ!?!?!?
すみません、やっと本題です
自称通信フォワードおじさんです。今回も根城のIPを隠蔽するためにリバースプロキシサーバーを建ててみました。
まず前置きになりますが、上記の記事では、Minecraft "Java(ここ大事)" Editionの通信をリバースプロキシ噛ませる(中継させる)ためにhaproxyというソフトウェアを使用しています。
実は、haproxyはTCP通信のみ対応でした。それに対してMinecraft Bedrock Editionの通信はUDPです。つまりhaproxyは使えません。
…と思ってggりはじめたら割と一瞬で見つかってしまいました。どうやらnginxのロードバランシング機能がudpに対応しているっぽいです。nginxはapacheとかと並んでwebサーバーの代表的なソフトウェアの一つっていう認識があったのですが、こんなこともできるんですね。
そんなわけで、錬成してみました。今回はnukkitの検証も兼ねていたので、一緒にnukkit+nginxのコンテナが立ち上がるdocker-compose.ymlになっています。
なおBedrock Editionのサーバーを運営したことがないため、例えばDDoS攻撃を受けた時に中継サーバーや根城のサーバーがどのような挙動をするかは全く不明です*3。参考にしていただいて構いませんが、自己責任ということでよろしくお願いします。
haproxyでMinecraft Java Editionの通信をフォワードする(ついでにdocker-composeでデプロイする)
MacBook Pro 2018年モデルいいぞ。unchamaです。
今回も、以下の記事の補足的なものになります。
上の記事の中で、haproxyを使って通信を中継させることで、根城のIPアドレスを隠蔽する方法を紹介していますが、その中継サーバーの設定ファイルの一例を紹介したいと思います。
最近dockerとdocker-composeにはまっているので、dockerでのデプロイに必要なファイル群を一緒に公開していますが、「dockerよくわからないのでとりあえずhaproxyを入れて設定したあと稼働させたい」という方はhaproxy.confファイルだけ参考にしていただければOKかと思います*1。
haproxyの導入方法自体はgoogle先生に聞くと先人の方が色々書いてくださっていると思いますので、そちらを参考にしてみてください。
超特急で書いてますので、ここわからねえぞ!!というのがあればコメントください。適宜追記していくこととします。
gist11277ce0ce6d3a0b4722afd8dd64461f
*1:FWの設定などなどを忘れずに
さくらのGSLB上の登録アドレスを死活監視に応じて動的にコントロールするスクリプトを書いた
ご無沙汰しております。unchamaです。
前回の記事を書いてから早くも3ヶ月がたってしまいました。時が経つのははやいものですね…
以前の記事ですが、内容が内容だけにいろんな方から反響をいただきました。自分の考えた対策法に対してすげぇって言ってもらえるのは素直に嬉しいですよね。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なるものが提供されています。これをつかうことで、さくらのクラウド内の様々なリソースを追加、削除、編集することが可能です。ドキュメントはこちら。
ざっくりいうとプログラムを使って、特定のURLに対して、やってほしいこと(情報の取得だとか、変更だとか、削除だとか)を書いたjsonと自らを証明するシークレットキーを一緒に送ってやることで、GUIを経由せずともリソースの設定情報の自動書き換えが可能になるわけです。かがくのちからってすげー!
参考までに、整地鯖で以前使っていたシェルスクリプトのソースコードを以下に貼っておきます。ざっくりいうとやっている内容は以下の通りです。
・結果からGSLBに登録するIPのリストを生成する
・リストを使ってjsonを作る
・curlで送信する
・処理結果に異常が見られた場合、Disordに通知しておく
実際に使う際は、APIのシークレットキーやGSLBのアプライアンスID、Discordのwebhookアドレスなどなどを取得する必要がありますのでご注意ください。
あとは、cronで数分おき*6に回すようにしておけば、あとは死活状況に応じて動的にGSLBを書き換えてくれるようになります。
みなさんの参考になれば幸いです。
gist44dbcb21f4545c18993acce8c919c21e
MinecraftサーバーでDDoS対策やってみた
#整地鯖 #整地鯖春 がDDOS攻撃を受けた際は、余程強いものでなければ10分程度で自動復旧し、再接続可能となります。 コストパフォーマンスを考慮した防御体制の制約上、攻撃終了までは通信ラグの症状が出る事がありますが、予めご了承ください。
— unchama うんちゃま (@tsukkkkkun) 2019年2月5日
良い機会なので、私が整地鯖運営を通して経験した闘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対策で困ってる人に読んで欲しい!レイヤー3,4レベルの攻撃が殆どで、ホストサーバのファイアウォールの設定などでは防げないので、マイグレーション付きのVPSにプロキシサーバ建てて間にかますなどの対策が必要です。 https://t.co/pYdZjLImNO
— unchama うんちゃま (@tsukkkkkun) 2018年8月6日
ちなみに一度攻撃を受けると、基本は攻撃が終了するまで通信不能な状態が続きます。
数分でパッと終わることもあれば、毎日ゴールデン時間帯だけ落とされたりとか、ひどい時は丸一日なんてこともありました。どんな原因であれ、まともに遊ばせてくれないサーバーからはプレイヤーは離れてしまうものです。運営チームの士気も下がっちゃいますし、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倍分かりやすいです。
1000個のグローバルIPとは恐れ入った。。。 https://t.co/K9k0roIUuz
— unchama うんちゃま (@tsukkkkkun) 2018年8月12日
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サーバー
(20190609追記)図で表すとこんな感じ。
このような構成にすると、プレイヤー側から大元の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が海外にしかないんです…
(20190711追記)この記事書いた当初はvultrを使っていました。国内リージョンもありますが、ddos protectionは海外リージョンのみで利用可能なオプションです。国内、海外共にスペックの割に安いし回線品質も良さげなのでおすすめしておきます。
vultr使ったことないひとむけですが、以下リンクから登録すると$50のテストクレジットがもらえるっぽいです。(なおかつ30日以上+$25以上使ってもらえると私のところにも$25入って嬉しい) お世辞抜きにvultrは安いわりにスペックと品質が良さげなので是非!!!!!!https://t.co/OaAziJOlrk
— unchama うんちゃま (@tsukkkkkun) 2019年7月11日
上のツイートのリンクは期間限定らしいので、リンク切れてたら以下から登録してやってください(特典はないけど)。心ばかり紹介マージンが入るので、鯖の維持費の足しにします。
ちなみにこの追記を書いている時は何を使っているかというと、vultrの国内リージョンとGCPの国内リージョンを併せ技で使っています。GCPはDDoSからの復旧が早くて優秀なのですが一般人のお財布に全く優しくないので普段は安いvultrを経由させることで費用を圧縮しています。 (追記ここまで)
この対策のポイント
一通りカラクリは説明し終えましたので、最後にこの対策のポイントをまとめておきます。
大元の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の割り振りを国内サーバに限定してプレイの快適性を重視。攻撃時は海外サーバを割り振りリストに自動追加してサービスの継続性を確保。」なーんてことができたりします。
この記事長すぎて書くのが疲れてきたので、詳しく書くのはまた今度にします。
(20190512追記)書きました。↓
[余談]さくらのGSLBだとさくらのvpsのDDoS攻撃によるDOWNをうまく拾ってくれない
最初の頃はなんともなかったのですが、ある時からさくらのvps宛にDDoS攻撃がきた時に、死活監視がうまく機能しなくなってしまいました。
今はすでに改善されているかもしれませんが、これもさくらのクラウドAPIを使うことで暫定対策を組むことができます。
…
…この記事長すぎて書くのが疲れてきたので、詳しく書くのはまた今度にします。
(20190512追記)書きました。↓
おわりに
気がついたら7000文字を超える超大作になっていました。流石に書くのつかれました。校正する気力すら湧きません。誤字脱字ありましたら教えてください。
本当は実際に施してる設定とかも書くべきだったのですが、対策法の概念を伝えるだけでもこの文字数だったので勘弁してやってください。気が向いたら書くことにします。
整地鯖のDDoS対策を記事に書いて欲しいという要望は前々からあったのですが、正直内容が内容だけに、書くのをためらっていたところがありました。書いて公開することはこの世のどこかにいる攻撃者の方に情報を与えてしまうことにもつながるわけで、この記事がきっかけで弱点を突かれてしまうなんてこともあり得るわけですしね。ですが最近になって、折角の自分の努力の成果をアピールしないのはそれはそれでもったいない・機会損失なのではという考えの方が強くなりました。そんな心情の変化もあって、今回公開するに至っていたりします。
対策に困っている方にとって、この方法が少しでも役に立てば…と願っています。
後日談
勢いで書ききった
— unchama うんちゃま (@tsukkkkkun) 2019年2月14日
気がついたら7000文字も書いてた…大学のレポートより多いぞ…
— unchama うんちゃま (@tsukkkkkun) 2019年2月14日
書いておいてこんなこと言うのアレなんですけど、最近色んなマイクラサーバーで流行ってるチャットスパム系のbot attackは僕の書いただけの対策方法ではカバーできません。これはまたおいおい書こうと思います。
— unchama うんちゃま (@tsukkkkkun) 2019年2月14日
あれは俗に言うL7系の攻撃に分類されると理解してます。僕が今回書いたのはL3,L4系の攻撃に対する対策だと思います
— unchama うんちゃま (@tsukkkkkun) 2019年2月14日
おっぱい
— unchama うんちゃま (@tsukkkkkun) 2019年2月14日