01. 从物理网络到虚拟网络
著名的「六度分隔定理」说到,世界上任何两个互不相识的人,只需要最多六个人就能够建立起联系。这个定理成立的前提就是依托于庞大的网络结构。
在虚拟化技术没出现之前,构成网络的元素都是实体的物理设备,比如交换机、路由器、网线等等,人们想要构建一个小型的局域网自己玩玩,都要买各种设备,成本高还不灵活。虚拟化技术普及之后,云计算开始大行其道,我们在自己的单机上就可以建各种虚拟机,想怎么玩就怎么玩。
随之而来的就是网络变得更复杂了,由以前看得见摸得着的物理网络一下变成玄乎的虚拟网络了,好不容易建了几台虚拟机,发现网络不通,或者网络通了,但并不知道是怎么通的,这难言的苦水哽在喉咙实在令人不适。
这篇文章就来说说虚拟机世界里的几种网络模型,我们主要以 VirtualBox 和 VMwareWorkstation 这两款目前最主流的桌面虚拟化软件作为例子。
总的来说,目前有四种常见的网络模型:
- 桥接(Bridge Adapter)
- NAT
- 主机(Host-only Adapter)
- 内部网络(Internal)
这也是 VirtualBox 支持的四种模型,对于 VMware,则只有前三种。
下图显示了 VirtualBox 支持的几种网络模型:
图一
02 桥接(Bridge Adapter)
虚拟机桥接网络模型就是使用虚拟交换机(Linux Bridge),将虚拟机和物理机连接起来,它们处于同一个网段,IP 地址是一样的。如下图所示:
在这种网络模型下,虚拟机和物理机都处在一个二层网络里面,所以有:
桥接网络的好处是简单方便,但也有一个很明显的问题,就是一旦虚拟机太多,广播就会很严重。所以,桥接网络一般也只适用于桌面虚拟机或者小规模网络这种简单的形式。
03 NAT
另一种模型是 NAT,即网络地址转换(Network Address Translatation)。这种模型严格来讲,又可以分为 NAT 和 NAT网络两种,我们看上面的图 1 也可以看到。
根据 NAT 的原理,虚拟机所在的网络和物理机所在的网络不在同一个网段,虚拟机要访问物理所在网络必须经过一个地址转换的过程,也就是说在虚拟机网络内部需要内置一个虚拟的 NAT 设备来做这件事。
但其中 NAT 和 NAT网络 两者还有些许的不同:
- NAT:主机上的虚拟机之间是互相隔离的,彼此不能通信(它们有独立的网络栈,独立的虚拟 NAT 设备)
- NAT网络:虚拟机之间共享虚拟 NAT 设备,彼此互通。
如下图,展示了两者细微的差别:
PS:NAT 网络模式中一般还会内置一个虚拟的 DHCP 服务器来进行 IP 地址的管理。
下面我们通过实验来验证一下两种模式的区别,首先是 NAT 模式:
访问外网没问题:
访问其他虚拟机:
可以看到,两个虚拟机由于有隔离的网络栈,所以它们的 IP 地址并不在一个网段,所以 ping 不通。
再来看 NAT网络,访问外网同样没问题,我们来看下 VM 之间的互通:
可以看到,差别体现出来了, NAT网络 虚拟机之间共享网络栈,它们的 IP 地址处于同一个网段,所以彼此是互通的。
总结一下,以上两种 NAT 模式,如果不做其他配置,那么有:
- 虚拟机可以访问主机,反之不行
- 如果主机可以上外网,那么虚拟机也可以
- 对于 NAT,同主机上的虚拟机之间不能互通
- 对于 NAT网络,虚拟机之间可以互通
PS:如果做了 端口映射 配置,那么主机也可以访问虚拟机。
04 主机网络(Host-only Adapter)
主机网络顾名思义,就是只限于主机内部访问的网络,虚拟机之间彼此互通,虚拟机与主机之间彼此互通。但是默认情况下虚拟机不能访问外网(注意:这里说的是默认情况下,如果稍作配置,也是可以的)。
主机网络看似简单,其实它的网络模型是相对比较复杂的,可以说前面几种模式实现的功能,在这种模式下,都可以通过虚拟机和网卡的配置来实现,这得益于它特殊的网络模型。
主机网络模型会在主机中模拟出一块虚拟网卡供虚拟机使用,所有虚拟机都连接到这块网卡上,这块网卡默认会使用网段 192.168.56.x(在主机的网络配置界面可以看到这块网卡),如下是基本的拓扑图示:
默认情况下,虚拟机之间可以互通,虚拟机只能和主机上的虚拟网卡互通,不能和不同网段的网卡互通,更不能访问外网,如果想做到这样,那么需要如图中 红虚线 所示,将物理网卡和虚拟网卡桥接或共享。在主机上做如下设置即可:
通过以上配置,我们来验证一下,虚拟机可以访问主机物理网卡和外网了:
05 内部网络(internal)
***一种网络模型是内部网络,这种模型是相对最简单的一种,虚拟机与外部环境完全断开,只允许虚拟机之间互相访问,这种模型一般不怎么用,所以在 VMware 虚拟机中是没有这种网络模式的。这里我们就不多说了。
06 总结
虚拟机的四种网络模型:桥接、NAT、主机和内网模型。
下面以一张表来描述它们之间的通信行为:
本文转载自微信公众号「 Linux云计算网络(ID:cloud_dev)」,公众号主要专注在 Linux、云计算、网络方面的技术分享,可以通过以下二维码关注。转载本文请联系 Linux云计算网络 公众号。