WSL2でMySQL serverを立ち上げてローカルネットワーク上の他のデバイスから接続するまで

# 概要
WSL2+MySQLのインストールから、ローカルネットワーク内の外部デバイスから接続するまでの手順を記載しています。

既にWSL2にMySQLをインストールする記事やWSL2に対して外部デバイスからアクセスする手順を記載した記事は存在しますが、情報が分散されており、完了までに手間取った箇所がいくつかあるので、情報を集約したまとめ記事を作成しました。

# 手順
## 前提
登場人物
- winPC：WSL2をインストールするWindows PCです。
- WSL2：Windows PCにインストールされたWSL2です。WSL2上でMySQLのサーバーを立ち上げます。
- ほかのデバイス：MySQLに接続するwinPCとは別のデバイスです。今回はローカルネットワーク内の別デバイスのWindows 11から接続します。

## バージョン確認
- MySQLのバージョンは5.7系と8.0系がありますが、今回はver8.0.38を使用します。
- LinuxのディストリビューションはUbuntu-20.04を使用します。MySQLの5.7系を使用する際は、対応を確認してください。

## WSL2のインストール
以下の記事の通りに実行します。
WSL2の使用方法も詳しく記載されているので、WSLに慣れていない方は、一度通して読むことをお勧めします。

**[WSL（Windows Subsystem for Linux）インストールからファイル操作、プログラムの実行まで - Curios](https://libertytree-seek.com/technology/1881/)**

:::note warn
上記記事のWSLから外部インターネットへ接続するための設定の項で設定する際に、`/etc/resolv.conf`のうち、`nameserver`の行をパブリックDNSサービスを使用するよう記述されていますが、プライベートなDNSサーバーがある場合はそちらを入力します。
:::

winPCのコマンドプロンプトから
```:cmd
ipconfig /all
```
を実行することで、DNSサーバーのIPアドレスを確認できます。


## WSL2でUbuntuにMySQLをインストール
下記の記事のうち
- インストール手順
- パスワードでログインするようにする
- クライアントソフト(MySQL WorkBench)をインストールする

を実行しましょう。

winPCのMySQL WorkBenchから接続テストができていればOKです。

**[【WSL】WSL2にmysqlをインストールする - echo("備忘録");](https://makky12.hatenablog.com/entry/2022/10/11/120500)**

:::note warn
インストール手順でrootのパスワードを設定した後に、設定に関する質問が4回聞かれますが、セキュリティの観点から、特別な事情がない限りはすべてYesにすることをお勧めします。
:::

## WSL2で外部デバイスからの接続を許可する
次に、MySQLの設定ファイル、WSL2のファイアーウォールから、それぞれ外部接続を許可します。

まずはMySQLの設定ファイルです。
MySQLは初期設定ではlocalhost以外から接続できないようになっているので、以下のコマンドで設定ファイルを書き換えます。

:::note info
筆者はテキストエディタはnanoを使用していますが、vim等任意のテキストエディタを使用しても問題ありません。その場合は`nano`の部分の記述を任意のテキストエディタに変更します。
:::

```:bash
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
```

`bind-address = 127.0.0.1`
の行を
`# bind-address = 127.0.0.1`
に変更してコメントアウトします。

変更後、ファイルを保存して閉じてください。
(nanoの場合は、Ctrl + X→Y→Enter)

> 参考：[MySQLの外部接続を許可し、外部接続できるDBを作成する | タンス](https://tansunohazama.sakura.ne.jp/wordpress/%E3%80%90mysql%E3%80%91mysql%E3%81%AE%E5%A4%96%E9%83%A8%E6%8E%A5%E7%B6%9A%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B/)

次に、WSL2のファイアーウォールの設定をします。
mysqlのデフォルトポートである3306の通信を許可します。
```bash
$ sudo ufw allow 3306
```

もしufwがなければインストールしましょう。
```bash
sudo apt-get install ufw
```

> 参考：[MySQL Serverに外部から接続する #MySQL - Qiita](https://qiita.com/tocomi/items/0c009d7299584df49378)

## WSL2でroot以外のユーザー作成を行う
現時点では、localhostからrootユーザーのみでMySQL上のデータベースにアクセスできる状態です。
(MySQLのインストール時の選択肢をすべてYesにしていれば、リモートからrootでは接続できない状態になっています。)

:::note info 
rootユーザーは最も強い権限を持っているため、一般的に通常の運用時に使用しません。
そこで、使用者ごとに必要な権限のみを付与したユーザーを作成し、自身のパスワードでログインしてアクセスします。
:::

本記事における、ほかのデバイスからの接続テストでも、最も権限の低いユーザーを作成してテストを実施します。


WSL2でMySQLサーバーを起動させた状態で下記のコマンドを実行し、rootユーザーでログインします。
```:bash
sudo mysql -u root -p
```

テストに使うユーザーネームとパスワードを決めて、下記のコマンドを実施します。
```:mysql
CREATE USER '(ユーザーネーム)'@'(IPアドレス)' IDENTIFIED BY '(パスワード)';
```

:::note warn
- すべて`''`は必要
- `'(IPアドレス)'`は特別に指定しない場合は`'%'`でOK
:::

> 参考：[MySQL | ユーザーを作成する(CREATE USER文)](https://www.javadrive.jp/mysql/user/index1.html)

登録後、`exit`コマンドでMySQLからログアウトし、下記コマンドを実行し、パスワードを入力してログインできるかを確認します。
```:bash
sudo mysql -u (ユーザーネーム) -p
```

ログインできていれば、正しくユーザーを作成できています。

## Windowsでポートを開放する
次に、WindowsマシンからWSL2に接続するために、
- ポートフォワーディング
	> 参考：[ポートフォワーディングとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12663.html)
- （必要に応じて）ファイアーウォールの設定
を実行する必要があります。

下記サイトの
- 1.WindowsマシンからWSL2に接続するための設定を行う

通りに実行しましょう。

**[wsl2 で立てたサーバーにローカルネットワーク内の他の端末からアクセスする #Network - Qiita](https://qiita.com/tomoken_nikki/items/82234030e712c44c2e40)**

:::note warn
上記サイトのpowershellスクリプトの記述コードのうち
```:ps1
$ports=@(22,3000,18000);
```
を、MySQLのデフォルトのポート番号である
```:ps1
$ports=@(3306);
```
に書き換えましょう。
:::


ps1ファイルを実行後、winPCのIPでアクセスできるかを確かめます。

WSL2でサーバーを再起動します。
```:bash
sudo systemctl restart mysql
```
winPCで下記コマンドを実行し、IPv4アドレスを控えます
```:cmd
ipconfig
```
winPCでMySQL WorkBenchを立ち上げ、Database -> Manage Server Connectionsを選択し、下記の設定を打ち込んだ後、Test Connectionを実行します。
- Hostname: (winPCのIPv4アドレス)
- Port: 3306
- Username: (登録したユーザーネーム、root以外)

接続テストに成功すればOKです。

:::note warn
ただし、ポートフォワーディングの設定をすると、WSL2で起動したサーバーにlocalhostでアクセスできなくなります。
再度localhostで接続したい場合は、下記サイトの
**ポートフォワードの設定を削除する**
通りに、ポートフォワーディングの設定を削除しましょう。
> 参考：[wsl2 で立てたサーバーにローカルネットワーク内の他の端末からアクセスする #Network - Qiita](https://qiita.com/tomoken_nikki/items/82234030e712c44c2e40)
:::

## ほかのデバイスからアクセスする
ここまでくればサーバー側からの設定は完了したので、ほかのデバイスの操作に移ります。

今回はWindows 11のMySQL WorkBenchから接続する場合を例に挙げて説明します。

ほかのデバイスにMySQL WorkBenchをインストールします。
- サーバー側のMySQLのバージョンと合ったものを、下記サイトからインストールしてください。
**[MySQL :: Download MySQL Workbench](https://dev.mysql.com/downloads/workbench/)**
- 詳しいインストール方法は、`## WSL2でUbuntuにMySQLをインストール`の項で実施しているので省略します。

ほかのデバイスでMySQL WorkBenchを立ち上げ、Database -> Manage Server Connectionsを選択し、下記の設定を打ち込んだ後、Test Connectionを実行します。
- Hostname: (winPCのIPv4アドレス)
- Port: 3306
- Username: (登録したユーザーネーム、root以外)

接続テストに成功すれば完了です。お疲れさまでした。