マルチゲームサーバの構築を,自宅でする(1/4 Debian サーバのセットアップ)

技術
この記事は約21分で読めます。

この記事は 2024 年 04 月 20 日に Qiita に投稿された記事を元に作成しています.
Qiita 側の更新は停止しています.

  1. Debian サーバのセットアップ (← この記事の内容)
  2. ターミナルと外部接続の設定
  3. ファイアウォールの設定
  4. ゲームサーバの構築

はじめに

身内でマルチプレイのゲームをしていると,

  • ホストやりつつ自分もゲームしていると,PC への負荷が大きくて仕方がない!
  • ↑ 結果,よくハングするので全員に影響してしまう……
  • そもそも自分が居ないとゲームを進められなくなる(これが最悪)

みたいなことになりがちです.

……ので世にはレンタルサーバのサービスが提供されているのですが,筆者はせっかくなら背後に転がっている旧 PC の再雇用先,そしてできる限り出費したくない貧乏性の結果,自宅サーバを建てることにしました.

筆者と同じ環境のゲームサーバを建てるにあたって,

  1. Debian サーバのセットアップ
  2. ターミナルと外部接続の設定
  3. ファイアウォールの設定
  4. ゲームサーバの構築/公開

の順で作業していきます.

timeline
  title マルチゲームサーバ構築手順 概略
  1ページ目 : インストーラ作成
  : 初期設定
  : Debian システム設定
  2ページ目 : RDP 接続
  : SSH 接続
  : FTP 接続
  3ページ目 : ファイアウォール
  4ページ目 : Terraria ゲームサーバの構築
  : Valheim ゲームサーバの構築

注意
この記事で例示しているサーバの構築は,2024 年 1 月頃に開始しました.
最新のバージョンでは,操作方法などが異なる可能性があります.

これは申し訳無いのですが,記事を書く想定で無かったのでスクリーンショットはほぼありません.

また,筆者自身サーバ構築やセキュリティに関しては素人なので,誤りや不適切な記述があるかもしれません.
その際はご指摘いただけると幸いです.

構築するゲームサーバについて
この記事では,単体で稼働する例として Terraria を,SteamCMD を利用した例として Valheim のゲームサーバを構築します.
その他のゲームサーバについても,開放するポートや実行ファイルを調整すれば同様に構築できると思います.
具体的な設定は,各ゲームサーバの公式ドキュメントを参照してください.


前提

記事中に出てくる「2 つの波括弧で囲まれた文字」は,その環境ごとに変わる部分です.

  • {{ホスト名}} : サーバマシンに設定したホスト名
  • {{ユーザ名}} : サーバマシン上で作業する一般ユーザ名(root とは別)
  • {{グローバルIP}} : サーバマシンのグローバル IP アドレス

など…….

適宜,自身の環境での値に置き換えてください.
この意図ではない部分についてのみ,特別に注記します.

また,記事中では以下の用語を特定の意味で使用しています.

  • サーバマシン : 本記事で構築する Debian サーバ のこと
  • クライアント : サーバマシン以外の(内部/外部問わない)PC のこと
  • ゲームサーバ : サーバマシン上で稼働させる「ゲームのサーバ機能」のこと

→ 「サーバマシン上で稼働させている Terraria ゲームサーバにクライアントから接続……」のように使っています

最終形

マルチプレイゲームサーバの構成

ホストするゲームは,例として Terraria としています.
別途ゲーム側のパスワードなどがありますが,ここでは省略しています.

%%{init:{'theme':'dark','themeVariables':{'lineColor':'#576266','textColor':'#EEEEEC'}}}%%
flowchart LR
style Client_Network stroke:#3465A4,stroke-width:2.5px,fill:#EAEFF5,color:#09150A
style Client1 stroke:#09150A,stroke-width:2px,fill:#729FCF
style Server_Network stroke:#CC0000,stroke-width:2.5px,fill:#F9E5E5,color:#09150A
style Router stroke:#09150A,stroke-width:2px,fill:#EF2929
style Client2 stroke:#09150A,stroke-width:2px,fill:#729FCF
style Server stroke:#09150A,stroke-width:2px,fill:#26000B
style Firewall stroke:#09150A,stroke-width:2px,fill:#F57900

subgraph Client_Network[Client Network]
    direction LR
    subgraph Client1["Client (Windows)"]
        direction LR
        WindowsClient1("Terraria (Join via IP)")
    end
end

subgraph Server_Network[Server Network]
    direction LR
    Router(((Router)))
    subgraph Client2["Client (Windows)"]
        direction LR
        WindowsClient2("Terraria (Join via IP)")
    end
    subgraph Server["Server (Debian)"]
        direction LR
        Firewall
        DebianServer("Terraria (Server)")
    end
end

WindowsClient1 -->|"Global IP:Terraria Port"| Router -->|"Private IP:7777"| Firewall
WindowsClient2 -->|"Private IP:7777"| Firewall
Firewall -->|ALLOW|DebianServer
linkStyle 3 stroke:#4E9A06

ファイアウォールの構成

ネットワーク構成は簡略化しています.
詳細なファイアウォールの設定は,後述の「ファイアウォールの設定」で説明します.

%%{init:{'theme':'dark','themeVariables':{'lineColor':'#576266','textColor':'#EEEEEC'}}}%%
flowchart TB
style Anywhere_Network stroke:#75507B,stroke-width:2.5px,fill:#EEE5ED,color:#09150A
style Client1 stroke:#09150A,stroke-width:2px,fill:#AD7FA8
style Client2 stroke:#09150A,stroke-width:2px,fill:#AD7FA8
style Server_Network stroke:#CC0000,stroke-width:2.5px,fill:#F9E5E5,color:#09150A
style Client3 stroke:#09150A,stroke-width:2px,fill:#729FCF
style Server stroke:#09150A,stroke-width:2px,fill:#26000B
style Firewall stroke:#09150A,stroke-width:2px,fill:#F57900

subgraph Anywhere_Network[Anywhere Network]
    direction LR
    subgraph Client1["Client (Anywhere)"]
        direction LR
        SSH_Connect1("SSH Connect")
        RSA_Key1("RSA Key (Registered)")
    end
    subgraph Client2["Client (Anywhere)"]
        direction LR
        SSH_Connect2("SSH Connect")
    end
end

subgraph Server_Network[Server Network]
    direction LR
    subgraph Client3["Client (Known)"]
        direction LR
        SSH_Connect3("SSH Connect")
        RSA_Key3("RSA Key (Registered)")
    end
    subgraph Server["Server (Debian)"]
        direction LR
        subgraph Firewall
            direction LR
            Firewall_RDP>"RDP Rule"]
            Firewall_SSH>"SSH Rule"]
            Firewall_FTP>"FTP Rule"]
            Firewall_Other>"..."]
        end
    end
end

SSH_Connect1 -->RSA_Key1 -->|"SSH Port"| Firewall_SSH -->|LIMIT|SSH_Connect1
linkStyle 2 stroke:#C4A000
SSH_Connect2 -->|"SSH Port"| Firewall_SSH -->|DENY|SSH_Connect2
linkStyle 4 stroke:#CC0000
SSH_Connect3 -->RSA_Key3 -->|"SSH Port"| Firewall_SSH -->|ALLOW|SSH_Connect3
linkStyle 7 stroke:#4E9A06

以降が,Debian サーバのセットアップになります.

インストーラ作成

ハードウェアに関係する制約があるので注意してください.

筆者環境

  • CPU : AMD Ryzen 7 3700X(amd64)

また,インストーラ作成に使用する PC は Windows を前提としています.

インストーラのダウンロード

下記 Debian の公式サイトから {{アーキテクチャ}}/iso-cd/ にある netinst イメージをダウンロードします.
{{アーキテクチャ}} は,サーバマシンが使用する CPU に合わせて選択してください(インストーラ作成に使用する PC の CPU とは関係ありません).

Index of /debian-cd/current

注意
筆者の環境では,debian-12.4.0-amd64-netinst.iso を使用しています.
他のアーキテクチャの場合(例えば Intel の場合 i386)は,それに合わせてください.

インストール USB の作成

インストーラ用に,USB メモリを用意します.2GB 程度の容量があれば十分です.
事前に USB メモリは FAT32 でフォーマットして,ドライブとして認識されていることを確認してください.

インストーラを USB メモリに書き込むために,Rufus を使用します.

Rufus - The Official Website (Download, New Releases)
Rufus is a small application that creates bootable USB drives, which can then be used to install or run Microsoft Window...

注意
USB メモリに書き込むと,USB メモリ内のデータは全て消去されます.

Rufus を起動し,下記の設定を行います.

  • デバイス : インストールする USB メモリを選択
  • ブートの種類 : ダウンロードした netinst イメージを選択
  • パーティション構成 : MRB
  • ターゲット システム : BIOS or UEFI
  • ファイル システム : FAT32
  • クラスターサイズ : 4096 bytes

他の設定はデフォルトのままで問題ありません.
[スタート]ボタンをクリックすると,USB メモリにインストーラが書き込まれます.

インストーラの起動

USB メモリをサーバマシンに挿入し,BIOS または UEFI(以降はまとめて BIOS と呼びます)から USB メモリをブートデバイスとして選択します.

マザーボードのメーカによって設定方法は異なりますが,一般的には起動時の企業ロゴ表示時に[F2]や[F12]キーを押すことで BIOS の設定画面に入ることができます.
Boot 設定画面で Boot デバイスを「UEFI: {{USB メモリ名}}」などで上書きします.
その後,上書きしたデバイスを選択して起動します.

インストール作業

インストーラが起動すると,Debian のインストール画面が表示されます.
ここでは「Grafical install」を選択して進めます.

画面が乱れる場合
全体的に斜線が入ったような画面になる場合がありますが,おそらくダウンロードしたインストーラの問題です.
アーキテクチャが CPU に合っているか,または正しいインストーラをダウンロードしているか確認してください.

設定項目は環境によって異なりますが,だいたい下記のような設定を行います.

  • 言語,場所,キーボード : 日本(日本語)
  • ホスト名 : {{ホスト名}}
  • ドメイン名 : 空欄(もしくは任意のドメイン名)
  • root のパスワード : {{root パスワード}}
  • ユーザー名 : {{ユーザ名}} ※ 一般ユーザ
  • {{ユーザ名}} のパスワード : {{パスワード}}
  • ディスクのパーティション : ガイド - ディスク全体を使い、LVM をセットアップする
  • ネットワークミラー : 日本 - ftp.jp.debian.org
  • ソフトウェアの選択
    • Debian デスクトップ環境
    • GNOME
    • Web サーバー ※ 任意
    • SSH サーバー
    • 標準システムユーティリティ

インストールが完了すると,再起動を促されます.
USB メモリを取り外し,再起動します.

インストールの確認

再起動後,GNOME のログイン画面が表示されることを確認します.
{{ユーザ名}}{{パスワード}} を入力してログインします.
とりあえず,デスクトップが表示されればインストールは成功です.

初期設定

ユーザを sudo グループに追加

今後の作業で root 権限が必要になるので,{{ユーザ名}} を sudo グループに追加します.

$ su -
# usermod -aG sudo {{ユーザ名}}
# cat /etc/group | grep {{ユーザ名}}
sudo:x:27:{{ユーザ名}}
{{ユーザ名}}:x:1000:

一度ログアウトして,{{ユーザ名}} でログインし直してください.

パッケージの更新

何はともあれ,パッケージを最新にしておきます.

$ sudo apt update
$ sudo apt upgrade

Debian システム設定

GNOME のアプリケーションメニューから 設定 を選択し,それぞれのタブで設定を行います.
設定している値はあくまで推奨値であり,環境によっては異なる場合があります.
明記していない項目は,デフォルトのまま,または任意の設定で問題ありません.

ネットワーク

  • 有線(歯車アイコン)
    • Identity
    • 名前 : {{ホスト名}}
    • IPv4
    • IPv4 メソッド : 手動
    • アドレス : {{Private IPv4}} / 255.255.255.0 / {{Router IPv4}}
    • DNS : 8.8.8.8, 8.8.4.4
    • IPv6
    • IPv6 メソッド : 自動
    • DNS : 2001:4860:4860::8888, 2001:4860:4860::8844

ネットワーク構成について
筆者は普段遣いの PC 達と同じネットワークにサーバを設置しています.

ネットワーク自体は「v6 プラス」を使用していますが,今回のサーバ設定では,基本的に IPv6 は使用しません.
ただし,「v6 プラス」環境下では今後設定する「ポート変換」で使用可能なポート数に制限があります.

(任意)アプリケーション

GNOME インストール時にインストールされた不要なアプリケーションを削除します.

筆者は最終的に,以下のアプリケーションのみを残しました.

  • Google Chrome
  • 端末
  • ファイル
  • 設定
  • システムモニター
  • ディスク
  • ディスク使用量アナライザー
  • 高度なネットワーク設定
  • パスワードと鍵
  • ログ
  • ソフトウェア
  • Synaptic パッケージマネージャ
  • Software & Updates
  • Mozc の設定
  • 入力メソッド
  • 拡張機能
  • ヘルプ

Synaptic パッケージマネージャ

GNOME デスクトップ上でアンインストールできないパッケージは,apt で管理されたパッケージです.

GUI ベースでは,Synaptic パッケージマネージャ を使用してアンインストールします.

  • anthy : 完全削除指定
  • anthy-common : 完全削除指定
  • firefox-esr : 完全削除指定 ※ 後述の Google Chrome をインストールする場合
  • libreoffice-common : 完全削除指定
  • transmission-common : 完全削除指定

CLI ベースでは,apt コマンドを使用してアンインストールします.

$ sudo apt purge {{パッケージ名}}
$ sudo apt autopurge -y
$ sudo apt autoclean -y

これ以降のパッケージ管理は,基本的に apt コマンドで表記します.

プライバシー

  • 画面
    • ブランクスクリーンの遅延 : しない
    • 自動画面ロック : オフ
    • ロック画面の通知 : オフ
  • ファイルの履歴と削除
    • 一時ファイルを自動的に削除する : オン
    • 自動的に削除する期間 : 7 日 ※ 任意

(任意)オンラインアカウント

必要なアカウントを追加します.
Google ドライブを同期する設定は後述の Rclone で行います.

共有

  • ファイル共有 : アクティブ ※ 任意
    • パスワードを要求する : オン
    • ネットワーク : {{ホスト名}}
  • リモートデスクトップ : オン
    • リモートコントロール : オン
  • メディア共有 : オン ※ 任意
    • フォルダー
    • ビデオ
    • 音楽
    • 画像
    • ネットワーク : {{ホスト名}}
  • リモートログイン : オン

電源

  • 電源モード ※ 任意
    • バランス
  • 省電力オプション
    • 画面のブランク : しない
    • 自動サスペンド : オフ
  • 電源ボタンの挙動 : なにもしない

キーボード

  • 入力ソース
    • 日本語(Mozc)

ユーザー

  • 自動ログイン : オン

(任意)アプリケーションのインストール

以降,必須では無いアプリケーションのインストールを行います.

Google Chrome をインストール

個人的に Firefox よりも Google Chrome の方が好きなので,インストールします.
システムが認識している apt のリポジトリ Google のリポジトリを追加します.

$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
$ sudo apt install ./google-chrome-stable_current_amd64.deb

インストールが完了したら,パッケージを更新します.
wget でダウンロードした .deb は不要なので削除します.

$ sudo apt update
$ sudo apt upgrade

$ rm -rf ./google-chrome-stable_current_amd64.deb

GNOME のアプリケーションメニューから Google Chrome が起動できることを確認してください.
ターミナルから起動する場合は,google-chrome と入力します.

注意
Google Chrome で初期ログインすると,Google アカウントのパスワードがキーリングに保存されます.
必ず下記の キーリングの初期化 を実行してください.

キーリングの初期化

  1. パスワードと鍵 を起動
  2. 「ログイン」フォルダを選択して[削除]をクリック
  3. 「項目が全て抹消されることを理解します。」にチェックを入れ,[削除]をクリック
  4. Chrome を起動し「新しいキーリングのパスワード指定」と表示されたら,パスワードは入力せずに[続行]をクリック
  5. 「暗号化していないパスワードを保存しますか?」と表示されたら,[続行]をクリック

Myrica M をインストール

日本語等幅フォントの Myrica M をインストールします.

プログラミングフォント Myrica
プログラミング用フォント Myrica Myrica (ミリカ)は、フリーなプログラミング用 TrueType フォントです。 視認性、判別性 が高くなるように、複数のフォントファイルを元に合成/修正しました。 フォントの特徴 多くの特徴を

Myrica.zipMyricaM.zip/home/{{ユーザ名}}/ダウンロード にダウンロードして,下記の手順でインストールします.

$ cd ~/ダウンロード
$ unzip Myrica.zip
$ unzip MyricaM.zip
$ sudo mkdir -p /usr/share/fonts/truetype/myrica
$ sudo mv Myrica*.TTC /usr/share/fonts/truetype/myrica
$ sudo fc-cache -fv

ダウンロードしたファイルや展開したあとのディレクトリは不要なので削除します.

$ rm -rf Myrica.zip MyricaM.zip
$ rm -rf Myrica MyricaM

Rclone をインストール

Google ドライブを同期するためのツール Rclone をインストールします.

Rclone
Rclone syncs your files to cloud storage: Google Drive, S3, Swift, Dropbox, Google Cloud Storage, Azure, Box and many mo...

aptrclone をインストールします.

$ sudo apt install -y rclone

rclone を初期設定します.
途中,Google Drive にアクセスするための認証情報を入力する必要があります.

リモート名の設定
{{リモート名}} は任意の名前を設定可能ですが,ここでは gdrive とします.
設定したリモート名は,後に同期用のシェルスクリプトで使用するものと統一してください.

$ rclone config
No remotes found, make a new one?
n/s/q> n

Enter name for new remote.
name> gdrive # {{リモート名}}

Option Strage.
Storage> drive

Option client_id.
client_id>

Option client_secret.
client_secret>

Option scope.
scope> drive

Option service_account_file.
service_account_file>

Edit advanced config?
y/n> n

Use web browser to automatically authenticate rclone with remote?
y/n> y

Configure this as a Shared Drive (Team Drive)?
y/n> n

Keep this configuration?
y/n> y

gdrive を同期するディレクトリを作成します.
筆者は Google Drive の「マイドライブ」にある「Debian」というディレクトリを同期するため,サーバマシン側にも同じ階層構造を作成しています.
「マイドライブ」のフォルダを全て同期する場合は,サブディレクトリを作成する必要はありません.

GoogleDrive

$ mkdir -p ~/GoogleDrive/Debian

ホームに bin ディレクトリを作成し,rclone 双方向同期用のシェルスクリプトを作成します.

$ mkdir -p ~/bin
$ vi ~/bin/sync-gdrive.sh

シェルスクリプトの内容は,下記のようになります.

  • rclone bisync : 双方向同期
    • --resync : 同期時にファイルのハッシュ値を比較して同期する
    • --progress : 同期の進捗を表示
    • --log-file : ログファイルを指定
  • gdrive:/Debian : Google Drive の同期対象ディレクトリ
    ※ 「マイドライブ」のフォルダを全て同期する場合は,{{リモート名}}:/ とします
  • ~/GoogleDrive/Debian : サーバマシン側の同期ディレクトリ
  • ~/GoogleDrive/rclone.log : ログファイル
#!/bin/bash

# Sync Google Drive to Local folder
rclone bisync gdrive:/Debian ~/GoogleDrive/Debian --resync --progress --log-file ~/GoogleDrive/rclone.log

シェルスクリプトに実行権限を付与します.

$ chmod 744 ~/bin/sync-gdrive.sh

ここまでで,Google Drive とサーバマシンの同期設定が完了しました.
正常に同期できるか確認するために,Google Drive の同期対象ディレクトリに何らかの変更を加えて,シェルスクリプトを実行してください.

$ ~/bin/sync-gdrive.sh

cron で定期実行

サーバマシンの cron で,同期を定期実行するための設定を行います.
例では,30 分毎に同期を行う設定を行います.

$ crontab -e
# m h  dom mon dow   command
*/30 * * * * /home/{{ユーザ名}}/bin/sync-gdrive.sh

cron を再起動して,設定を反映します.

$ sudo systemctl restart cron

指定した時間に同期が行われることを確認してください.


以上で,Debian サーバのセットアップが完了しました.
次回はターミナルと外部接続の設定を行います.

コメント