物理机访问 VMware 虚拟机端口的详细指南
在实际的 IT 运维、开发测试或学习环境中,经常需要从您使用的物理电脑(宿主机)访问运行在 VMware Workstation、VMware Player 或 VMware Fusion 上的虚拟机内部的特定服务端口(如 Web 服务器的 80/443、SSH 的 22、远程桌面的 3389 等),这看似简单,却常因网络配置问题导致连接失败,本文将深入解析其原理并提供多种可靠的实现方法。
理解网络基础:虚拟机如何联网?
VMware 虚拟机主要提供三种网络连接模式,理解它们是成功访问的关键:
-
桥接模式 (Bridged):
- 原理: 虚拟机通过宿主机的物理网卡,直接连接到宿主机所在的物理网络,虚拟机会从物理网络的 DHCP 服务器(如您的路由器)获取一个 IP 地址,就像一台独立的物理机器一样。
- 访问方式: 物理机访问虚拟机端口最直接的方式,在物理机上,直接使用虚拟机在物理网络中获取到的 IP 地址和端口号即可访问(
http://虚拟机IP
或ssh username@虚拟机IP
)。 - 要求: 物理网络中有可用的 IP 地址分配给虚拟机。
-
NAT 模式 (Network Address Translation):
- 原理: VMware 软件在宿主机上创建一个虚拟的 NAT 设备(通常是
VMnet8
网络),虚拟机连接到这个虚拟网络,并从这个虚拟网络的 DHCP 服务获取一个私有 IP 地址(如168.x.x
),虚拟机访问外部网络时,其流量会经过 NAT 转换,源 IP 变为宿主机的 IP 地址。外部网络(包括宿主机)默认无法主动访问 NAT 模式下的虚拟机。 - 访问难题: 这是最常见的配置,也是导致物理机无法直接访问虚拟机端口的主要原因。
- 原理: VMware 软件在宿主机上创建一个虚拟的 NAT 设备(通常是
-
仅主机模式 (Host-Only):
- 原理: 创建一个完全隔离的私有网络(通常是
VMnet1
),仅包含宿主机和所有设置为该模式的虚拟机,虚拟机之间、虚拟机与宿主机之间可以通信,但虚拟机完全无法访问外部网络。 - 访问方式: 宿主机可以直接使用虚拟机在
VMnet1
网络上获取到的 IP 地址和端口号进行访问(ping 虚拟机IP
或访问其 Web 服务)。
- 原理: 创建一个完全隔离的私有网络(通常是
核心挑战:访问 NAT 模式下的虚拟机端口
由于 NAT 模式的默认设计是保护虚拟机免受外部主动访问,我们需要在 VMware 的 NAT 设备上设置端口转发规则,这条规则告诉 VMware:“当宿主机上某个特定端口的连接请求到达时,请将其转发给指定虚拟机的指定端口”。
通过 VMware 虚拟网络编辑器配置端口转发 (推荐)
这是最通用、最可靠的方法,适用于 VMware Workstation Pro, Player 和 Fusion。
- 关闭虚拟机: 在修改网络设置前,建议关闭目标虚拟机。
- 打开虚拟网络编辑器:
- Windows (Workstation/Player): 在 VMware 主界面菜单栏,点击
编辑
->虚拟网络编辑器
。 - macOS (Fusion): 在 VMware Fusion 菜单栏,点击
VMware Fusion
->偏好设置
->网络
,点击锁图标解锁设置。
- Windows (Workstation/Player): 在 VMware 主界面菜单栏,点击
- 选择 NAT 网络: 在虚拟网络编辑器中,选择
VMnet8
(NAT 模式使用的默认网络)。 - 配置 NAT 设置:
- Windows: 点击右下角的
NAT 设置...
按钮。 - macOS: 点击
NAT
模式对应的网络(通常是私人给我的 Mac 和虚拟机共享
),然后点击高级选项
(齿轮图标)->端口转发
。
- Windows: 点击右下角的
- 添加端口转发规则:
- 在打开的
NAT 设置
或端口转发
窗口中,点击添加
。 - 填写端口转发规则:
- 主机端口 (Host Port): 在宿主机上开放哪个端口来接收连接。不能使用宿主机上已被占用的端口(如 80, 443, 22),建议使用大于 1024 的端口(如 8080, 8022, 33389),想通过宿主机的 8080 访问虚拟机的 80,这里填
8080
。 - 类型 (Type): 选择协议类型(
TCP
或UDP
),Web 服务通常选 TCP,DNS 可能选 UDP。 - 虚拟机 IP 地址 (Virtual machine IP address): 输入目标虚拟机的当前在 NAT 网络 (
VMnet8
) 中获取到的 IP 地址。重要! 如果虚拟机使用 DHCP,这个地址可能会变,导致规则失效,建议在虚拟机内将网络配置为静态 IP(在虚拟机操作系统内设置)。 - 虚拟机端口 (Virtual machine port): 虚拟机内部需要访问的服务端口号,访问 Web 服务器填
80
,访问 SSH 填22
。 - 描述 (Description): (可选) 填写规则说明,如 “Web Server Forwarding”。
- 主机端口 (Host Port): 在宿主机上开放哪个端口来接收连接。不能使用宿主机上已被占用的端口(如 80, 443, 22),建议使用大于 1024 的端口(如 8080, 8022, 33389),想通过宿主机的 8080 访问虚拟机的 80,这里填
- 示例规则:
- 宿主机端口:
8080
,类型:TCP
,虚拟机 IP:168.152.128
,虚拟机端口:80
-> 在宿主机浏览器访问http://localhost:8080
即可访问虚拟机 80 端口。 - 宿主机端口:
8022
,类型:TCP
,虚拟机 IP:168.152.128
,虚拟机端口:22
-> 在宿主机终端使用ssh -p 8022 username@localhost
连接虚拟机 SSH。
- 宿主机端口:
- 在打开的
- 保存设置: 点击
确定
/应用
/好
保存所有更改,可能需要管理员权限。 - 启动虚拟机: 启动目标虚拟机。
- 测试访问: 在宿主机上,使用
localhost
或宿主机的0.0.1
或宿主机的实际局域网 IP 地址,加上你设置的主机端口进行访问。- 访问虚拟机 Web:
http://localhost:8080
(或http://宿主机IP:8080
) - SSH 到虚拟机:
ssh -p 8022 username@localhost
(或ssh -p 8022 username@宿主机IP
)
- 访问虚拟机 Web:
在虚拟机操作系统内配置防火墙
如果虚拟机本身的操作系统防火墙(如 Windows Defender 防火墙、Linux 的 iptables
/ufw
)阻止了外部访问,即使网络模式正确或端口转发设置好,访问也会失败。
- Windows 虚拟机:
- 打开“Windows Defender 防火墙与高级安全”。
- 点击“入站规则”。
- 在右侧操作栏点击“新建规则…”。
- 选择“端口”,点击“下一步”。
- 选择
TCP
或UDP
,输入需要开放的虚拟机端口号(如80
,443
,3389
),点击“下一步”。 - 选择“允许连接”,点击“下一步”。
- 选择应用规则的环境(域、专用、公用),通常全选,点击“下一步”。
- 给规则命名(如 “Allow Web Port 80”),点击“完成”。
- Linux 虚拟机 (使用 ufw):
sudo ufw allow 22/tcp # 开放 SSH sudo ufw allow 80/tcp # 开放 HTTP sudo ufw reload # 重新加载规则
- (使用
iptables
命令更底层,但ufw
更易用)。
- (使用
切换到桥接模式 (Bridged)
如果您的物理网络环境允许(有足够的 IP 地址且没有端口限制),这是最省事的方案:
- 关闭虚拟机。
- 在 VMware 中编辑虚拟机设置。
- 找到网络适配器设置。
- 将网络连接模式从
NAT
改为桥接模式
(Bridged)。 - 启动虚拟机。
- 虚拟机将从物理路由器获取一个和宿主机同网段的 IP 地址(如宿主机是
168.1.100
,虚拟机可能获取168.1.101
)。 - 在宿主机上,直接使用虚拟机获取到的这个 IP 地址和端口访问即可(如
http://192.168.1.101
,ssh username@192.168.1.101
)。
使用仅主机模式 (Host-Only) + 共享/代理 (复杂)
适用于完全隔离环境或特殊需求,但虚拟机无法上网,宿主机和虚拟机在 VMnet1
网络内互通,如果需要让虚拟机上网,通常需要在宿主机上设置代理或共享网络连接(如 Windows 的 ICS),配置相对复杂,不如 NAT 或桥接常用。
故障排除:无法访问的常见原因
- 端口转发规则错误: 仔细检查步骤 5 中的四个要素(主机端口、类型、虚拟机IP、虚拟机端口)是否填写正确。虚拟机 IP 地址是否准确且固定?
- 虚拟机防火墙阻止: 确认虚拟机操作系统的防火墙已放行目标端口(见方法二)。
- 虚拟机服务未运行: 确保虚拟机内部的服务(如 Web 服务器、SSH 服务)确实已经启动并在监听目标端口,在虚拟机内部使用
netstat -an | grep LISTEN
(Linux) 或netstat -ano | findstr LISTENING
(Windows) 检查。 - 宿主机防火墙阻止: 检查宿主机操作系统防火墙是否阻止了对设置的主机端口的访问(如 Windows 防火墙阻止了 8080 端口)。
- 主机端口冲突: 确认设置的主机端口在宿主机上没有其他程序在使用,在宿主机上使用
netstat -ano | findstr :8080
(Windows) 或sudo lsof -i :8080
(Linux/macOS) 检查端口占用。 - 网络适配器未连接: 在虚拟机设置中,确保网络适配器处于“已连接”状态。
- 虚拟机网络服务问题: 在 VMware 虚拟网络编辑器中,尝试点击“还原默认设置”(注意这会重置所有网络配置,包括自定义的 NAT/DHCP 设置)。
- IP 地址变更 (DHCP): 这是 NAT 模式端口转发失效的最常见原因,务必在虚拟机内将网络设置为静态 IP(在虚拟机操作系统内配置),确保其 IP 地址与端口转发规则中填写的完全一致且不会改变。
总结与最佳实践建议
- NAT 模式 + 端口转发 (方法一) 是最常用且安全的方案,尤其当物理网络 IP 地址有限或虚拟机需要上网时。务必给虚拟机配置静态 IP 地址。
- 桥接模式 (方法三) 是最简单直接的方案,前提是物理网络环境允许分配额外 IP 地址且没有访问限制。
- 防火墙配置 (方法二) 是任何模式下访问成功的必要条件,务必检查。
- 故障排除 需系统性地从网络模式、端口转发规则、虚拟机服务、虚拟机防火墙、宿主机防火墙、IP 地址稳定性等方面逐一排查。
通过理解 VMware 的网络模型并正确配置端口转发或选择合适的网络模式,您就能可靠地实现从物理机访问虚拟机内部服务的需求,清晰的配置和细致的检查是成功的关键。
引用说明:
- 本文所述 VMware 网络模式(桥接、NAT、仅主机)及虚拟网络编辑器操作,核心概念与操作流程参考自 VMware 官方产品文档(如 VMware Workstation Pro, VMware Fusion 用户手册)中关于网络配置的章节。
- 操作系统防火墙配置(Windows Defender 防火墙, Linux ufw/iptables)遵循各自操作系统的官方管理指南和最佳安全实践。
- 网络诊断命令 (
ping
,netstat
,lsof
,ufw
) 为标准网络工具,其用法和输出解释基于广泛认可的 TCP/IP 网络原理及操作系统手册。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/24445.html