WSL2のネットワークはHyper-V仮想スイッチ
WSL2のネットワークはHyper-V仮想スイッチです。これはWindowsがPro以上の品目であればHyper-VマネージャでWSLというスイッチを確認できます。このスイッチ自体はHyper-V Default Switchとよく似た構成になっていて、外部への通信はWinNATが中継します。
イーサネット---------------+-------------------------
|
Windows(WinNAT)
|
vEthernet (WSL)-----------+-------------+----------
|
WSL2
Hyper-V仮想スイッチ自体はWSL2等が存在するHyper-V域内とWindows外部のネットワークを普通に接続しているので比較的自由度が高いと思っています。
WSL2ネットワークの(正しい?)用途
WSL2(というかMicrosoft社)が認識しているネットワークの用途は
- WSL2インスタンスからWinNATを介して(Windowsホストの)外部へ通信する
- localhostを介してWSL2インスタンスで起動したサービスにWindowsホストから接続する
(これはネットワーク接続というより中継プログラムが担当)
この2点なのだと思います。
- WSL2インスタンスからWindowsホストに直接通信する
- 外部からWindowsホストをルータとして直接WSL2インスタンスにアクセスする
等というのは基本想定外なのでしょう。
この想定外の用途を検証していて発生した躓きポイントはWindowsセキュリティが想定する「パブリックネットワーク」です。
検証してみましょう
具体的には、以下のコマンドを WSL2で実行してください。筆者環境(Windows Defender + プライベートネットワーク)では通信できません。
$ ping `ip route | sed -nr 's/.*default *via *([0-9.]+).*$/\1/p'`
PING 172.18.0.1 (172.18.0.1) 56(84) バイトのデータ
これは、WSL2のデフォルトルート(=vEthernet (WSL)に接続されたWindowsホストIPアドレス
)へ ping を送るものです。
この状態で、Windowsセキュリティ - ファイアウオールとネットワーク保護で「パブリックネットワーク」
の保護を無効にすると、、
$ ping `ip route | sed -nr 's/.*default *via *([0-9.]+).*$/\1/p'`
PING 172.18.0.1 (172.18.0.1) 56(84) バイトのデータ
64 バイト応答 送信元 172.18.0.1: icmp_seq=104 ttl=128 時間=0.322ミリ秒
64 バイト応答 送信元 172.18.0.1: icmp_seq=105 ttl=128 時間=0.537ミリ秒
64 バイト応答 送信元 172.18.0.1: icmp_seq=106 ttl=128 時間=0.518ミリ秒
64 バイト応答 送信元 172.18.0.1: icmp_seq=107 ttl=128 時間=0.501ミリ秒
このようにレスポンスが返るようになります。
この時、フィルタルールに手を加える(確認の為に一旦無効にしましたが)のは、必ず「パブリックネットワーク」というのが注意点です。
Windowsセキュリティでプライベートネットワークを選択していても適用されるフィルタはパブリックネットワークです。どうやら、WindowsにとってvEthernetの先は全てパブリックネットワークという判断のようです。
Hyper-V仮想スイッチはパケットフォワードを有効にするとルーター的に普通にネットワークを超えられるのですが、ここういう通信にはDefenderの介入はないようですね。フィルタルールには「受信」「送信」に中継するパケットの送受信も含まれるのかと思ったのですが少なくともDefenderは素通しするようです。