Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
WSL2 Port forwarding port to linux
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if( $found ){
$remoteport = $matches[0];
} else{
echo "The Script Exited, the ip address of WSL 2 cannot be found";
exit;
}
#[Ports]
#All the ports you want to forward separated by coma
$ports=@(80,443,10000,3000,5000);
#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";
#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";
#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
@nathanredblur

This comment has been minimized.

Copy link

@nathanredblur nathanredblur commented May 6, 2020

Nice, thank you!

@YankeeTube

This comment has been minimized.

Copy link

@YankeeTube YankeeTube commented Jun 15, 2020

good! it works! tk!

@xmeng1

This comment has been minimized.

Copy link
Owner Author

@xmeng1 xmeng1 commented Jun 15, 2020

btw, this script comes from original comment:
microsoft/WSL#4150 (comment)

@Immick

This comment has been minimized.

Copy link

@Immick Immick commented Jul 14, 2020

Well, the script actually doesn't work: after executing the above script (exactly as it was posted) I don't see any additional rules at Windows firewall and port forwarding doesn't work. Also I've tried to completely turn off Windows firewall - still no effect.
Any help please?

@mikedixson

This comment has been minimized.

Copy link

@mikedixson mikedixson commented Aug 8, 2020

Note the above only works with IPv4. I needed my host to be exposed on it's ipv6 address so I have to run the following
netsh interface portproxy add v6tov4 listenport=4433 listenaddress=2001:0db8:85a3:0000:0000:8a2e:0370:7334 connectaddress=172.31.110.132 connectport=4433

@luizwhite

This comment has been minimized.

Copy link

@luizwhite luizwhite commented Oct 17, 2020

I saw this script everywhere, but cant solve my problem unfortunately..

I have the same issue that @jmpp
https://stackoverflow.com/questions/61002681/connecting-to-wsl2-server-via-local-network#comment113484398_63781351

but my phone is Android
I just cant connect from my device, only the WSL2 host, as localhost or the WSL2 eth0 address

help please!

@lioaslan

This comment has been minimized.

Copy link

@lioaslan lioaslan commented Dec 25, 2020

@luizwhite you're not alone :)))

@jayagami

This comment has been minimized.

Copy link

@jayagami jayagami commented Jan 9, 2021

you can obtain ip with:

wsl hostname -I
@slaughtering

This comment has been minimized.

Copy link

@slaughtering slaughtering commented Feb 15, 2021

$remoteport to $wsl2_ip maybe better naming?

@wadewadewadewadewadewade

This comment has been minimized.

Copy link

@wadewadewadewadewadewade wadewadewadewadewadewade commented Mar 20, 2021

you can obtain ip with:

wsl hostname -I

Am I doing something wrong if I get 172.24.128.1 from wsl hostname -I from Windows, and 172.24.137.181 from ifconfig in WSL2 (Ubuntu)?

@jayagami

This comment has been minimized.

Copy link

@jayagami jayagami commented Apr 6, 2021

you can obtain ip with:

wsl hostname -I

Am I doing something wrong if I get 172.24.128.1 from wsl hostname -I from Windows, and 172.24.137.181 from ifconfig in WSL2 (Ubuntu)?

Well, in my case, wsl hostname -I and ip addr can get the same ip address.

@wadewadewadewadewadewade

This comment has been minimized.

Copy link

@wadewadewadewadewadewade wadewadewadewadewadewade commented Apr 6, 2021

Thanks @jayagami!

As it turned out, I had two WSL installs: Legacy and Ubuntu; i was using Ubuntu but Legacy was set to default with I ran wsl --list. I used wsl --set-default "Ubuntu" and that let wsl hostname -I tell me the correct IP!

wojtow helped me in this comment thread: https://superuser.com/questions/1586386/how-to-find-wsl2-machines-ip-address-from-windows/1603307?noredirect=1#comment2502448_1603307

Thanks to both of you though!

@jayagami

This comment has been minimized.

Copy link

@jayagami jayagami commented Apr 6, 2021

Thanks @jayagami!

As it turned out, I had two WSL installs: Legacy and Ubuntu; i was using Ubuntu but Legacy was set to default with I ran wsl --list. I used wsl --set-default "Ubuntu" and that let wsl hostname -I tell me the correct IP!

wojtow helped me in this comment thread: https://superuser.com/questions/1586386/how-to-find-wsl2-machines-ip-address-from-windows/1603307?noredirect=1#comment2502448_1603307

Thanks to both of you though!

You're welcome, glad you have it solved.

@HarryCaveMan

This comment has been minimized.

Copy link

@HarryCaveMan HarryCaveMan commented May 5, 2021

The script did not work for me for as is because I have WSL installed for a non-admin user and not for the admin, so I had to run the wsl bash commands as the user with WSL and then pass the values to a process to run as admin and do the firewall bits... This one works if you are in my situation (the sleep is there just so you can see the rule output before the subprocess shell despawns):

$remoteport = wsl hostname -I
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]

#All the ports you want to forward separated by coma
$ports=@(3000,5000,8080);

#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";
Write-Host $ports_a
Write-Host $remoteport
Write-Host $addr

#[Script]
$script = {
  function run([string]$ports_a,[string]$remoteport,[string]$addr){
    #Remove Firewall Exception Rules
    iex \"Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock'\";
    Write-Host $ports_a
    Write-Host $remoteport
    Write-Host $addr
    #adding Exception Rules for inbound and outbound Rules
    iex \"New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock'  -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP\";
    iex \"New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock'  -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP\";

    for( $i = 0; $i -lt $ports.length; $i++ ){
      $port = $ports[$i];
      iex \"netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr\";
      iex \"netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport\";
    }
    Start-Sleep -s 25
  }
}
Start-Process -FilePath powershell.exe -ArgumentList "-Command & {$script run '$ports_a' '$remoteport' '$addr'}" -verb RunAs
@ramsesls

This comment has been minimized.

Copy link

@ramsesls ramsesls commented Sep 1, 2021

Thanks, it works for me after run script run "wsl hostname -I " and use the ip in the address for axios

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment