1. NAT模式的工作原理
当您将虚拟机的网络模式设置为NAT时,VMware会在您的Windows宿主机内部创建一个私有的虚拟网络。
- 虚拟NAT设备: VMware会创建一个虚拟的NAT设备(可以想象成一个虚拟路由器)。这个设备的一端连接到您的物理网络,另一端连接到这个私有虚拟网络。
- 虚拟交换机 (VMnet8): 您的Linux虚拟机连接到这个名为VMnet8的虚拟交换机上。
- 私有IP地址: 在这个私有网络里,您的Linux虚拟机会被分配一个私有的IP地址(无论是通过DHCP动态获取还是您手动设置的静态IP)。这个IP地址只在这个虚拟网络内部有效。
- 地址转换: 当您的虚拟机需要访问外部网络(例如上网)时,虚拟NAT设备会将虚拟机发出的网络请求的源IP地址(您的虚拟机的私有IP)转换成您宿主机的物理IP地址,然后再发送出去。对于外部网络来说,所有的请求都像是您的Windows电脑发出的。
2. 为什么只有宿主机可以访问?
正是由于上述的NAT工作原理,导致了只有您的Windows宿主机能够直接连接到您的Linux虚拟机:
- 网络隔离: 您的Linux虚拟机所在的虚拟网络(VMnet8)与您办公室或家庭的局域网是隔离的。局域网内的其他电脑并不知道这个虚拟网络的存在,也不知道如何将数据包路由到您为虚拟机配置的那个静态IP地址。
- 宿主机的特殊角色: 您的Windows宿主机之所以能访问虚拟机,是因为VMware为其创建了一个特殊的虚拟网卡(VMware Network Adapter VMnet8)。这个虚拟网卡连接到了VMnet8虚拟交换机上,所以宿主机和虚拟机实际上是处于同一个虚拟网络中的,彼此之间当然可以通信。
您可以这样理解:您的Linux虚拟机被藏在了您的Windows电脑“背后”,局域网中的其他电脑只能看到您的Windows电脑,看不到里面的虚拟机。
总结
| 网络连接 | 是否可以访问虚拟机 (NAT模式) | 原因 |
|---|---|---|
| 安装VMware的宿主机 | 可以 | 宿主机通过VMware创建的虚拟网卡(VMnet8)直接连接在虚拟网络上。 |
| 局域网内的其他电脑 | 不可以 | 其他电脑处于物理网络中,与虚拟机所在的虚拟网络是隔离的,没有路由可以到达虚拟机的私有IP。 |
如何解决这个问题?
如果您希望局域网内的其他电脑也能访问到您Linux虚拟机上运行的服务(例如网站、数据库等),您有以下两种主要方法:
-
使用端口转发 (Port Forwarding)
这是在NAT模式下让外部设备访问虚拟机的推荐方法。您可以在VMware的“虚拟网络编辑器”中设置端口转发规则。- 原理: 将您Windows宿主机的某个端口(例如8080端口)映射到您Linux虚拟机的IP地址和服务的端口(例如80端口)。
- 访问方式: 之后,其他电脑就可以通过访问 http://<您的Windows主机IP>:8080 来访问到您虚拟机里的网站服务了。
-
切换到桥接模式 (Bridged Mode)
- 原理: 在桥接模式下,VMware会把您的虚拟机直接连接到您所在的物理局域网上。 您的虚拟机将不再隐藏在宿主机后面,而是会像局域网内一台真实的、独立的电脑一样,从您的路由器获取一个IP地址。
- 优点: 配置简单,虚拟机在网络中是完全可见的,局域网内所有设备都可以直接通过虚拟机的IP地址访问它。
- 缺点: 虚拟机会占用您局域网内的一个IP地址。
操作步骤:切换到桥接模式
请按照以下步骤操作,让您的Linux虚拟机加入到局 vực网中。
第1步:关闭您的Linux虚拟机
在进行网络模式更改之前,请务必先将虚拟机彻底关机(Shutdown),而不是挂起(Suspend)。
第2步:在VMware中更改网络模式
- 打开VMware Workstation。
- 在左侧的虚拟机列表中,右键点击您的Linux虚拟机,选择“设置 (Settings)”。
- 在弹出的“虚拟机设置”窗口中,选择“网络适配器 (Network Adapter)”。
- 在右侧的“网络连接”部分,选择“桥接模式(B): 直接连接到物理网络 (Bridged: Connected directly to the physical network)”。
- (可选但推荐) 勾选“复制物理网络连接状态 (Replicate physical network connection state)”。
- 点击“确定”保存设置。
第3步:为虚拟机规划一个新的静态IP
这是最关键的一步。之前您设置的静态IP是给NAT模式的虚拟网络用的,现在虚拟机要加入物理局域网,就需要一个与您的物理局域网匹配的IP地址。
-
查看您Windows主机的网络信息:
-
在Windows上,按下 Win + R 键,输入 cmd 并回车,打开命令提示符。
-
输入命令 ipconfig /all 并回车。
-
找到您正在使用的物理网卡(通常是“以太网适配器”或“无线局域网适配器”),记下以下信息:
- IPv4 地址 (IPv4 Address): 例如 192.168.1.100
- 子网掩码 (Subnet Mask): 例如 255.255.255.0
- 默认网关 (Default Gateway): 例如 192.168.1.1
- DNS 服务器 (DNS Servers): 例如 192.168.1.1 或其他地址
-
-
确定给Linux虚拟机的新IP:
- 您需要为虚拟机选择一个在同一个网段且未被其他设备使用的IP地址。
- 根据上面的例子,您的网络是 192.168.1.x 网段。您可以选择一个比较大的数字,以避免和路由器自动分配的IP冲突,例如 192.168.1.150。
- 您可以在Windows的命令提示符里用 ping 192.168.1.150 来测试一下这个IP是否已经被占用。如果显示“请求超时”或“目标主机不可达”,则说明该IP很可能是空闲的。
第4步:在Linux系统中配置新的静态IP
-
启动您的Linux虚拟机。
-
登录系统,修改网络配置文件。这个文件的位置因Linux发行版而异:
-
对于Ubuntu 18.04及更新版本 (使用netplan):
- 配置文件通常在 /etc/netplan/ 目录下,文件名可能是 01-netcfg.yaml 或类似的。
- 使用编辑器打开它:sudo nano /etc/netplan/01-netcfg.yaml
- 修改内容如下(请根据您第3步记录的信息修改):
codeYaml
network: ethernets: ens33: # 注意:您的网卡名可能是ens33, eth0等,请保持不变 dhcp4: no addresses: [192.168.1.150/24] # 您的新静态IP,/24代表子网掩码255.255.255.0 gateway4: 192.168.1.1 # 您的网关 nameservers: addresses: [192.168.1.1, 114.114.114.114] # 您的DNS服务器 version: 2- 保存文件后,应用配置:sudo netplan apply
-
对于CentOS/RHEL或旧版Ubuntu (使用ifcfg):
- 配置文件通常是 /etc/sysconfig/network-scripts/ifcfg-eth0 (或 ifcfg-ens33)。
- 使用编辑器打开它:sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
- 修改或添加以下内容:
codeCode
BOOTPROTO="static" IPADDR="192.168.1.150" # 您的新静态IP NETMASK="255.255.255.0" # 您的子网掩码 GATEWAY="192.168.1.1" # 您的网关 DNS1="192.168.1.1" # 您的DNS DNS2="114.114.114.114"- 保存文件后,重启网络服务:sudo systemctl restart network
-
第5步:测试连接
-
在Linux虚拟机内:
- 尝试 ping www.baidu.com 看看是否能上网。
- 尝试 ping <您的网关IP> (例如 ping 192.168.1.1) 看看是否能连接到路由器。
-
在局域网的其他电脑上:
- 打开命令提示符或终端。
- 尝试 ping <您的Linux虚拟机新IP> (例如 ping 192.168.1.150)。
- 如果能够ping通,恭喜您!现在局域网内的所有电脑都可以通过 192.168.1.150 这个IP地址来访问您的虚拟机了。