はじめに
アルバイトにて、プロキシ環境下で動くUbuntu Server 20.04上にWebアプリを構築することになったので、
WSLを用いてUbuntu Server 20.04を動かし、Squidを使ってホストのWindowsをプロキシ化することで疑似的に本番環境を再現した
TL; DR
- ホストWindowsをSquidを使ってプロキシ化
- WSLへ使いたいディストリビューション(Ubuntu Server 20.04)をカスタムインポート
- Ubuntu Server 20.04インスタンス上で環境構築
1. ホストWindowsのプロキシ化
WSL上で動くUbuntu ServerのプロキシをホストWindowsに担ってもらうことにしており、
プロキシの作成にはSquid for Windowsを利用した
1. Squidのインストール
こちらの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では提供されていないため、
カスタムインポートという形で追加する必要がある
ここをみると、カスタムインポートでは
- Docker Desktopを通じて当該ディストリビューションのtarファイルを入手
-
tarファイルをWSLにインポート
という流れがオーソドックスなものらしかったので、それを実行した
1. Docker Desktopを利用したtarファイルの入手
以下の作業はWSLのUbuntuインスタンスのbashで実行した
また、Ubuntuインスタンスでdockerコマンドを利用できる必要があるため、
こちらを参考に、WSL Integrationを当該インスタンスで有効にした
加えて、今回はUbuntu Server 20.04のファイルが欲しかったため、こちらを参考にコンテナを作成し、これを利用した
流れは以下の通り
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
この際、ロケール等を聞かれるので自分の環境に合わせて設定した
コンテナを終了
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にディストリビューションをインポートした
なせか、デフォルトのディレクトリで以下のコマンドを実行すると
Error code: Wsl/ERROR_FILE_NOT_FOUND
となったので、C:\tempにcdしたうえで以下のコマンドを実行した
実行後にインポートしたtarファイルと同階層にインポートしたインスタンスの仮想HDD(vhdxファイル)が作成されるため、きれいに管理する場合はtarファイルを動かしてからインポートしたほうがいい
(インポート後にvhdxファイルを移動する方法もある)
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のネットワーク環境はこちらに書いてあるように、デフォルトでは
仮想ネットワークアダプタ(Hyper-Vでは仮想スイッチと呼ぶ)を利用した内部ネットワークであり、
簡単に言うと、仮想的にホストWindowsとWSLインスタンスがスイッチングハブで接続されているようなもので、
ホストWindowsとインスタンスは別々のローカルIPアドレスを使用して接続している
ホストのローカルIPアドレスの確認
ip route show | grep -i default | awk '{ print $3}'
proxy設定
こちらを参照に.bash_profile
ファイルを作成・編集しsource .bash_profile
てシェルスクリプトを実行し環境変数を設定した
proxy="server ip"
export http_proxy="http://$proxy"
export https_proxy="$http_proxy"
設定が正常に行えていれば、curl
などでhttp通信をした時、
ホスト側のSquidのログファイル(デフォルトではC:\Squid\var\log\squid\access.log
)にログが記載される