-
-
Save daehahn/497fa04c0156b1a762c70ff3f9f7edae to your computer and use it in GitHub Desktop.
# 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'); | |
} |
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.
@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.
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?
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
@chorongi I think this will work.
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0
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';
}
Works but only for a minute. The connection suddenly closes after a short while