自宅サーバは良いぞ

この記事はnoteからの移行記事です。

これは, TUT Advent Calendar 2022 14日目の記事です.
昨日の記事はsh00t(.er)さんの「レイマーチングことはじめ」でした.

はじめに

はじめまして. 今年, 豊橋技術科学大学(Toyohashi University of Technology; TUT) に入学した, B1の DDlia です. よろしくお願いします.

まずは, 簡単に自己紹介をさせていただきます.

  • 名前: DDlia
  • 所属: 情報・知能工学系(3系)
  • 出身: 北海道札幌市
  • サークル: コンピュータクラブ(TUT-CC), 総合文化部音楽技術部門(TechnoTUT)

北海道には4つの高専(旭川, 函館, 苫小牧, 釧路)があるので技科大には北海道から来ている人はそこそこ多いんですが, B1やB2だとレアだと思います(B1, B2は愛知県/静岡県出身の人が多い). 今年のB1は北海道出身は2人らしいです.

で, 今回は私が今年の3月から運用を始めた自宅サーバ関連について記事にしようと思います. ちなみに, 大学内でこの自宅サーバが噂になってるらしいです. 初対面の先輩に「自宅でサーバやってる人」と言うと, 大体「あ~あの噂の」と返ってきます.

自宅サーバのいいところ

どうして自宅サーバとかいう面倒くさいことをしてるんだ, AWSやGCPなどのクラウドを使えばいいじゃないかと思われると思います.しかし, 実際に自宅サーバを運用しているのはそこにいくつか利点があるからです.

1つ目は料金面です. AWSやGCPでは計算時間やネットワーク転送量に応じて, 従量課金がされます. 私は学生でかつ, アルバイトもしていないので資金面に余裕がありません. 従量課金という不確定な出費は怖いわけです. また, クラウド破産という言葉を聞いたことがあるかもしれません. このような従量課金のサービスを使っていて, DDoS攻撃などを受けたり, 設定ミスで仮想マシンが動きっぱなしになったりすると, 計算時間やネットワーク転送量が跳ね上がり高額の利用料を請求されます.
2つ目は技術的なノウハウを蓄積できることです. AWSやGCPなどのクラウドサービスでは, 管理画面でポチポチクリックするだけで仮想マシンを作成できますが, 自宅サーバではそうもいきません. サーバだけでなくネットワーク周りも全て自力で構築する必要があります. これらの作業はクラウドサービスでの仮想マシンの作成と比較すると大変ですが, サーバやネットワークに関する知識を得ることができます.
3つ目は単純にロマンです. L2スイッチのランプの点滅とかいいですよね. ずっと眺めていられます.

きっかけ

実は受験生時代に間近でMinecraftサーバの運用をしているところを見る機会がありまして, 受験が終わったら自宅サーバをやってみたいな~と思っていました.

そこで、合格発表前(良い子はちゃんと中期日程, 後期日程に向けてお勉強しましょう!)に2台のデスクトップPCを購入しました. 有識者(@ddPn08さんや@launchpencilさん, いつもお世話になっています, ありがとうございます) にいろいろお聞きしながらDebianをインストールし, Minecraftサーバの運用を開始しました.
ネットワークに関しては, 勢いで2021年の秋くらいにNECのIX2105というVPNルータを購入しまして, NECの公式マニュアルを見ながらポチポチ触ってました. 良くないね, 受験生はちゃんと勉強しましょう.

まあこんな経緯がありまして, サーバと一緒に札幌から豊橋へ引っ越し, 自宅サーバを運用していくことになったわけです.

構成

構成 構成は図の通りです. 札幌に1台, 豊橋に5台のサーバを設置しています. 豊橋にある5台のうちの4台は, Proxmox VEというものをつかってクラスタリングしています. また, 豊橋のルータはOracle Cloud Infrastructure(OCI)と拠点間VPN接続を行なっており、自宅サーバとクラウドVMを簡単に接続することができます.

最近になって, 札幌に置いてあるサーバと疎通が取れなくなりました. 電源を引き抜かれたか, 故障な感じがあります. 年末の帰省で障害対応ですね……

ちなみに, 毎晩このサーバたちと添い寝[*3]して暮らしています. 8日目に も さんの「豊橋技科大宿舎限界突破マニュアル」という記事がありましたが, 私の部屋は一体どのレベルに当てはまるんですかね? 気になって夜しか眠れません.

サーバ

仮想化

Proxmox VEというものをつかってクラスタリングしている, と書きましたが少しここらへんについて説明します.

Proxmox VEというのはDebianをベースにした仮想化プラットフォームのことです. そもそも仮想化とはなんぞや, となるわけですが簡単に言うとパソコンの中で仮想的なパソコンを動かす技術のことです. 一見すると大変面倒くさいことをやっているように思えますが, これはちゃんとした利点があります.

まずは計算資源をちゃんと分配できることが挙げられます. 例えば, メモリ容量をあればあるだけ食べるソフトウェアがあって, これをメモリ容量が16GBのコンピュータで動かすとしましょう. これを仮想化せずに動かすと, このソフトウェアがメモリを16GBすべて食べてしまって他のソフトウェアは満足に動くことはできなくなります. ここで仮想化技術が役に立ちます. このコンピュータの中にメモリ容量が4GBの仮想的なコンピュータを作ってあげると, このソフトウェアは最大でも4GBのメモリしか食べません. そうすると, 残りの12GBのメモリで他のソフトウェアを動かすことができます. また, サーバ台数を少なくすることもできます. 1台のサーバにたくさんの仮想的なサーバを詰め込めるので大量のパソコンを並べる必要がなくなります. あとは, ライブマイグレーション機能が挙げられます. これは非常に凄い機能で, コンピュータの中で動いているVM(仮想マシン)を停止せずに他のコンピュータに移動させることができます. 例えば, 一時的に1台のコンピュータを停止してメンテナンスを行いたいがサービスは停止させたくない, といった場合に役に立ちます.
ライブマイグレーション

仮想化アプライアンスとしては, VMware ESXiやHyper-Vが有名ですが, Proxmox VEは無料で様々な機能が使える上, VMとLXCというLinuxコンテナをWeb UIを通して簡単に扱うことができます.

サーバ仮想化の恩恵として, 気になるソフトウェアや技術を気軽にサクッと試すことができるという点が挙げられます. なにかやりたいことが出てきたらサクッと仮想マシンなりコンテナなりを立てていろいろ弄ることができます. 他の重要なソフトウェアが動いている環境とは完全に隔離されていますので, 仮にやらかしても問題ありません. 気に入らなかったり, 上手くいかなければ消し去ることもできます. これは検証環境として非常に優秀です.
Proxmoxの管理画面

これが管理画面です. 扱いやすそうでしょ. (Kubernetesをやろうとしたときの残骸がいますね…いつかやります…)

ちなみに, この管理画面へのログインは外部のアカウントでログインすることもできます. 実際に私の環境ではAzureADのアカウントでログインできます. ワンクリックでログインできてとっても便利.

ラックマウントサーバ

薄くて広くてうるさいと話題のラックマウントサーバですが, 豊橋に5台あるサーバのうちの2台はそれです.
NEC Express5800
HITACHI HA8000
生まれて初めてモノホンのサーバを触ったんですが, 民生用とは全然違います. CPUがIntel Xeonという, 民生用のIntel Coreシリーズとは別系統のシリーズが載っていたり, メモリもECCメモリというエラー訂正が可能なものが載っていたりします. メモリスロットもいっぱいあるのでいっぱい挿せます! ストレージ周りもハードウェアRAIDといって一般的な民生用のRAID[*5]とは違ったガチガチのが使えます.! その代わり音も凄いんですけど. また, 面白い機能があって, こういうエンタープライズなサーバーにはBMC (Baseboard Management Controller)というICチップが載っています. これはコンピュータ自体とは別に,完全に独立して動作するもので遠隔から電源のON/OFFをしたり, BIOSを変更したりすることができます.

Minecraft

「きっかけ」でMinecraftサーバの運用を開始した, と言いましたがこれは今でも動いていて遊べる状態になっています. Java版でも, BE版(スマホやタブレット, ゲーム機など)でも, 遊ぶことができます. 詳しくはこちらをご覧ください. 興味があれば, ぜひぜひ弊Minecraftサーバに参加してください! ここでは, 私が構築しているMinecraft関連のサービスについて紹介します.
Minecraft
図の通り, サーバ自体はOracle Cloudと自宅にあって, プロキシとロビーサーバがOracle Cloudに, メインサーバと検証サーバが自宅にあります. OSはOracle CloudではOracle Linux, 自宅ではRocky Linuxを採用しています. なんか気づいたらRHEL系ばっかりになってました.

プロキシサーバでは, 配下にあるロビーサーバ, メインサーバ, 検証サーバへの接続を管理しています. /serverコマンドや, ワールド内に設置されたゲートをくぐることにより, 接続先のサーバを切り替えることができます. Minecraft用のプロキシとしては, BungeecordやWaterfallが有名ですが, 弊環境ではVelocityというものを使っています. BungeecordやWaterfallは割と古くからあるMinecraft用のプロキシですが, Velocityは割りと新しめなものになります. BungeecordやWaterfallよりも高速に動作するらしいですよ. しらんけど(実感できるほど同時接続数が多くない).

一応検証サーバというものも用意していまして, これはメインサーバに将来実装したい機能などのテストに使うものです. Minecraftサーバではプラグインという外部のプログラムを仕込むことで, 本来のMinecraftにはない機能を追加することができるのですが, これをいきなりメインサーバに反映することは非常にリスキーです. 最悪ワールドデータが壊れることがあります. そこで, 検証サーバで予めテストを行うことで, メインサーバ反映時のリスクを小さくします. また, Minecraftは定期的に新たなバージョンがリリースされますが, メインサーバのバージョンをいきなりアップデートすることもリスクが伴います. ですから, 検証サーバで動作を確認してから, メインサーバに反映するという手順を取ります.

クロスプレイ

MinecraftにはJava版とBE(Bedrock Edition)版の2種類がありますが, この2つには互換性がなく同じサーバで遊ぶことはできません. しかし, Geyserというプロキシソフトウェアを使うとBE版でJava版のMinecraftサーバに入ることができます. Java版とBE版でユーザ認証方式も異なるのですが, ここでもfloodgateというBE版のローカルの認証サーバを立てることでBE版の認証方式の違いの問題を解決することができます.

ネットワーク

上の図に書いてありますが、NECのIX2215というルータを使っています. これは, 業務用のVPNルータで基本的にコマンドラインで設定する必要があるのですが, 民生用機器ではできないような非常に高度なことができます.

transixとPPPoE

技科大宿舎ではNTTメディアサプライが提供する, DoCANVASというインターネット接続サービスが使えます. 基本的には, transixというIPv4 over IPv6の一種のDS-Lite(任天堂ではない)による接続方式が使えます. transixでは, キャリアグレードNAT (CGN) と言って, プロバイダ側の設備でネットワークアドレス変換を行い1つのグローバルIPアドレスを複数人で共有するためポート開放を行う事ができません. ポート開放を行なうことができないと, インターネット側から自宅のサーバーへ通信することができません.

そこで, グローバルIPオプションというものを契約してPPPoE接続による動的/固定グローバルIPを取得するか, ngrokやCloudflaredといったトンネリングツールを利用すると, インターネット側から通信できるようになります.

ただ, まだ問題がありまして, DoCANVASではPPPoE接続をするとtransixでの接続に比べて非常に通信速度が遅いという問題があります. 入居当初にPPPoE接続のみを試してみましたが20~30Mbps程でした. これはtransixでの接続(100Mbps~300Mbps, 速いとき)と比較して非常に低速です.

そこで、弊宅では普段の通信はtransixの方に流しつつ、NEC IXのポリシーベースルーティング機能によりサーバのポート開放を要する通信のみPPPoEの方に流すことで, ポート開放をしつつ快適なインターネット接続環境を実現しています.

フレッツ網内IPv6折り返し通信の話

DoCANVASはフレッツ光を引き込んでいるので, NTT西日本のNGN網を利用できます. NTTのNGN網と聞いたらフレッツ網内IPv6折り返し通信をしたくなりますよね. 特にMinecraftサーバにフレッツ網内IPv6折り返し通信で入ることができれば, 高速・低遅延で遊ぶことができるようになる… と思われましたが, 残念ながらDoCANVASの上流のルータによってパケットフィルタがかかっているらしくできないようです. 残念.

Cloudflareの話

宅外から自宅のサーバを触るにあたって, Cloudflare Zero Trustというサービスを利用しています. これは非常に便利なサービスで, ドメインを持っていてかつネームサーバーをCloudflareにさえ向けていれば, 適当な仮想マシンなりコンテナなりWindowsのコンピュータなりにCloudflaredをインストールしてログインするとポート開放せずにいろいろなサービスを公開できちゃいます. Minecraftのマップもこのサービスを利用して公開しています. さらに, 簡単にGitHubやAzureAD, Google Workspace等による認証機能をつけたりとかもできます. さらに, Cloudflare WARPと併用をすると自宅ネットワークへのVPN接続的なこともできます. いずれもCloudflareがプロキシとして動くのでDDoS対策もできちゃいます.

Cloudflareといえば, Zero Trust以外に他にもいろいろな便利なサービスがあります. 世界最速のDNSサーバとか, Cloudflare Pagesとかは有名ですね. 私の所属する総合文化部 音楽技術部門 (通称テクノ部)でもCloudflare PagesとGitHubを使ってホームページを作成しています.

Oracle Cloud InfrastructureとのVPN接続

「構成」にある通り, Oracle Cloudにも仮想マシンがあるわけですが, クラウドVMと自宅サーバー間の通信をどうしようかという話になってきます. 特に私はMinecraftサーバを運営していまして, プロキシサーバはOracle Cloudに, ゲームサーバは宅内にあります. そこで, Oracle Cloudと自宅ネットワークを拠点間VPN接続して, プロキシサーバとゲームサーバを接続しています. 最初はクラウドVMと自宅のVMにSoftEther VPNというVPNソフトウェアをインストールして, 拠点間接続しようとしましたが, セグメント超え周りで躓いた(仮想L3スイッチの設定が上手くいかなかった)ため, Oracle CloudのDRG(動的ルーティングゲートウェイ)とVPN接続する方向にしました. 設定方法に関して, ちょうどNECの公式設定例があったのでそれを参考に設定しました. Oracle CloudのVMから自宅のVMに向けてPingを実行してみたら上手く行ったぽいのでヨシ!

スイッチ(任天堂ではない)の話

豊橋のすべてのサーバーはL2スイッチである Allied Telesis AT-x210-24GTに接続されています. 最近リンクアグリゲーションとかの設定を投入して, 最新ファームウェアにアップデートし (TFTPサーバを立てるのを面倒くさがっていた), VLAN(virtual lan)[*10]をしっかり切りました. もちろんIX2215もx210もCatalyst 2960も業務用なのでVLANを扱えるんですが, これまではポートベースVLANのみしか触れてきませんでした. ポートベースVLANというのは, 簡単に言うと1台のスイッチを仮想的に複数台のスイッチに分割することができる機能のことです. VLANにもいろいろ種類があって, ポートベースVLAN以外にタグVLANというものがあります. タグVLANはスイッチ同士の接続に使います. ポートベースVLANのみでスイッチ同士を接続しようとすると,VLANの個数分LANケーブル/光ファイバを接続しなければなりませんが, タグVLANを使うとポートベースVLANを切った複数のスイッチを一本のLANケーブル/光ファイバで接続することができます[*8]. 先述のProxmox VEでもタグVLANを扱うことができて, VLANタグを入力するだけで所属先のVLANを変更することができます.

今更感がありますが, 業務用ネットワーク機器は民生品のようにブラウザで設定画面を開いて設定するといったことは基本的にできません. できるものもありますが, 高度なことをしようとするとコンソールケーブル / Telnet / SSHなりでコマンドラインから設定を行う必要があります. 「きっかけ」でお話した通り, 私はNEC IXルータから業務用ネットワーク機器を触り始めたので, NEC IXのコマンド体系に慣れていました. スイッチの設定時にCisco/Alliedを触りましたが, NEC IXとコマンド体系が似ているとはいえ, モードの概念が少し違って戸惑いました. CiscoとAllied Telesisはほぼ同じように思います(ちょろっと触った程度ですが).

おうちにいっぱいIXルータがありますので触ってみたいな~って方はひと声かけていただければ在庫のある限りお貸しします.

NEC IXルータ

おわりに

9ヶ月ほど自宅サーバを運用してきたことによってLinuxに関する知識やコンピュータに関する新たな知見を得られたように思います. 今後は6月頃に挫折したKubernetesやBGPに関してなど, より新たな知らない分野にも手を出していきたいと考えています. ただやっぱりプログラミングはできるようになりたいですね. 今のところ授業でのC言語にしか触っていないわけですが. 最近テクノ部の方の部室にXDJ-XZという新たな機材が導入されまして, PRO DJ LINKという面白い機能がついています. ネットワーク越しにXDJ-XZから曲のBPMや波形など, いろいろな情報を読み出すことができるというすごいやつ(適当)です. これを使って何か面白いことをしてみたいですね.
XDJ-XZ

明日の記事は, 五煎目の紅茶さんの「三重県桑名市から技科大まで愛知横断通学してみた」です.

Built with Hugo
テーマ StackJimmy によって設計されています。