75

This question is related to my question about making a WSL2 address static. Since that looks like it isn't possible I am trying to come up with a workaround.

I am thinking I can run a shell script in WSL2 at boot that will write the WSL2 machine's address to a file on the host system. A powershell script will look for that file, and when it finds it it will run:

netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=<WSL2 IP>

If possible I'd like to eliminate the need to run a shell script in Linux.

One possibility it via netsh interface ipv4 show neighbors. 172.27.154.150 is the current ip address of my WSL2 machine, but I am not really sure how to write a script to isolate that IP address.

PS C:\Users\Nick> netsh interface ipv4 show neighbors

Interface 1: Loopback Pseudo-Interface 1

Internet Address Physical Address Type


224.0.0.22 Permanent 239.255.255.250 Permanent

Interface 7: Ethernet0

Internet Address Physical Address Type


192.168.163.2 00-50-56-fa-e9-9e Reachable 192.168.163.254 00-50-56-fc-61-94 Reachable 192.168.163.255 ff-ff-ff-ff-ff-ff Permanent 224.0.0.22 01-00-5e-00-00-16 Permanent 224.0.0.251 01-00-5e-00-00-fb Permanent 224.0.0.252 01-00-5e-00-00-fc Permanent 239.255.255.250 01-00-5e-7f-ff-fa Permanent 255.255.255.255 ff-ff-ff-ff-ff-ff Permanent

Interface 19: Bluetooth Network Connection

Internet Address Physical Address Type


224.0.0.22 01-00-5e-00-00-16 Permanent

Interface 14: vEthernet (Default Switch)

Internet Address Physical Address Type


172.21.47.255 ff-ff-ff-ff-ff-ff Permanent 224.0.0.22 01-00-5e-00-00-16 Permanent 224.0.0.251 01-00-5e-00-00-fb Permanent 239.255.255.250 01-00-5e-7f-ff-fa Permanent 255.255.255.255 ff-ff-ff-ff-ff-ff Permanent

Interface 25: vEthernet (WSL)

Internet Address Physical Address Type


172.27.154.150 00-15-5d-f2-6b-94 Stale 172.27.159.255 ff-ff-ff-ff-ff-ff Permanent 224.0.0.22 01-00-5e-00-00-16 Permanent 224.0.0.251 01-00-5e-00-00-fb Permanent 239.255.255.250 01-00-5e-7f-ff-fa Permanent

EDIT: See this answer for the script I wrote to automate starting SSHD in WSL and routing traffic to it

Nick
  • 1,533
  • 2
  • 14
  • 15

5 Answers5

102

From Windows powershell or cmd use the command:

wsl hostname -I

This should return an IP address if WSL is running. It appears to start the default distro if not running, and then return the address of that. (takes a few seconds longer to return)

Note that while this should work for the simple case, it might not work for every distro that you might run inside WSL. In that case, you should consider Hashbrown's answer (which involves a more complicated command, but may work better)

Edit: changed to capital -I option from lowercase

wojtow
  • 1,259
40

For me my WSL has multiple interfaces so hostname isnt appropriate. In this instance you can use this:

wsl -- ip -o -4 -json addr list eth0 `
| ConvertFrom-Json `
| %{ $_.addr_info.local } `
| ?{ $_ }

Change -4 to -6 for ipv6, and eth0 to your interface of choice.


Also, if you need the IP address of the host from the vm you can run this (on the host)

$wsl    = wsl -- ip -o -4 -j addr s eth0 | ConvertFrom-Json | %{ $_.addr_info.local } | ?{ $_ }
$master = (Get-NetIPAddress).IPAddress | ?{ $_ -match ($wsl -replace '^((\d+\.){2}).*$','^$1') }
$wsl,$master #access wsl from master using the first ip, the converse from the latter
Hashbrown
  • 3,338
  • 4
  • 39
  • 51
19

For checking your WSL IP address from the WSL machine:

ip addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
dunxd
  • 1,223
HRX_
  • 199
1

I am using this powershell script "SetDockerHost.ps1" to set my local DOCKER_HOST env variable:

$wslip = ((wsl hostname -I) -split " ")[0]
$dockerhost = "tcp://" + $wslip + ":2375"
setx DOCKER_HOST $dockerhost
Write-Host "Set: setx DOCKER_HOST $dockerhost"
Read-Host -Prompt "Press Enter to exit"
max
  • 111
0

run this on your wsl terminal:

ip add | grep "eth0"
asma
  • 109
  • 3