This is the multi-page printable view of this section. Click here to print.
environment
Windows Subsystem Linux(WSL)
- _index
WSL Mirrored Network Mode Configuration Guide
Version Requirements
Current version status:
- Latest stable: 2.5.9 (known networking issues)
- Recommended version: 2.6.0 preview (full mirrored mode support)
Mode Comparison Analysis
Feature | bridge mode (deprecated) | mirrored mode (recommended) |
---|---|---|
Protocol architecture | Dual-stack | Shared stack |
IP address allocation | Independent IP (Windows + WSL) | Shared host IP |
Port resources | Separate | Shared ports (conflict-avoidance required) |
Network performance | Relatively heavy | Lightweight & efficient |
Configuration complexity | Simple | Requires deep firewall policy setup |
Standard Configuration Steps
1. Network Mode Settings
Configure the base mode via WSL Settings app:
- Open the Settings app
- Select the Network tab
- Set network mode to Mirrored
- Apply the configuration and restart WSL
2. Firewall Policy Configuration
Run the complete policy configuration via PowerShell:
# Define the WSL VM GUID
$wslGuid = '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}'
# Configure firewall policies (execute in order)
Set-NetFirewallHyperVVMSetting -Name $wslGuid -Enabled True
Set-NetFirewallHyperVVMSetting -Name $wslGuid -DefaultInboundAction Allow
Set-NetFirewallHyperVVMSetting -Name $wslGuid -DefaultOutboundAction Allow
Set-NetFirewallHyperVVMSetting -Name $wslGuid -LoopbackEnabled True
Set-NetFirewallHyperVVMSetting -Name $wslGuid -AllowHostPolicyMerge True
# Verify configuration results
Get-NetFirewallHyperVVMSetting -Name $wslGuid
3. Port Mapping Validation
# Example: Check port 80 usage
Get-NetTCPConnection -LocalPort 80
Common Issue Troubleshooting
Issue 1: External Connections Fail
- Check step: All fields returned by
Get-NetFirewallHyperVVMSetting
should be True/Allow - Solution: Re-run the firewall policy configuration commands in order
Issue 2: Port Conflicts
- Check method: Use
netstat -ano
to view port usage - Handling advice: Prefer to release ports occupied by Windows, or change the listening port in the WSL service
Validation Steps
- Start your WSL service (e.g., Nginx/Apache)
- Access from Windows host:
http://localhost:<port>
- Access from LAN devices:
http://<host-ip>:<port>
References
wsl
Configure wsl
Remote access ssh
wsl
sudo apt install openssh-server
sudo nano /etc/ssh/sshd_config
/etc/ssh/sshd_config
...STUFF ABOVE THIS...
Port 2222
#AddressFamily any
ListenAddress 0.0.0.0
#ListenAddress ::
...STUFF BELOW THIS...
windows
service ssh start
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.23.129.80 connectport=2222
netsh advfirewall firewall add rule name="Open Port 2222 for WSL2" dir=in action=allow protocol=TCP localport=2222
netsh interface portproxy show v4tov4
netsh int portproxy reset all
Configure wsl
https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configuration-setting-for-wslconfig
Set-Content -Path "$env:userprofile\\.wslconfig" -Value "
# Settings apply across all Linux distros running on WSL 2
[wsl2]
# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=2GB
# Sets the VM to use two virtual processors
processors=2
# Specify a custom Linux kernel to use with your installed distros. The default kernel used can be found at https://github.com/microsoft/WSL2-Linux-Kernel
# kernel=C:\\temp\\myCustomKernel
# Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6
# kernelCommandLine = vsyscall=emulate
# Sets amount of swap storage space to 8GB, default is 25% of available RAM
swap=1GB
# Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx
swapfile=C:\\temp\\wsl-swap.vhdx
# Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free
pageReporting=false
# Turn off default connection to bind WSL 2 localhost to Windows localhost
localhostforwarding=true
# Disables nested virtualization
nestedVirtualization=false
# Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging
debugConsole=true
"
Virtual Memory Disk Setup
- Virtual Memory Disk Setup
Virtual Memory Disk Setup
Redirect Browser Cache to Virtual Disk
# Use ImDisk to create a virtual disk
# The following command creates a 4 GB virtual disk and mounts it as M: drive
imdisk -a -s 4G -m M: -p "/fs:ntfs /q /y"
rd /q /s "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Cache"
rd /q /s "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Code Cache"
md M:\Edge_Cache\
md M:\Edge_CodeCache\
mklink /D "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Cache" "M:\Edge_Cache\"
mklink /D "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Code Cache" "M:\Edge_CodeCache\"
# Restore browser cache to default location
rd "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Cache"
rd "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Code Cache"
md "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Cache"
md "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default\Code Cache"
# Unmount the virtual disk
# To remove the virtual disk, use the following command
imdisk -D -m M:
vs-remote-debug
remote debug with visual studio
Remote debugging C++: https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging-cpp?view=vs-2019
Attach debugging: https://docs.microsoft.com/en-us/visualstudio/debugger/attach-to-running-processes-with-the-visual-studio-debugger?view=vs-2019
Configure co-debugging program as a service: https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging?view=vs-2019#bkmk_configureService
How to configure launch parameters: https://stackoverflow.com/questions/6740422/visual-studio-remote-debugging-a-service
Available parameters: https://social.msdn.microsoft.com/Forums/vstudio/en-US/174c2039-b316-455a-800e-18c0d93b74bc/visual-studio-2010-remote-debugger-settings-dont-persist?forum=vsdebug
Add your own task
"C:\Program Files\Microsoft Visual Studio 16.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe"
Launch parameters
/noauth /anyuser /port:4045 /nosecuritywarn /timeout 360000
Dev machine connect: test0.example.com:4045
Remote access (developer mode must be enabled first): http://test0.example.com:50080/