沉冰浮水

沉冰浮水

做最终到的事,成为最终成为的人!
github
bilibili
mastodon
zhihu
douban

「WSL2_ノート」WSL2のネットワーク設定など

前提条件#

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) を非表示にする方法は? - 知乎

https://www.zhihu.com/question/571415099

探索#

前のチュートリアルでは、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
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。