Skip to content

Instantly share code, notes, and snippets.

@daehahn
Last active June 10, 2024 02:10
Show Gist options
  • Save daehahn/497fa04c0156b1a762c70ff3f9f7edae to your computer and use it in GitHub Desktop.
Save daehahn/497fa04c0156b1a762c70ff3f9f7edae to your computer and use it in GitHub Desktop.
WSL 2 TCP NETWORK FORWARDING
# WSL2 network port forwarding script v1
# for enable script, 'Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope CurrentUser' in Powershell,
# for delete exist rules and ports use 'delete' as parameter, for show ports use 'list' as parameter.
# written by Daehyuk Ahn, Aug-1-2020
# Display all portproxy information
If ($Args[0] -eq "list") {
netsh interface portproxy show v4tov4;
exit;
}
# If elevation needed, start new process
If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
# Relaunch as an elevated process:
Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path),"$Args runas" -Verb RunAs
exit
}
# You should modify '$Ports' for your applications
$Ports = (22,80,443,8080)
# Check WSL ip address
wsl hostname -I | Set-Variable -Name "WSL"
$found = $WSL -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if (-not $found) {
echo "WSL2 cannot be found. Terminate script.";
exit;
}
# Remove and Create NetFireWallRule
Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock';
if ($Args[0] -ne "delete") {
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $Ports -Action Allow -Protocol TCP;
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $Ports -Action Allow -Protocol TCP;
}
# Add each port into portproxy
$Addr = "0.0.0.0"
Foreach ($Port in $Ports) {
iex "netsh interface portproxy delete v4tov4 listenaddress=$Addr listenport=$Port | Out-Null";
if ($Args[0] -ne "delete") {
iex "netsh interface portproxy add v4tov4 listenaddress=$Addr listenport=$Port connectaddress=$WSL connectport=$Port | Out-Null";
}
}
# Display all portproxy information
netsh interface portproxy show v4tov4;
# Give user to chance to see above list when relaunched start
If ($Args[0] -eq "runas" -Or $Args[1] -eq "runas") {
Write-Host -NoNewLine 'Press any key to close! ';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');
}
@woensug-choi
Copy link

woensug-choi commented Feb 16, 2022

It suddenly does not work. It's not catching any of the wsl's IP. I believe it is my problem. Any ideas?

# result of wsl hostname -I
172.19.249.200 172.18.0.1 172.17.0.1
# result of this script
Listen on ipv4:             Connect to ipv4:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         10000       192.168.42.226  10000
0.0.0.0         3000        192.168.42.226  3000
0.0.0.0         5000        192.168.42.226  5000

Solved (not knowing what exactly why):

# shutdown wsl first at cmd
wsl --shutdown
# run this script
./wsl2-network.ps1
# run wsl and restart ssh inside
sudo service ssh restart

@demfabris
Copy link

Works but only for a minute. The connection suddenly closes after a short while

@dezza
Copy link

dezza commented May 17, 2022

I have separate normal and administrator user on Windows, so I can't run wsl as normal user and firewall/portproxy rules as administrator. I haven't found a way where this is possible.

@composite
Copy link

@woensug-choi Just add $WSL = $WSL.split(" ")[0] after $WSL variable definition.
@demfabris You must run any long-running live WSL process like service. sudo service ssh start for example.

@VenRoot
Copy link

VenRoot commented Aug 9, 2022

Trying to use the script at startup of my pc with Task Schedule (without user login)

But it seems that wsl hostname -I returns nothing or an empty string, so the script exits again.

When running the script manually, it works. Any help?

@chorongi
Copy link

Hello I am completely new to powershell. What should I do if I want to remove a proxy?
i.e. from the example from the first comment, what if I want to remove only

0.0.0.0 5000 192.168.42.226 5000

@PM25
Copy link

PM25 commented Sep 26, 2022

@chorongi I think this will work.
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0

reference:
https://learn.microsoft.com/en-us/windows-server/networking/technologies/netsh/netsh-interface-portproxy#delete-v4tov4

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