我在WINDOWS10的安装了VM虚拟机,虚拟机通过NAT网络模式里又装了一个WIN10系统,在虚拟机的WIN10系统里又通过WSL2安装了一个UBUNTU子系统,安装VM虚拟机的IP为192.168.2.14,虚拟机里的WIN10系统的IP为192.168.60.30,虚拟机里WIN10的UBUNTU子系统IP为172.21.229.20。然后我在UBUNTU子系统里安装了一些服务,我要怎么通过同局域网的手机访问到UBUNTU子系统上的服务?

要实现手机访问嵌套在VM虚拟机内WSL2 Ubuntu子系统的服务,需配置三层端口转发和防火墙规则。
整体路径为:手机 → 物理机 → VM虚拟机Win10 → WSL2 Ubuntu。以下是具体步骤:
🔧 一、配置WSL2到虚拟机Win10的端口转发
在虚拟机内的Win10系统中操作:
- 以管理员身份打开PowerShell
- 执行端口转发命令 (以Ubuntu服务端口80为例):
powershell
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=172.21.229.20
8080:虚拟机Win10的监听端口80:Ubuntu服务的实际端口(按需替换)
- ##### 开放防火墙端口:
- 进入
高级安全Windows防火墙 → 入站规则 → 新建规则 → 端口 - 允许
TCP协议,端口填写8080(与转发端口一致)
⚙️ 二、配置物理机到VM虚拟机的端口转发
在物理机(192.168.2.14) 中操作:
- ##### 打开VMware虚拟网络编辑器:
- 选择
VMnet8(NAT模式)→ NAT设置 → 添加端口转发
- 添加转发规则: 字段 值 主机端口 9090(物理机端口) 虚拟机IP地址 192.168.60.30(虚拟机Win10的IP) 虚拟机端口 8080(上一步设置的端口)
🔒 三、配置物理机防火墙
在物理机中开放端口:
- 允许物理机的
9090端口(与VMware转发端口一致),方法同步骤一.
📱 四、手机访问服务
手机通过浏览器或工具访问:
http://192.168.2.14:9090 # 物理机IP + 端口
192.168.2.14:物理机IP(宿主机)9090:物理机映射端口
⚠️ 注意事项
- ##### IP变动问题:
- WSL2的IP(
172.21.229.20)重启后会变化,需在虚拟机Win10中定时更新转发命令(可通过开机脚本自动获取WSL2 IP并重置转发)4。
- ##### 多层端口一致性:
- 物理机端口(
9090)→ 虚拟机端口(8080)→ Ubuntu服务端口(如80)需逐层对应。
- ##### 服务协议支持:
- 若服务使用
UDP(如游戏服务),需在防火墙规则中切换协议类型。
最终路径:手机 →
物理机IP:9090→虚拟机IP:8080→WSL2 IP:服务端口。若连接失败,逐层检查端口转发规则和防火墙状态。
Windows 系统
端口转发命令(管理员权限运行):
cmd
netsh interface portproxy add v4tov4 listenport=<外部端口> listenaddress=0.0.0.0 connectport=<内部端口> connectaddress=<内部IP>
如虚拟机内WSL2的UBUNTU子系统IP为172.21.229.160内部服务端口为22,我要通过WIN10虚拟机的监听的端口为22222,
示例
netsh interface portproxy add v4tov4 listenport=22222 listenaddress=0.0.0.0 connectport=22 connectaddress=172.21.229.160
或者最妥当的是
netsh interface portproxy add v4tov4 listenport=22222 listenaddress=0.0.0.0 connectport=22 connectaddress=127.0.0.1
示例:将本机8080端口转发到内网服务器 192.168.1.100:80:
cmd
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.1.100
查看端口转发规则:
cmd
netsh interface portproxy show all
删除端口转发规则:
cmd
netsh interface portproxy delete v4tov4 listenaddress=<监听地址> listenport=<监听端口>
示例:
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0