2020年12月08日(火) [長年日記]
■ [windows] WSL2とHyper-V仮想マシンの間で通信ができるようにする
WSL2上のシェルからHyper-Vで動かしている仮想マシンへSSHでアクセスしようとしたら接続できなかった。接続しているネットワークが、
- WSL2は「vEthernet (WSL)」
- Hyper-V仮想マシンは「vEthernet (Default Switch)」
であり、これらの間の通信ができないようだ。
検索するとWSLのリポジトリに次のissueが見つかった。
ivan-section-ioさんがネットワークインタフェース間のForwardingがDisabledになっているのを変更すれば通信できるようになることを発見し、jonaskuskeさんが設定を変更するワンライナーを書いてくれている。
手元の環境の設定をPowerShell上で確認してみる。
PS> Get-NetIPInterface | >> select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | >> Sort-Object -Property IfIndex | >> Format-Table ifIndex InterfaceAlias AddressFamily ConnectionState Forwarding ------- -------------- ------------- --------------- ---------- 1 Loopback Pseudo-Interface 1 IPv4 Connected Disabled 1 Loopback Pseudo-Interface 1 IPv6 Connected Disabled 11 イーサネット IPv4 Connected Disabled 11 イーサネット IPv6 Connected Disabled 12 vEthernet (Default Switch) IPv4 Connected Disabled 12 vEthernet (Default Switch) IPv6 Connected Disabled 25 vEthernet (WSL) IPv6 Connected Disabled 25 vEthernet (WSL) IPv4 Connected Disabled
次のワンライナー
Get-NetIPInterface | where {$_.InterfaceAlias -eq 'vEthernet (WSL)' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | Set-NetIPInterface -Forwarding Enabled
をPowerShell上で実行してみる(管理者権限が必要)と設定が次のように変わり、WSL2とHyper-V仮想マシンの間で通信ができるようになった。
PS> Get-NetIPInterface | >> select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | >> Sort-Object -Property IfIndex | >> Format-Table ifIndex InterfaceAlias AddressFamily ConnectionState Forwarding ------- -------------- ------------- --------------- ---------- 1 Loopback Pseudo-Interface 1 IPv4 Connected Disabled 1 Loopback Pseudo-Interface 1 IPv6 Connected Disabled 11 イーサネット IPv4 Connected Disabled 11 イーサネット IPv6 Connected Disabled 12 vEthernet (Default Switch) IPv4 Connected Enabled 12 vEthernet (Default Switch) IPv6 Connected Enabled 25 vEthernet (WSL) IPv6 Connected Enabled 25 vEthernet (WSL) IPv4 Connected Enabled