You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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" }
}

关键修复点说明

  1. 修正地址参数:所有规则使用-LocalAddress $ipAddress,精准限制WSL2本地IP的流量。
  2. 添加UDP DNS支持:单独创建允许DNS的规则,同时支持UDP和TCP 53端口,解决解析失败问题。
  3. 优化IP获取:通过wsl -d Ubuntu -e hostname -I直接获取WSL2的IP,避免依赖日志文件的不可靠性。
  4. 规则清理:先删除旧规则再创建新规则,避免规则冲突导致的异常。
  5. 逻辑顺序调整:先创建允许规则,再创建兜底阻止规则,确保允许规则优先匹配。

验证步骤

  1. 以管理员权限运行修复后的PowerShell脚本。
  2. 进入WSL2终端,执行nslookup archive.ubuntu.com验证DNS解析是否正常。
  3. 执行sudo apt update验证能否正常访问更新站点。

内容的提问来源于stack exchange,提问作者ShekelsBot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:49:52