この投稿について
初めまして。
マルチゲームサーバー 「Nekoniwa-Network」を運営している者です。
今回、サークルの先輩や同期、非常勤の先生など...etc
たくさんの人のお世話になりながら、自鯖を攻撃から守るフロントインフラを構築しました。
これが本当に大変だった。
初めての投稿では、フロントインフラに何を構築したのかを紹介していこうと思う。
なぜTailScaleの後ろに置き始めたのか
まずはこちらを見ていただこう。
時は2023年5月、午後10時頃の出来事である。
サーバー利用者からこんな連絡が来た。
「サーバーからキックされて繋がらないです...」
その頃はよくサーバー機器に不具合が起きていたので、またサーバーの不具合だろうと思ってブラウザを立ち上げた瞬間、これがサーバーの不具合ではないことが分かった。
ネットにつながらないのである。
断続的に接続が復旧したり切れたり...これはただ事ではないなと思いルーターのFireWallを確認した時の写真がこれだ。
この写真からだとわかりにくいが、複数のIPアドレスからすさまじい数のパケットが飛んできていた。
これが私の初めてのDDos攻撃経験だ。
どうしようもなく、ほとぼりが冷めるのを待つしかなかった。
後日の出来事である。
突然一通の電話が来た。
某P社「プロバイダ会社です。先日すさまじい数のパケットがお宅に集中して、地区の1/3程度のリソースを占めてたんだけど心当たりありますか?」
私「あぁ...攻撃されてた時の話ですかね...」
某P社「たぶんそれです。さて、単刀直入にもうサーバーを起動しないでいただきたい。次同じことが起きたらお宅の回線を停止しますからね。」
私「ワァ...」
と、もう少しちゃんとしたやり取りはあったが、プロバイダーからお叱りを受けてしまった。
何かしら対策をしてもう一度サーバーを起動したい!!と考えていたが、1年はおとなしくサーバーを停止して過ごすことにした。
2024年4月、講義や独学で学んだ内容を使えば、自宅グローバルIPを公開せずパケットもフロントサーバでさばけるのでは...?と思いたったはすぐ行動。
このqiitaの内容につながってくる。
内容
前置きが長くなったが、今回やったことを説明しよう。
以上が現在のネットワーク構成図である。
(あまり書いたことないので汚くて申し訳ないです...)
簡単に流れを説明する。
1. 接続してくるプレイヤーはさくらのVPSに接続する
2. 特定のPort宛に接続してきたプレイヤーのIPをDNATでさくらのTaleScale IPに流す
3. SNATを使ってカプセル化したグローバルIPをRustサーバのTailScale IP宛に流す
4. RustサーバはTailScaleから来たパケットをPortごとに処理して返答する
これが一連の流れになる。
当初はリバースプロキシを組んですべてをさくらのTailscale IPで処理しようとしていた。
けれど、Rust(EAC)は同じパケットからの接続について解決できるのは1つ迄という制約があるらしい。
ので、SNATで個々のグローバルIPを流してやることで解決した。(この仕様に半日苦しめられた)
こうしたことにより、攻撃を受けた際の受け皿がさくらのVPSとなる。
また、受け渡しはTailScaleを介すので自宅グローバルIPが外に出ていくことはない。
あぁ、なんと素敵なのだろう。
行った設定も簡単で、TailScaleに接続してIPフォワードのルールを組んでUFWルールを設定して...完成!という簡単なものなので、
「DDosが怖い・グローバルIPをSteam(FP)に教えたくない」
という方々はぜひ試してほしい。
また、この構成は自宅がIPoE回線の皆様もサーバーを建てることが出来るやり方なので、Port開放が出来なくて困ってる人も一度試してみてほしい。
さくらのVPSも月額900円程度なので、VTuberにサブスクするよりお手軽にサーバーを作ることが可能だろう。
詳しいやり方や手順については、作ってほしいという声があれば備忘録的に残そうと思う。
スペシャルサンクス: 某仮想化の鉄人先生, konkichiさん, nikkiさん
参考: