VMware的虚拟网络拓扑原理

问题已经解决清楚, 下面记录的是我试图解决的一些过程.

顺便再来分享下过程中学习到的VMware各种上网模式的一些拓扑和原理

从这个奇怪的问题切入

大前提: 宿主机连入Internet. 基本上的每一次操作都重启服务和虚拟机.

问题是这样子的, 当前我的VMware虚拟网络配置是:

vmware_conf

如你所见, 配置的IP地址段是192.168.16.2-192.168.16.254. 并且使用nat方式.

在命令行中能查看到这个虚拟网卡的相关信息, 能看到它的MAC地址是: 00-50-56-C0-00-08.

ipconfig_conf

接下来 我给我的CentOS7主机所配置的网卡就是上述的这一张, 如你所见:

centos_conf

而主机的配置也是标准的配置文件 但是没有声明HWADDR, 在NetworkManager的管理:

centos-ifcfg_conf

接下来一系列看起来很奇怪的事情就发生了.

首先我们通过tty登录进虚拟机, 查看下当前的一些网络属性:

nmcli_conf

可以看到 当前的网关地址192.168.16.1对应的网卡地址(MAC)是00-50-56-f8-7b-b1. 而本机的MAC地址是00-0c-29-d6-b2-26.

这里有一点疑问:

netadapter_conf

我明明配置的本机网卡MAC地址是上图那样子的, 可是结果却不是 不知道是为什么.

接着我们自然是想要测试一下是否可以连通Internet:

ping1_result

这个是百度的一个公网地址, 可以看到是没啥问题的.

接下来就有趣了, 我们通过宿主机上的Xshell来进行连接使用 毕竟通过远程连接操作起来更方便嘛~

然后登进去之后虚拟机就不能连通到Internet了 !

ping2_result

经过一系列的尝试 我初步把问题定位在了ARP上, 因为连接前后发生的最大的变化就是网关地址的硬件地址:

来自未来: 这图炸了 找不到原图了, 懒得复现这个问题了...

你应该也发现了, 经过了宿主机的连接之后 新的网关地址的硬件地址变成了我们VMnet8的硬件地址:

win_info

到这里有点神奇, 不过能确定的一点是, 这个VMnet8能够使得我们的宿主机和虚拟机进行通信, 但是虚拟机自己的internet连接并不是通过VMnet8来实现的.

不过到这里, 通过之前学到的一些网络排错知识, 已经知道问题的所在了, 那就是IP地址重复了, 换句话说, 我们的网关地址配置和宿主机的IP地址重合了, 这就导致arp的结果发生错乱以及MAC地址重写导致虚拟机无法把数据包发送出去了.

经过将网关地址修改成另外一个值, 我们成功解决了这一个看起来有点奇怪的问题.

VMware的虚拟网络拓扑和原理

那么经过这次的问题之后, 自然我们得知道VMware是怎么控制虚拟机的网络拓扑的. 现在就VMware的三种连接方式来说下吧!

Host-only

这一种看起来是最简单的一种, 从host-only模式来先说!

vmware_hostonly

在这种模式下, 我们的虚拟机以及配置的DHCP服务器全部都连接到由VMware所维护的一个虚拟交换机上, 可以看到, 在Windows网络适配器管理里面看到的那张VMnet1网卡其实就是隔断主机网络和VMware虚拟机网络的屏障了, 各个虚拟机通过VMnet1与主机进行通信, 但是没有办法通过连接主机网卡来访问互联网.

那么你可能会有疑问, 如果我们配置成Host-only模式, 但是我们通过某种手段来把主机的网卡和VMnet1网卡进行桥接, 换句话说就是将主机网卡共享给VMnet1, 那我们的主机不是就可以向我们的主机一样 连通Internet了吗!

没错, 这确实可行, 而且其实这几乎就是VMware的NAT实现方式, 只不过有一点点的小不同.

NAT

vmware_nat

依然, 在NAT模式下, 虚拟机们还是连通道一个虚拟交换机上, 而这一次和之前不同的是, 我们多了一个虚拟的用来实现NAT功能的模块, 不仅如此, 这个模块与宿主机的网卡相连接, 从而可以让虚拟机通过这条连接访问到互联网, 值得注意的是, 虚拟机和主机的通信仍然是依靠那个VMnet网卡来进行的.

随后我们再来看一下最易实现的一种网络连接方式 – 桥接

桥接

vmware_bridge

看! 当我们使用桥接的时候, 其实就是简单的在我们宿主机的网卡和我们虚拟交换机之间搭建了一条虚拟网桥来共享数据连接, 在这种模式下, 虚拟机访问宿主机和访问外网都通过这个网桥来进行.