WSL2の環境構築メモ(プロキシ設定とか)

Windows Subsystem for Linux(WSL2)とDockerをようやく自分のPCにインストールした。きっかけは以下の記事。
2020 年ではもう使えない Nodist はアンインストールする (Windows)

環境は以下。

  • OS:Windows 10 バージョン20H2
  • WSL2:Ubuntu 20.04.3
  • Docker:バージョン20.10.12

WSL2でネットにつながらない

WSL2のインストールは公式サイトを見て、問題なくできた。
が、問題はここからで、WSL2でapt updateしようとすると、ネットに接続できずにエラーとなる。
調べたところ、pingは通るものの、curlが通らない。

「wsl2 インターネット 接続できない」で検索すると記事は出てくるものの、DNS等のネットワーク設定の記事ばかりで、今回の事象には該当しないようだ。

ちょっと色々調べてみて、原因が分かった。ウィルスソフトのファイアウォールでブロックされているようだ。
参考:WSL からインターネットにアクセスできないのはなぜですか。

プロキシ設定

ネットを調べてみると、Windowsホスト側のプロキシを介せば通信できる模様。

Windows側のプロキシはApacheでもNginxでもいい。(自分はGolangで簡単にプロキシサーバを実装できるライブラリがあるので、それで作った)

Windows側プロキシを起動したら、WSL2側で環境変数に設定すれば、インターネットに接続できるようになる。ただし、WSL2側では、Windows側で起動しているサーバへはlocalhostでは接続できず、「vEthernet(WSL)」ネットワークアダプターに割り当てられたIPアドレスで接続する必要がある。
(反対に、Windows側からWSL2で起動しているサーバへはlocalhostでアクセスできる。参考:Linuxがほぼそのまま動くようになった「WSL2」のネットワーク機能

Windowsのコマンドプロンプトで「vEthernet(WSL)」のIPを調べる。

> ipconfig
...

イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: 172.17.96.1
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .:
...

WSL2側では、上記のIPを基に環境変数を設定。

$ export http_proxy=http://172.17.96.1:9999
$ export https_proxy=${http_proxy}

ターミナルを起動する度に上記を設定するのがめんどくさければ、.profileに以下を追加する。(参考:WSL環境から(Symantec Endpoint Protectionが邪魔して) apt update できない場合の対処法

if [ -z "$http_proxy" ]; then
  export http_proxy=http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):9999
  export https_proxy=${http_proxy}
  export HTTP_PROXY=${http_proxy}
  export HTTP_PROXY=${https_proxy}
fi

上記設定後、WSL2からネットに繋がるようになった。

Dockerインストール

公式サイトを見ながら、粛々と。

# Set up the repository
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker Engine
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

# Install Docker Compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

Dockerを起動して、hello-world イメージを起動 ⇒ エラー。

$ sudo service docker start
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 52.72.232.213:443: i/o timeout.

ネットにつながらず、イメージが取得できない。ここでもプロキシ設定の問題が。

プロキシ設定(Docker)

「/etc/default/docker」にプロキシ設定を追加する(プロキシが 172.17.96.1:9999 の場合)。

export http_proxy="http://172.17.96.1:9999"
export https_proxy="http://172.17.96.1:9999"

docker daemonを再起動して、hello-world イメージを起動できることを確認。⇒ できた。

ただし、上記の設定だと、「vEthernet(WSL)」ネットワークアダプターに割り当てられたIPアドレスが変わった場合は変更しなければならない。対処方法は未定。。

その他

WSL2にログインするデフォルトユーザを変更したいとき

WSL2側でユーザ追加。

sudo adduser hoge

Windows側でデフォルトユーザを変更。

ubuntu config --default-user hoge

Windows Terminalから開いたときのホームディレクトリを変更したいとき

Windows Terminalから設定を表示する。

左メニューからWSL2のディストリビューション名を選択し、開始ディレクトリを変更する。

sshのプロキシ設定

WSL2からsshで外部のサーバへアクセスしたい場合、sshコマンドでプロキシを指定してアクセスする(下記はプロキシが 172.17.96.1:9999 の場合)。

ssh -o ProxyCommand='nc -X connect -x 172.17.96.1:9999 %h %p' <ユーザー>@<接続先IP>

gitでssh接続する場合などは、.ssh/config でプロキシ設定する。

Host git-codecommit.*.amazonaws.com
  User XXXXXXXX
  IdentityFile ~/.ssh/codecommit_rsa
  ProxyCommand nc -X connect -x 172.17.96.1:9999 %h %p

以上です。