前提条件#
wsl2 + Docker で PHP などを書くと、直接 127.0.0.1 [] でアクセスできます。
ASP を書くために IIS を久しぶりにインストールしたところ、wsl2 内のサービスが開けなくなりました。
最終的に見つけた真の原因は、Docker 内でシンボリックリンクを使用したファイルのパーミッションの問題でした。そのファイルは実際には必要ないため、削除するだけで問題ありませんでした。
しかし、原因を見つける過程で、wsl2 のネットワークを設定する記事に従って操作しました:「WSL2 に静的 IP アドレスを設定する - 知乎」。
問題は、WSL2 は再起動後に内部の設定が復元される一方、ホストマシンのvEthernet (WSL)
は復元されないため、毎回コマンドを実行して内部の設定を変更する必要があることです。そうしないと、ネットワークに接続できません...
Win11 の落とし穴#
Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress
コマンドを使用して対応する操作を行うことができますが、Win11 ではこのvEthernet (WSL)
が非表示になっています。実際にはパラメータを追加する必要があります。Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPAddress
と書いてください。
では、どのようにして表示させることができるでしょうか?
Windows 11 で WSL2 vEthernet (WSL) を非表示にする方法は? - 知乎
探索#
前のチュートリアルでは、WSL2 の内部を設定すると/etc/resolv.conf
ファイルが変更され、再起動すると元に戻ります。スクリプトを自動実行できるようにすることはできますが、手間がかかるのでやりませんでした。
その後、デフォルトで生成される/etc/resolv.conf
ファイルの内容は次のとおりです:
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.30.80.1
実際のニーズは、WSL2 の内部をネットワークに接続し続けることであり、固定 IP を設定する必要はないため、特にvEthernet (WSL)
をコマンドラインで設定する方法はわかりません。
# WSL2の内部ネットワークを設定し、設定ファイルに書き込む
# WSL2に静的IPアドレスを設定する - 知乎
# https://zhuanlan.zhihu.com/p/380779630
sudo ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0
sudo ip addr add 192.168.50.2/24 broadcast 192.168.50.255 dev eth0
sudo ip route add 0.0.0.0/0 via 192.168.50.1 dev eth0
sudo echo nameserver 192.168.50.1 > /etc/resolv.conf
# 設定を/etc/wsl.confに書き込む
# sudo echo -e "[user]" > /etc/wsl.conf
# sudo echo -e "default = wdssmq" >> /etc/wsl.conf
sudo echo -e "[network]" >> /etc/wsl.conf
sudo echo -e "generateResolvConf = false" >> /etc/wsl.conf
これで上記のコマンドは理論的には 1 回だけ実行すればよいはずです...
次に、powershell
で次のコマンドを実行して、vEthernet (WSL)
の IP を固定します:
# WSL2に静的IPアドレスを設定する - 知乎
# https://zhuanlan.zhihu.com/p/380779630
Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False
New-NetIPAddress -IPAddress 192.168.50.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'
Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False
New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 192.168.50.0/24;
WSL2 内部ネットワークのテスト#
# ネットワークの接続テスト
ping -c 1 baidu.com
# IPの表示
ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1
# 192.168.50.2/24
# ルートの表示
ip route show
# default via 192.168.50.1 dev eth0
# 192.168.50.0/24 dev eth0 proto kernel scope link src 192.168.50.2
保存#
過程で見つけたり試したりしたさまざまなコマンドはよくわからないので、一応記録しておきます:
Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPAddress
Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPConfiguration
Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPInterface
Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPInterface -Dhcp -- Enabled
Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPInterface -AddressFamily "IPv4"
# ----------------------
# Using PowerShell to Set Static and DHCP IP Addresses – Part 1 | PDQ
# https://www.pdq.com/blog/using-powershell-to-set-static-and-dhcp-ip-addresses-part-1/
$IPType = "IPv4"
$adapter = Get-NetAdapter -IncludeHidden 'vEthernet (WSL)'
$interface = $adapter | Get-NetIPInterface -AddressFamily $IPType
If ($interface.Dhcp -eq "Disabled") {
# Remove existing gateway
If (($interface | Get-NetIPConfiguration).Ipv4DefaultGateway) {
$interface | Remove-NetRoute -Confirm:$false
}
# Enable DHCP
$interface | Set-NetIPInterface -DHCP Enabled
# Configure the DNS Servers automatically
$interface | Set-DnsClientServerAddress -ResetServerAddresses
}