令和の時代に懐かしのYSFlight鯖を立てる

# 前書き
皆さん、YSFlight Simulatorというソフトをご存知でしょうか。
Windows98レベルのPCでも動作する（※必ずしも快適であるとは言っていない）フリーのフライトシミュレーターです。

http://ysflight.in.coocan.jp/

各種優れたアドオンを以てしても、けっしてリッチであるとは言えない描画ですが、フライトシミュレーターとして必要な要素はほぼ全て揃っています。
ネットワーク対戦機能さえ備え、その気になればMODを自作して突っ込める自由度の高さ。
ただ飛ばすも良し、空対空・空対地・空対艦任務をこなすも良し、何なら艦対艦・地対地もできなくはない。
最新鋭の重グラフィックボードを必要としない軽量性など、国内・海外を問わず根強いユーザーが存在するソフトウェアです。
今回、久し振りにYSFlightを飛ばしてみたくなり調べてみたところ、令和5年6月15日時点でQiitaには1つも記事がないことを知り（そもそもYSFlightの記事をQiitaに書こうという人種がアレすぎるきらいはありますが）、じゃあどうせならネットワーク鯖を構築してみるか！と思い、筆を取ってみた次第です。

# 仕様
今回はお家クラウドの仮想化基盤上に載せたUbuntuServer22.04LTSの上で、YSFlightのネットワーク鯖を動かし、これをVultrのVPSを介してインターネットに公開してネットワークプレイが出来る状態を目指します。
* UbuntuServer22.04LTS(8vCPU、8GBメモリ、100GB SSD)
on Hyper-V Server 2019(Xeon E5-2650L/64GB Dual Channel/2TB NVMe SSD)

ネットワークについては下掲記事にて構築したものを流用します。

https://qiita.com/daisuke_yanase/items/9ea95d048041a26b78c9

https://qiita.com/daisuke_yanase/items/32b3e86905896b9d1147

# 環境整備
VultrのFirewallとVPSの双方でTCPポート7915を開放します。
VPSのUFWの場合は以下のようになるでしょう。
``` /etc/ufw/before.rules
-A PREROUTING -i enp1s0 -p tcp --dport 7915 -j DNAT --to-destination <<YSFlightサーバーのIP>>
```
続いて、UbuntuServer22.04LTSを普通にHyper-V上にインストールします。
インストールウィザードであらかじめ任意のIPを設定する他、SSHもインストールしましょう。
Windows Admin Center越しに設定するとキーボードの入力通りのパスワードが設定されないので、簡単なパスワードを設定の上で、SSHに切り替えた際に変更することをお勧めします。
再起動後、SSHでログインします。
Netplanを編集してIPアドレスや時刻設定やアップデートを適用して、UFWで以下のポートを開けておきます。
```
sudo ufw allow 7915/tcp
```
YSFlightを公式ミラーサイトからダウンロードします。
```
wget https://forum.ysfhq.com/download/file.php?id=499 ysflight.zip
sudo unzip ysflight.zip
```
インストールスクリプトがありますのでコマンドを叩きます。
```
sudo python3　~/Ysflight/InstallInLinux.py
```
これで /root/YSFLIGHT.COM/ysflight にYSFlightがインストールされました。
YSFlightのサーバーは常駐させたいので、サービスファイルを作成します。
``` /etc/systemd/system/ysflight.service
[Unit]
Description=YSFlight Simulator
After=network.target

[Service]
Type=Simple
Restart=on-failure
ExecStart=/root/YSFLIGHT.COM/ysflight/ysflight64_nownd -server <<サーバー名>>

[Install]
WantedBy=multi-user.target
```
<<サーバー名>>、及びそれ以降の引数は任意の値に置き換えてください。
保存したら、
```
sudo systemctl enable ysflight.service
```
してサービスを有効化します。「 sudo systemctl status ysflight.service 」して値がFailedになっていなければ成功です。

# 動作確認
YSFlightをインストールしたPCを用意します。今回はその辺で埃を被っていたWindows10のPCを使います~~久しぶりに動かしたらSATA SSDがプチフリしまくりでやっぱSATA SSDはダメだなと思いました~~。
* Windows 10 Pro
CPU:Core i7-2600
MEM:DDR3 16GB
SSD:SATA 1TB
GPU:GeForce GTX 1050 2GB

https://ysflight.org/download/

公式ミラーサイトから最新版を拾ってきて解凍し、適当なフォルダに放り込みます(今回はProgram Files (x86)に放り込みましたが任意の場所で構いません)。
![スクリーンショット 2023-06-17 17.41.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/77c20e73-3b37-0c33-2152-556b5ed9487d.png)
中に入っているプログラム本体から、今回は「 ysflight32_gl2.exe 」を選択します。 
![スクリーンショット 2023-06-17 17.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/c0e9f67f-8cb5-36bd-03d5-e2c99bd26346.png)
初回起動時の説明を~~サラッと流し~~読んで初期画面に到達したら、「ネットワーク(M)」 -> 「クライアント(C)」と進みます。
![スクリーンショット 2023-06-17 17.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/4eee8795-21a4-5a51-cc1a-cb4943ecaba5.png)
左上にネットワークを指定するダイアログが出ますので、ユーザ名とサーバーホスト名(IPアドレス)を入力して「確定」をクリックします(特別にポート指定がある場合を除いて、通常はサーバーポート番号は変更しなくて大丈夫です)。
![スクリーンショット 2023-06-17 17.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/9e6a0566-b265-815f-8792-00d544514698.png)
するとIFF(敵味方識別装置)のコードや航空機、開始位置を選択する画面になります。
![スクリーンショット 2023-06-17 17.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/f0ad2997-bf41-51d8-2ad9-65b10853a3ef.png)
今回は自由飛行を選択してありますので、IFFは特に触りません。「航空機選択」をクリックします。
![スクリーンショット 2023-06-17 17.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/3a4b6cee-eb50-85ff-4f5f-3597144fde5c.png)
お好きな機種を選んで「確定」を押して前の画面に戻り、「飛行開始」をクリックします。
![スクリーンショット 2023-06-17 17.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1861875/e63a7ff4-95e4-839c-36a9-924494164d17.png)
初期位置が上空なのでいきなり空中に放り込まれます。通信量が少なくて大変心配になるのですが、この画面まで辿り着いたということはネットワーク戦モードがきちんと動いているということになります。
本当はジョイスティックで操作した方が本格感があるのですが、残念ながら処分してしまいましたのでマウスとキーボードで何とかしました(Escキー押しまくれば解脱できます)。
# 後書き
以上駆け足でしたが、令和の時代にYSFlight鯖を立てることが出来ました。
取り敢えず立ち上げまでということで、引数を何も細かく設定していませんが、色々触ってみると良いと思います。
至極あっさり「出来ました」と書いていますが、裏では丸一日ぐらいUFWの設定ミスと格闘していました。~~誰だDENYをポートレンジで指定したのは！！！！！（お前だ~~
この記事が誰かの参考になれば幸いです。