在配置了网络虚拟化(Overlay)的网络结构中,处于Overlay网络中的虚机数据包的封装和MAC地址学习和传统物理网络(Underlay)相似又不尽相同。除了我们了解Overlay网络需要借助Underlay网络进行二次封装之外,其MAC地址学习过程也相对要曲折一些。这些MAC地址学习过程取决于多种因素:
虚机是否在同一虚拟子网?
虚机是否在同一虚机网络的不同虚拟子网?
虚机是否运行于同一台物理机?
虚机是否运行在不同的物理机?
不同的场景,虚机之间学习对方的MAC地址,以及在互相学习到对方的MAC地址后何封装数据包都不尽相同?接下来我们详细分析以下5种不同场景:
虚机在同一虚拟子网(VSID相同),运行在同一台主机;
虚机在同一虚机网络的不同虚拟子网里(RDID相同,VSID不同),运行在同一台主机;
虚机在同一虚机网络的不同虚拟子网里(RDID相同,VSID不同),运行在不同的主机;
虚机在同一虚拟子网(VSID相同),运行在不同主机,未启用动态地址学习;
虚机在同一虚拟子网(VSID相同),运行在不同主机,启用了动态地址学习;
在上文(http://ichbinleo.blog.51cto.com/11948851/1942694)中讨论了SDN Overlay 网络中虚机数据包的转发的三个场景1),2)和3),今天我们将继续讨论第4)和第5)个场景。有关于微软网络虚拟化HNV的相关概念,如RDID、VSID、虚机网络、虚拟子网、默认网关等,可以参考http://ichbinleo.blog.51cto.com/11948851/1902265 和http://ichbinleo.blog.51cto.com/11948851/1903866 进一步了解 。
本文我们接着第4)个场景,如图1所示。我们在一个虚拟子网里创建了两台虚机,分配了同一个子网(192.168.188.0/24)的IP地址:
VM1的IP地址为192.168.188.2,MAC地址为MACvm1
VM2的IP地址为192.168.188.3,MAC地址为MACvm2
此刻,这两台虚机VM1和VM2运行在不同的物理服务器,未启用动态IP地址学习,那么VM1和VM2之间如何学习对方的MAC地址以及在互相学习到对方的MAC地址后如何封装数据包呢?接下来我们详细地分析这一场景的数据包转发流。
VM1要和VM2通信,需要学习到对方的MAC地址。因此,VM1发送ARP消息查询 VM2 的MAC地址。
Hyper-V虚拟交换机广播ARP到:
所有在本地且VSID为11111的虚机
HNVFilter
HNV Filter将ARP响应转发给VM1,VM1学习到VM2的MAC地址是MACVM2
VM1封装原始数据包,目的IP是VM2的IP地址,目的MAC地址为MACvm2。
原始数据包发送到VM1所在的物理机的Hyper-V虚拟交换机,虚拟交换机获取到VM1所包含的VSID为11111。
Hyper-V虚拟交换机看到MACVM2并不在本地Hyper-V虚拟交换机的记录中,于是将数据包发送给HNV Filter。
HNV Filter检索查找记录,获得目标虚机的VSID是11111,CA地址为192.168.188.3,目标MAC地址为MACVM2,以及对应的PA地址。然后将这些获取到的信息和原始数据包使用NVGRE/VXLAN进行二次封装。
二次封装的数据包通过传输网络发送到目标虚机所在的Hyper-V物理机。
IP地址为10.2.41.206以及MAC地址为MACPA2的Hyper-V物理机接收到数据包,然后发送到自己虚拟交换机的HNV Filter。
HNV Filter拆开封装的包,获取到内原始数据包以及包含了VSID为11111的OOB数据。
HNV Filter将原始数据包发送到具有VSID为11111的Hyper-V虚拟交换机。
Hyper-V虚拟交换机按照访问控制策略将IP数据包发送到目标虚机VM2。
注意:这种场景描述了NVGRE/VXLAN二次封装的过程和较为完整的HNV工作流程,我们需要强调几点:
如果没有启用动态IP地址学习,即使目标虚机不在本地Hyper-V主机上,ARP也是由HNVFilter处理而不会广播到虚拟交换机以外的网络。
在物理链路(也即传输网络)上,物理网络基于外部数据包(PA地址和物理机MAC地址)转发数据包,物理链路对内部原始数据包(CA IP地址和MAC地址)没有察觉。
数据包通过NVGRE/VXLAN进行二次封装,但是封装对于源虚机和目标虚机来说完全是透明的,意味着虚机不能感知到数据的二次封装和拆封。
我们接着第5)个场景,如图2所示。我们在一个虚拟子网里创建了两台虚机,分配了同一个子网(192.168.188.0/24)的IP地址:
VM1的IP地址为192.168.188.2,MAC地址为MACvm1
VM2的IP地址为192.168.188.3,MAC地址为MACvm2
此刻,这两台虚机VM1和VM2运行在不同的物理服务器,和第4个场景不同的是,在VM之间首次通信时,需要启用动态IP地址学习以补充CA和PA以及MAC地址查询表,在有了该查询表以后,虚机之间的通信就和场景4)一样了。
那么,这种场景下VM1和VM2之间如何学习对方的MAC地址以及在互相学习到对方的MAC地址后如何封装数据包呢?接下来我们详细地分析这一场景的数据包转发流。
VM1要和VM2通信,需要学习到对方的MAC地址。因此,VM1发送ARP消息查询 VM2 的MAC地址。
Hyper-V虚拟交换机广播ARP到:
所有在本地且VSID为11111的虚机
HNVFilter
但是,HNV Filter在查询表里并未找到 VM2的MAC地址
于是,HNV 封装一个ARP请求数据包,然后单播到每个PA地址,数据包里包含 VSID=111111的OOB数据和相关的L2记录。
HNV Filter将ARP请求数据包通过NVGRE/VXLAN进行二次封装。
二次封装的数据包通过传输网络传输到目的Hyper-V物理机。
IP地址为10.2.41.206以及MAC地址为MACPA2的Hyper-V物理机接收到数据包,然后将其发送到自己的HNV Filter。
目的物理机的HNV Filter拆开二次封装的数据包,获取到即原始数据包以及包含了VSID为11111的OOB数据。
HNV Filter将原始数据包发送到具有VSID为11111的Hyper-V虚拟交换机。
Hyper-V虚拟交换机按照访问控制策略将原始数据包(也即ARP请求数据包)发送到目标虚机。
如果目的虚机网卡和ARP所请求的MAC地址匹配,那么虚拟将将ARP应答发送给Hyper-V虚拟交换机。
Hyper-V虚拟交换机同时附加上VSID为11111的OOB数据
因为该ARP响应数据包不是发送给本地虚机,所以Hyper-V虚拟交换机将ARP请求直接传递给HNV Filter。
HNV Filter看到该ARP数据包后如果发现CA的MAC/IP地址和PA的MAC/IP地址对动态IP记录不存在,便会加上这条CA-PA配对记录。接着发送一条新动态记录的通知给VMM,以便VMM将更新的记录发送给其他Hyper-V主机。
HNV Filter在查找记录里找到目标虚机VM1的MAC地址(MACVM1),然后将ARP应答数据包通过NVGRE/VXLAN进行二次封装。
二次封装的数据包通过传输网发送到源虚机所在的Hyper-V物理机。
IP地址为10.2.41.204以及MAC地址为MACPA1的Hyper-V物理机接收到数据包,然后发送到HNV Filter
HNV Filter拆开二次封装的数据包,获得原始数据包(也即ARP应答数据包),然后添加CA MAC/IP和PA MAC/IP动态地址对记录。接着发送一条新动态记录的通知给VMM,以便VMM将更新的记录发给其他Hyper-V主机。Hyper-V虚拟交换机接着将ARP应答数据包发送给VM1。
至此,VM1已经学习到VM2的MAC地址为MACVM2。
VM1封装原始数据包,目的IP地址为VM2的IP地址,目的MAC地址为MACvm2。
该数据包发送到Hyper-V虚拟交换机,虚拟交换机获取到源虚机(VM1)网卡上的VSID(11111),并将VSID信息组织为带外(OOB)数据。
Hyper-V虚拟交换机看到MACVM2 并不在本地Hyper-V虚拟交换机上,因此将数据包传递给HNV Filter。
HNV Filter检索查找记录,获得目标虚机的VSID是11111,CA地址为192.168.188.3,目标MAC地址为MACVM2,以及对应的PA地址为10.2.41.206。然后将这些获取到的信息和原始数据包使用NVGRE/VXLAN进行二次封装。
二次封装的数据包通过传输网络发送到目的虚机(VM2)所在的Hyper-V物理机。
IP地址为10.2.41.206以及MAC地址为MACPA2的Hyper-V物理机接收到数据包,然后发送到HNV Filter。
HNV Filter拆开二次封装的包,获取到原始数据包,以及包含了VSID 为11111的OOB数据。
HNV Filter将原始数据包转发到具有VSID为11111的Hyper-V虚拟交换机。
Hyper-V虚拟交换机按照访问控制策略将原始数据包发送到目标虚机VM2。
注意:以上这个场景就是虚机在从未通信时,借助启用动态IP地址学习的特性进行MAC地址学习和转发数据包,我们需要强调以下几点:
在启用了动态IP地址学习后,HNV封装ARP请求数据包,ARP请求数据包通过单播进行传输,并且也需要通过NVGRE/VXLAN进行二次封装。
目的虚机在数据包流中生成实际ARP应答。
源和目的Hyper-V主机都没有CAMAC/IP和PA MAC/IP地址对,所以在数据包流发生过程中这些地址对动态查询将被添加,并通知VMM创建了新的查找记录。
本文出自 “黄利军的博客” 博客,谢绝转载!
原文地址:http://ichbinleo.blog.51cto.com/11948851/1944104