まず、前提条件としてブリッジモードに設定している必要があります。
ブリッジモードについてはこちらの記事をどうぞ
仮想スイッチの設定を変更するには
ブリッジモードではWSL2に任意の仮想スイッチを接続します。その仮想スイッチを作成する簡単な方法はHyper-Vマネージャーを使うことです。Windowsが使用するアダプターがWiFiから有線LANに変わった場合も現在使用しているアダプターに切り替えればWSL2が接続しているネットワークも切り替わります。
ただ、これだけではうまく切り替わらないかもしれません。
WSL2って仮想マシン?コンテナ?
少し寄り道ですが、WSL1が互換システムコールによるサブシステムだったのに対してWSL2はHyper-Vを用いた仮想マシンでカーネルを動かしているとうのはよくある説明です。そして、深掘りしている方はWSL2はコンテナだと解説されています。
では、Hyper-Vってコンテナシステムでしたっけ?いや、それはさすがに、、ではこのコンテナシステムは何でしょう?
WindowsにはHCS(Host Compute Service)というコンテナシステムが搭載されています。HCSを使った身近な仕組みがWindowsサンドボックスですが、Hyper-V仮想マシンとは異なりリソースの多くをホストWindowsと共有しているので軽量な使い捨て環境を実現しています。同様にWSL2もHCSで構築されていますが、Windowsとは別のカーネルを動かすために低位レイヤーにHyper-Vを用いています。
WSL2ではDHCPクライアントも起動していないのにIPアドレスやゲートウェイが設定されていますが、HCSの仕組みを使ってホストから取得したネットワーク情報を(おそらく)initが連携して設定しています。
HCSに頼らずDHCPクライアントを起動する
このHCS<->initの連携が動的なネットワーク環境の変化に対応していない為、仮想スイッチの接続アダプタを切り替えるだけでは新しく接続されたネットワークの情報が入手できません。そこでこの仕組みに頼らずネットワークを構成します。
まず、WSL2が提供するネットワーク設定を停止させます。
[wsl2]
ipv6=false
dhcp=false
そして、WSL2インスタンスにてDHCPクライアントを稼働させます。
Ubuntuを使用されている方が多いと思いますが、さらにsystemdを稼働させている場合にはsystemd-networkdを使うのが簡単でしょう。
その他にもdhclinetやdhcpcdなどお好みのものを使えば良いと思います。
Ubuntu(+systemd)の場合はnetplanに以下のような設定を書くだけです。
network:
ethernets:
eth0:
dhcp4: true
dhcp6: true
accept-ra: true
systemd-networkdをenableすることをお忘れなく。
コマンドラインで切り替える
さて、本来はここだけを書きたかったのですが、前振りが長くなりました。
仮想スイッチはPowerShellのコマンドレットを使って操作できます。具体的にはこういう感じです。外部スイッチの名前はEXLにしています。
$A=(Get-NetAdapter -Physical|?{$_.Status -eq 'Up'}).Name;Set-VMSwitch EXL -SwitchType Private -Passthru;Set-VMSwitch EXL -NetAdapterName $A
シェルスクリプトから管理者権限のPowerShellを呼び出して実行するようにしておけば、WSL2の中からスイッチの操作ができます。
順番に見ていくと
(Get-NetAdapter -Physical|?{$_.Status -eq 'Up'}).Name
これはWindowsで現在リンクアップしている物理アダプター名を取得します。VMSwitchを操作すると使用していないアダプターが一時的にリンクアップすることがあるので、その前に取得しています。
Set-VMSwitch EXL -SwitchType Private -Passthru
一旦プライベート仮想スイッチに切り替えます。本来アダプターを切り替えるだけで良いはずですが、何度か切り替えていると複数のアダプターに接続された奇妙な外部スイッチが出来てしまうことがあります。使用中のスイッチを操作するのでデタッチに失敗するのかもしれません。ひとまず回避策です。
Set-VMSwitch EXL -NetAdapterName $A
そして、アダプターを接続します。アダプターを指定するのは外部仮想スイッチだけなのでこれだけで大丈夫です。
これでひっそりと接続アダプターが切り替わるのですが、何度も切り替えているとWSL2側から見えなくなることがあります。元来、動的な変更が行われることは想定していないのでしょう。
そういう時にはwsl --shutdownで一旦インスタンスを停止させれば解決します。