WSLでWebアプリ用にUbuntu Server 20.04+プロキシの疑似本番環境を作成した話

# はじめに
アルバイトにて、プロキシ環境下で動くUbuntu Server 20.04上にWebアプリを構築することになったので、
WSLを用いてUbuntu Server 20.04を動かし、Squidを使ってホストのWindowsをプロキシ化することで疑似的に本番環境を再現した

# TL; DR
1. ホストWindowsをSquidを使ってプロキシ化
1. WSLへ使いたいディストリビューション(Ubuntu Server 20.04)をカスタムインポート
1. Ubuntu Server 20.04インスタンス上で環境構築

# 1. ホストWindowsのプロキシ化
WSL上で動くUbuntu ServerのプロキシをホストWindowsに担ってもらうことにしており、
プロキシの作成には[Squid for Windows](https://webproxy.diladele.com/download.html)を利用した

### 1. Squidのインストール
[こちら](https://squid.diladele.com/)の**SQUID FOR WINDOWS**から**squid.msi**をダウンロードしインストール

### 2. プロキシの設定と起動
Squidでは基本的なプロキシ設定はデフォルトでは**C:\Squid\etc\squid\squid.conf**に記述されている

今回は特に設定はせずデフォルトのまま使用した

# 2. WSLへのUbuntu Server 20.04のカスタムインポート
WSLではMicrosoft Storeにあるディストリビューションを利用する事が多いが、
今回のUbuntu Server 20.04はMicrosoft Storeでは提供されていないため、
カスタムインポートという形で追加する必要がある

[ここ](https://learn.microsoft.com/ja-jp/windows/wsl/use-custom-distro)をみると、カスタムインポートでは
1. **Docker Desktopを通じて当該ディストリビューションのtarファイルを入手**
2. **tarファイルをWSLにインポート**
という流れがオーソドックスなものらしかったので、それを実行した
### 1. Docker Desktopを利用したtarファイルの入手
以下の作業は**WSLのUbuntuインスタンス**のbashで実行した

また、Ubuntuインスタンスでdockerコマンドを利用できる必要があるため、
[こちら](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-containers#install-docker-desktop)を参考に、**WSL Integrationを当該インスタンスで有効に**した

加えて、今回は**Ubuntu Server 20.04**のファイルが欲しかったため、[こちら](https://askubuntu.com/questions/707621/official-docker-image-for-ubuntu-server)を参考にコンテナを作成し、これを利用した

流れは以下の通り
#### ubuntuイメージをpull
```
docker image pull ubuntu
```
#### ubuntuイメージからコンテナを作成して標準入力に入る
```
docker run -it --name wsl_export ubuntu
```
#### コンテナにUbuntu Server用パッケージをインストール
```
apt-get update && apt-get install -y ubuntu-server
```
:::note info
この際、**ロケール等を聞かれる**ので自分の環境に合わせて設定した
:::

#### コンテナを終了
```
exit
```

#### コンテナをマウントされたCドライブにtarファイルとしてエクスポート
```
docker export wsl_export > /mnt/c/temp/ubuntu_server_20_04.tar
```
この場合では、WSLを実行しているホスト(Windows)のCドライブ直下にtempというフォルダが作られ、その中にubuntu_server_20_04.tarという名前でtarファイルが作成される

#### コンテナをクリーンアップ
```
docker rm wsl_export
```

### 2. tarファイルをWSLにインポート
tarファイルが手に入ったので、ホスト(Windows)のPowershellを管理者権限で開き、以下のコマンドでWSLにディストリビューションをインポートした

:::note warn
なせか、デフォルトのディレクトリで以下のコマンドを実行すると
**Error code: Wsl/ERROR_FILE_NOT_FOUND**
となったので、**C:\temp**にcdしたうえで以下のコマンドを実行した
:::
:::note alert
実行後に**インポートしたtarファイルと同階層にインポートしたインスタンスの仮想HDD(vhdxファイル)が作成される**ため、きれいに管理する場合はtarファイルを動かしてからインポートしたほうがいい
([インポート後にvhdxファイルを移動する方法もある](https://qiita.com/OzoraKobo/items/62386ebf3ff167b4fe8d))
:::

```
 wsl --import UbuntuServer20.04 C:\temp .\ubuntu_server_20_04.tar
```

# 3. Ubuntu Server 20.04インスタンス上で環境構築

サーバ用の設定は同僚にAnsibleでほとんど自動化してもらったので、今回説明するのは情報収集に時間がかかった以下の3つ
- ユーザ設定
- 各種基本パッケージのインストール
- ホストWindowsのSquidプロキシへの接続

### ユーザ設定
使用しているUbuntu ServerインスタンスはDockerコンテナをもとに生成したものなので、基本的なパッケージしか入っておらず**sudo**コマンドが無く、rootユーザしか登録されていない
そのため、sudoコマンドのインストールとユーザ設定が必要になる

#### sudoコマンドのインストール
```
apt update
apt install sudo
```
#### rootユーザのパスワード設定
```
sudo passwd root
```

#### ユーザの追加とsudo権限の付与
```
sudo adduser hoge
sudo gpasswd -a hoge sudo
```
#### デフォルトユーザの変更
今のままだとインスタンスに接続したとき毎回rootで入ってしまうので、
デフォルトユーザを`/etc/wsl.conf`に以下を記述し設定する
```
[user]
default=hoge
```

### 各種基本パッケージのインストール

#### hwclockパッケージのインストール
```
sudo apt-get install util-linux-extra
```
#### ufwパッケージのインストール
```
sudo apt -y install ufw
```
#### cronパッケージのインストール
```
sudo apt install -y cron
```
### ホストWindowsのSquidプロキシへの接続
WSL2のネットワーク環境は[こちら](https://atmarkit.itmedia.co.jp/ait/articles/1909/09/news020.html)に書いてあるように、デフォルトでは
仮想ネットワークアダプタ(Hyper-Vでは仮想スイッチと呼ぶ)を利用した内部ネットワークであり、
簡単に言うと、仮想的にホストWindowsとWSLインスタンスがスイッチングハブで接続されているようなもので、
ホストWindowsとインスタンスは別々のローカルIPアドレスを使用して接続している

#### ホストのローカルIPアドレスの確認
```
ip route show | grep -i default | awk '{ print $3}'
```

#### proxy設定
[こちら](https://qiita.com/halglobe0108/items/735433531e7b17a20b54)を参照に`.bash_profile`ファイルを作成・編集し`source .bash_profile`てシェルスクリプトを実行し環境変数を設定した
```
proxy="server ip"
export http_proxy="http://$proxy"
export https_proxy="$http_proxy"
```
:::note info
設定が正常に行えていれば、`curl`などでhttp通信をした時、
ホスト側のSquidのログファイル(デフォルトでは`C:\Squid\var\log\squid\access.log`)にログが記載される
:::