• Windows Subsystem for Linuxガイド 第34回 ミラードネットワークモード

Windows Subsystem for Linux(WSL)には、2023年9月のアップデートで搭載されたネットワークモードという機能がある。今回は、このネットワークモードについて解説する。ネットワークモードでは、従来のWSLのネットワークをNATネットワークモード(以下NATモード)と呼ぶ。これに対して新しく作られたのがMirroredネットワークモード(同Mirroredモード)である。簡単にいうとMirroredモードでは、WSL側へのLAN側からのアクセスが可能になる。反面、制限も生じるため利用方法によってどちらかを選択する必要がある。

NATモードとは?

WSL2では、仮想マシンが使われているため、WSL側に独自のネットワークアドレスが割り当てられ、Win32側とは独立したネットワークになっていた。これを「NATモード」と呼ぶ。Mirroredモードを解説する前に、確認の意味でNATモードの挙動に関して解説しておく。

NATモードでは、Win32側とWSL側は、「仮想スイッチ」(仮想的なスイッチングハブ)を介して接続しており、お互いに相手のIPアドレスを使うことで通信が可能だった(図01)。このとき、仮想スイッチは、Win32側にしか接続しておらず、通常状態のWindowsは、LAN側から来たWSL向けのパケットをルーティングしない。このため、WSLは、LAN側のネットワークノードとは通信することができなかった。

  • 図01: NATモードとMirroredモードでは、WSL側のIPアドレス割り当てが異なる。NATモードでは、Win32側と異なるIPアドレスが割り当てられ、仮想スイッチを介してWin32側と接続する。これに対してMirroredモードでは、Win32側と同じIPアドレスが割り当てられる

ただし、Win32側でポート・フォーワーディングの設定を行うことで、LAN側とWSL側のパケット転送が可能だった。しかし、ポートフォワーディングの設定は、ポート単位で、双方向で必要なため、かなり面倒な設定だった。

NATモードには、localhostForwardingと呼ばれる機能がある。これは、Win32側で、宛先のホスト名としてlocalhostを使ったときに、WSL側へのアクセスを行うものだ。

設定は、“.wslconfig”ファイルの「localhostForwarding」で行う。同設定がtrueになっていたとき、Win32側でホスト名「localhost」によるアドレス指定とポート指定の組み合わせでWSL側へのアクセスを許可していた。

たとえば、WSL側で、ポート8080でHTTPサーバーを動作させたとき、Win32側からは、「http://localhost:8080/……」といったURLで、WSL側のHTTPサーバーにアクセスが行える。ただし、アドレス指定としては、“localhost”(ホスト名)または“[::1]”(IPv6 ローカルループバック・アドレス)で指定する必要がある。逆に“127.0.0.1”では、常に自分自身(Win32側からWin32側)になる。このあたりをまとめたのが(表01)である。この表にある0.0.0.0は、Linuxでは、「ローカルマシン上のすべてのIPv4アドレス」として扱われるようである。Windowsでは、ルーティングテーブルのデフォルトルートを表す目的でしか使っておらず、送り先アドレスとしては無効なようである。

  • ■表01

NATモードでは、前述のように直接WSL側のIPアドレス(v4、v6とも)を使ってもLAN側からはアクセスができない。

また、Win32側からWSLへは、IPv4のみでアクセスが可能で、IPv6を使ってWSL側をアクセスすることができない。

Mirroredモードとは?

WSLの2023年9月のアップデートでは、こうした従来のネットワーク(NATモード)とは別のネットワークモードに切り替えることが可能になった。これが「Mirroredモード」である。

Mirroredモードでは、WSL側とWin32側が同じネットワークアドレスを持つ。ただし、それぞれでネットワークスタックが動作しており、動作は個別に行われる。

このとき、Win32側とWSL側のネットワークスタックに対して、相互が利用中のポート番号を伝達し、同じポート番号を重複して使わないように制御するようだ。この動作を「鏡」と見立てたのがMirroredモードである。

IPアドレスが同じになるため、LANに接続したWin32側では、ポートごとに通信が自分あてなのか、WSLあてなのかを見分けることができる。このとき、IPv4アドレスもIPv6アドレスも利用可能だ。

ただし、Win32側、WSL側が同じIPアドレスを使うことで、制限も生じる。1つは、従来可能だった、Win32側で、localhostによるアドレス指定を使った、WSL側アクセス(localhostForwarding)が利用できなくなることだ。

ただし、Mirroredモードのときには、“.wslconfig”の“[experimental]”で“hostAddressLoopback”設定が利用できる。この設定をtrueにするとWin32側からWSL側へ自分自身のIPv4アドレスでアクセスが可能になる。falseの場合には、逆にWSLからWin32側へのアクセスをIPv4アドレスで行える。

Mirroredモードの挙動をまとめたのが表02である。

  • ■表02

たとえば、httpサーバーをWSL側で立ち上げた場合、LAN側からは、Win32側IPアドレス(WSL側と同じ。IPv4、IPv6とも)でアクセスが可能だ。このとき、Win32側で利用中のポート番号以外を指定する必要がある。

Mirroredモードで、Win32側からWSLあるいはその逆を行う場合には、IPアドレスとして127.0.0.1を使うか、“.wslconfig”で“hostAddressLoopback=true”としてWin32側のIPv4アドレスを使うことができる。どの場合でも、IPv6アドレスは、自分自身(WSLならWSL、Win32ならWin32)しかアクセスできない。

“.wslconfig”の“[experimental]”セクションで“ignoredPorts=<ポート番号>[,<ポート番号>...]”を利用すると、指定したポート番号は、Win32側とWSL側で独立して利用できるようになる。このポート番号ではLAN側からアクセスはできなくなるが、WSL内では利用できるようになる。また、このとき、Win32、WSL間でも指定したポート番号でのアクセスもできない。

最後に(表03)に、ネットワークモード関連の“.wslconfig”の設定をまとめておく。

  • ■表03

NATモード、Mirroredモードの選択は、原則、LAN側からのアクセスを行うかどうかである。設定により多少の違いはあるが、Win32側からのアクセスはどちらも可能である。

Mirroredモードには、LAN側からアクセスが可能というメリットがあるが、逆にLAN側からアクセスする必要がなければ、選択する必要がない。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/