Qiita 側の更新は停止しています.
- Debian サーバのセットアップ (← この記事の内容)
- ターミナルと外部接続の設定
- ファイアウォールの設定
- ゲームサーバの構築
はじめに
身内でマルチプレイのゲームをしていると,
- ホストやりつつ自分もゲームしていると,PC への負荷が大きくて仕方がない!
- ↑ 結果,よくハングするので全員に影響してしまう……
- そもそも自分が居ないとゲームを進められなくなる(これが最悪)
みたいなことになりがちです.
……ので世にはレンタルサーバのサービスが提供されているのですが,筆者はせっかくなら背後に転がっている旧 PC の再雇用先,そしてできる限り出費したくない貧乏性の結果,自宅サーバを建てることにしました.
筆者と同じ環境のゲームサーバを建てるにあたって,
- Debian サーバのセットアップ
- ターミナルと外部接続の設定
- ファイアウォールの設定
- ゲームサーバの構築/公開
の順で作業していきます.
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 とは関係ありません).
筆者の環境では,
debian-12.4.0-amd64-netinst.iso
を使用しています.他のアーキテクチャの場合(例えば Intel の場合
i386
)は,それに合わせてください.インストール USB の作成
インストーラ用に,USB メモリを用意します.2GB 程度の容量があれば十分です.
事前に USB メモリは FAT32 でフォーマットして,ドライブとして認識されていることを確認してください.
インストーラを USB メモリに書き込むために,Rufus を使用します.
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
と入力します.
キーリングの初期化
- パスワードと鍵 を起動
- 「ログイン」フォルダを選択して[削除]をクリック
- 「項目が全て抹消されることを理解します。」にチェックを入れ,[削除]をクリック
- Chrome を起動し「新しいキーリングのパスワード指定」と表示されたら,パスワードは入力せずに[続行]をクリック
- 「暗号化していないパスワードを保存しますか?」と表示されたら,[続行]をクリック
Myrica M をインストール
日本語等幅フォントの Myrica M をインストールします.
Myrica.zip
,MyricaM.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 をインストールします.
apt
で rclone
をインストールします.
$ 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」というディレクトリを同期するため,サーバマシン側にも同じ階層構造を作成しています.
「マイドライブ」のフォルダを全て同期する場合は,サブディレクトリを作成する必要はありません.
$ 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 サーバのセットアップが完了しました.
次回はターミナルと外部接続の設定を行います.
コメント