WSL2がWindowsからlocalhostで接続できるようになる
1.今までのWSL
Windows 10 Insider Preview Build 18945 によって、WSL2がWindows側からlocalhost接続を受け入れるようになりました。それ以前のバージョンではコロコロ変わるIPアドレスによって、httpやssh接続の際に面倒な確認作業が生じていました。
私は対処法としてWSL2のコロコロ変わるIPをMyDNSで何とかするで書いた記事の通り、プライベートIPをMyDNSに通知して、ドメイン名で接続するように対処をしていました。しかしもうそんな必要はありません。localhostで接続できるようになったのです。
2.NICの状態
まず、基本的なネットワークの仕組みは以前のバージョンから変化していません。
Windows側で生成される仮想NIC
イーサネット アダプター vEthernet (WSL):
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::b562:8151:888c:3033%37
IPv4 アドレス . . . . . . . . . . . .: 172.27.176.1
サブネット マスク . . . . . . . . . .: 255.255.240.0
デフォルト ゲートウェイ . . . . . . .:
Linux側のNICの状態
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether de:50:74:6e:56:5c brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 76:c0:1f:cc:27:f3 brd ff:ff:ff:ff:ff:ff
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:9d:b5:ff brd ff:ff:ff:ff:ff:ff
inet 172.27.191.103/16 brd 172.27.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe9d:b5ff/64 scope link
valid_lft forever preferred_lft forever
5: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
以前と同じようのプライベートIPが割り当てられており、Linuxから外へ出る場合はeth0を経由する形になります。
localhostの検証
-
WindowsのWSL2仮想NICを無効化してみた結果
WindowsからLinuxへのlocalhost接続は生きたままです。
しかしLinuxから外部ネットワークへの接続は不可能になります。 -
LinuxからWindowsへのlocalhost接続
出来ません。現時点ではWindowsがlocalhostに対して、LinuxへのNATのような動作をしていると思われます。
そのため逆は出来ません。
今後のバージョンで対応される可能性があります。
WSL2を使うときに便利なbat
全然話は変わりますがWSLの再起動ごとに、sshやWebサーバの起動が面倒だという人のためのおすすめbatファイルがこれです。
start /b wsl -u root ^
for file in `\find /etc/rc3.d/* -maxdepth 1`; do $file start; done
RunLevel3の起動スクリプトを実行するBATです。これをWindowsから使えばsystemctlで有効化したサービスを起動することが出来ます。
まとめ
今回のネットワーク問題の改善により、WSL2がかなり使いやすくなりました。起動が速く軽量なので、実験環境としては有用になりました。今後のバージョンアップでどういう進化を遂げていくのかが楽しみです。ところで7月末の「Docker Desktop for WSL 2」はどうなったんでしょう?