Skip to content

Instantly share code, notes, and snippets.

@daehahn
Last active January 18, 2025 17:43
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');
}
@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

@zpiatt
Copy link

zpiatt commented Sep 3, 2024

I've added the following conditional to prevent an error on initial run.

# Remove and Create NetFireWallRule
$firewallRule = Get-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -ErrorAction SilentlyContinue;

if ($firewallRule) {
    Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock';
}

@Benjaminlooi
Copy link

For me, after countless hours of troubleshooting, I discovered that if you've tried using netsh interface portproxy add v4tov4 to set up port forwarding but it doesn't seem to work, it might be because the IP Helper service isn't running.

To resolve this, ensure the service is started by running:
net start iphlpsvc

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