WSL2沙箱环境:Windows10下防火墙规则脚本配置故障排查
WSL2 网络限制脚本修复方案
问题场景
Windows10环境下需限制WSL2网络访问,因无法通过Intune管理WSL2,编写脚本获取WSL2接口IP并创建防火墙规则,仅允许Ubuntu更新站点通信。但配置规则后WSL2无法解析DNS,也无法访问白名单站点,移除规则后恢复正常。
错误原因排查
- 防火墙规则地址参数错误:原脚本中阻止规则使用
-RemoteAddress $ipAddress,实际应限制WSL2本地IP的流量,需改为-LocalAddress $ipAddress。 - DNS协议支持缺失:DNS解析默认使用UDP 53端口,原规则仅允许TCP协议,未开放UDP 53,导致DNS请求被阻断。
- WSL IP获取方式不可靠:依赖日志文件提取IP易出错,可直接通过WSL命令或网络适配器获取准确IP。
- 规则逻辑顺序问题:允许规则需覆盖必要协议(TCP/UDP)及端口,且阻止规则应作为兜底规则。
修复后的完整脚本
# 定义允许的站点和DNS服务器 $allowedSites = @( # DNS服务器 "172.29.144.1", "8.8.8.8", # Ubuntu更新站点IP "91.189.91.81", "185.125.190.36", "185.125.190.39", "91.189.91.83", "91.189.91.82", "185.125.190.80" ) # 获取WSL2接口 $wsl2Interface = Get-NetAdapter | Where-Object { $_.InterfaceAlias -like "*WSL*" } # 获取WSL2本地IP(更可靠的方式:直接从WSL获取) $ipAddress = wsl -d Ubuntu -e hostname -I | ForEach-Object { $_.Split(' ')[0] } # 防火墙规则创建函数 function Configure-WSLFirewall { param( [string]$localIp, [string[]]$allowedDestinations, [string]$interface ) # 先删除已存在的同名规则,避免重复创建 Get-NetFirewallRule -DisplayName "*WSL*" | Remove-NetFirewallRule -ErrorAction SilentlyContinue # 允许出站DNS请求(UDP+TCP 53) New-NetFirewallRule -DisplayName "WSL Allow DNS" ` -Direction Outbound ` -LocalAddress $localIp ` -InterfaceAlias $interface ` -RemotePort 53 ` -Protocol UDP,TCP ` -Action Allow ` -Profile Any ` -Description "Allow WSL2 to resolve DNS" # 允许出站到更新站点的HTTP/HTTPS(TCP 80/443) foreach ($site in $allowedDestinations | Where-Object { $_ -match '^\d+\.\d+\.\d+\.\d+$' }) { New-NetFirewallRule -DisplayName "WSL Allow Outbound to $site" ` -Direction Outbound ` -LocalAddress $localIp ` -InterfaceAlias $interface ` -RemoteAddress $site ` -RemotePort 80,443 ` -Protocol TCP ` -Action Allow ` -Profile Any ` -Description "Allow WSL2 to access Ubuntu update site" } # 兜底规则:阻止WSL2所有出站流量(除上述允许规则) New-NetFirewallRule -DisplayName "WSL Block All Outbound" ` -Direction Outbound ` -LocalAddress $localIp ` -InterfaceAlias $interface ` -Action Block ` -Profile Any ` -Description "Block all outbound traffic from WSL2 except allowed destinations" # 兜底规则:阻止WSL2所有入站流量 New-NetFirewallRule -DisplayName "WSL Block All Inbound" ` -Direction Inbound ` -LocalAddress $localIp ` -InterfaceAlias $interface ` -Action Block ` -Profile Any ` -Description "Block all inbound traffic to WSL2" } # 执行配置 if ($wsl2Interface -and $ipAddress) { Write-Host "Configuring firewall for WSL2 IP: $ipAddress on interface: $($wsl2Interface.InterfaceAlias)" Configure-WSLFirewall -localIp $ipAddress -allowedDestinations $allowedSites -interface $wsl2Interface.InterfaceAlias } else { if (-not $wsl2Interface) { Write-Host "WSL2 interface not found" } if (-not $ipAddress) { Write-Host "Failed to get WSL2 IP address" } }
关键修复点说明
- 修正地址参数:所有规则使用
-LocalAddress $ipAddress,精准限制WSL2本地IP的流量。 - 添加UDP DNS支持:单独创建允许DNS的规则,同时支持UDP和TCP 53端口,解决解析失败问题。
- 优化IP获取:通过
wsl -d Ubuntu -e hostname -I直接获取WSL2的IP,避免依赖日志文件的不可靠性。 - 规则清理:先删除旧规则再创建新规则,避免规则冲突导致的异常。
- 逻辑顺序调整:先创建允许规则,再创建兜底阻止规则,确保允许规则优先匹配。
验证步骤
- 以管理员权限运行修复后的PowerShell脚本。
- 进入WSL2终端,执行
nslookup archive.ubuntu.com验证DNS解析是否正常。 - 执行
sudo apt update验证能否正常访问更新站点。
内容的提问来源于stack exchange,提问作者ShekelsBot
相关产品推荐
相关产品推荐

