一、问题现象

  • 环境背景:DVWA 靶场容器运行在 WSL2(Ubuntu) 内部的 Docker 中
  • 预期目标:
    1. 在 Windows 宿主机上通过 局域网 IP(192.168.92.XXX:8080)正常访问靶场。
    2. 配置 Burp Suite(监听端口 8081)能够正常拦截来自 Edge 浏览器的 HTTP/HTTPS 流量。
  • 实际表现:
    • 浏览器通过 http://127.0.0.1:8080 访问正常。
    • 浏览器通过 http://192.168.92.XXX:8080 访问返回 “连接被拒绝”。
    • Burp Suite 的 Proxy -> HTTP history 中无法捕获到任何流向 127.0.0.1:8080 的请求。

二、问题定位与分析

2.1 网络监听绑定状态不一致(核心原因)

在 WSL2 内部 执行端口监听检查:

ss -tlnp | grep 8080

输出:

LISTEN 0      4096          0.0.0.0:8080       0.0.0.0:*
LISTEN 0      4096             [::]:8080          [::]:*
  • 结论:Docker 容器已正确绑定 WSL2 虚拟机的所有网卡(0.0.0.0),容器内部服务运行正常。

在 Windows 宿主机(PowerShell/CMD) 执行端口监听检查:

netstat -ano | findstr :8080

输出:

TCP    127.0.0.1:8080         0.0.0.0:0              LISTENING       27712
TCP    [::1]:8080             [::]:0                 LISTENING       27712
  • 结论:Windows 端仅监听了 127.0.0.1(环回地址),未绑定 0.0.0.0。
  • 根因分析:微软 WSL2 的架构中,wslhost.exe 进程负责将 WSL2 虚拟机内的端口代理转发到 Windows 宿主机。默认情况下,该代理仅映射至宿主机的 127.0.0.1,不映射至局域网网卡(192.168.x.x)。因此,外部或局域网 IP 的请求无法被路由进 WSL2 内部。

2.2 浏览器硬编码代理绕过机制

Chromium 内核浏览器(Edge/Chrome)对 127.0.0.1 和 localhost 存在硬编码白名单,强制绕过系统代理。即便系统代理指向 Burp(127.0.0.1:8081),流量也不会进入 Burp,导致抓包失败。

2.3 Windows 防火墙拦截(次要因素)

即使 WSL2 开启转发,Windows Defender 防火墙默认禁止外部 IP(非 127.0.0.1)入站连接至 8080 端口,必须放行策略。


三、解决方案

基于 WSL2 的网络特性,我们不修改 Docker 启动命令,而是通过在 Windows 宿主层 配置 端口转发(Portproxy) 与 防火墙放行策略,将宿主机局域网 IP(0.0.0.0)的流量精准转发至 WSL2 虚拟机的真实 IP。

3.1 获取 WSL2 虚拟机的真实 IP 地址

在 Windows CMD / PowerShell 中执行:

wsl hostname -I

示例输出:172.31.76.23

记下该 IP,此为后续转发的目标地址(本次环境中为 172.31.76.23)。

3.2 添加 Windows 端口转发规则(管理员权限)

以管理员身份打开 CMD,执行:

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=172.31.76.23 connectport=8080

参数释义:

  • listenaddress=0.0.0.0:监听 Windows 所有网卡(包括 127.0.0.1 和 192.168.92.XXX)。
  • connectaddress=172.31.76.23:将流量转发至 WSL2 虚拟机的实际 IP。

3.3 配置 Windows 防火墙放行入站端口(管理员权限)

继续在管理员 CMD 执行:

netsh advfirewall firewall add rule name="WSL2_DVWA_8080" dir=in action=allow protocol=TCP localport=8080 profile=any

该命令确保无论当前网络类型(域/专用/公用),入站 TCP 8080 端口的流量均被放行。

3.4 验证转发配置是否生效

执行以下命令查看已配置的转发规则:

netsh interface portproxy show all

若输出中包含 0.0.0.0:8080 -> 172.31.76.23:8080,则配置成功。


四、验证结果

  1. 连通性验证:打开 Edge 浏览器访问 http://192.168.92.XXX:8080,DVWA 登录页面正常加载。
  2. Burp 抓包验证:配置系统代理为 127.0.0.1:8081,刷新页面。Burp Suite Proxy -> HTTP history 中成功捕获到 192.168.92.XXX 的请求条目,抓包功能恢复正常。
  3. 端口监听状态:再次执行 netstat -ano | findstr :8080,可见新增 TCP 0.0.0.0:8080 监听项,表明 Windows 已具备对外提供服务的能力。

五、附录:临时清理及安全建议

如果靶场使用完毕,建议及时清理环境以防内网非授权访问:

  1. 删除端口转发规则(管理员 CMD):
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0
  1. 删除防火墙规则(管理员 CMD):
netsh advfirewall firewall delete rule name="WSL2_DVWA_8080"

报告总结:本次故障系 WSL2 特殊的网络地址转换(NAT)机制导致 Windows 宿主机无法将局域网 IP 请求路由至 WSL2 内部,通过 netsh portproxy 建立 IP 层转发后问题彻底解决。

更多推荐