在配置了网络虚拟化(Overlay)的网络结构中,处于Overlay网络中的虚机数据包的封装和MAC地址学习和传统物理网络(Underlay)相似又不尽相同。除了我们了解Overlay网络需要借助Underlay网络进行二次封装之外,其MAC地址学习过程也相对要曲折一些。这些MAC地址学习过程取决于多种因素:
1) 虚机是否在同一虚拟子网?
2) 虚机是否在同一虚机网络的不同虚拟子网?
3) 虚机是否运行于同一台物理机?
4) 虚机是否运行在不同的物理机?
不同的场景,虚机之间学习对方的MAC地址,以及在互相学习到对方的MAC地址后何封装数据包都不尽相同。接下来我们详细分析以下5种不同场景:
1) 虚机在同一虚拟子网(VSID相同),运行在同一台主机;
2) 虚机在同一虚机网络的不同虚拟子网里(RDID相同,VSID不同),运行在同一台主机;
3) 虚机在同一虚机网络的不同虚拟子网里(RDID相同,VSID不同),运行在不同的主机;
4) 虚机在同一虚拟子网(VSID相同),运行在不同主机,未启用动态地址学习;
5) 虚机在同一虚拟子网(VSID相同),运行在不同主机,启用了动态地址学习;
本文我们将先讨论1),2)和3),并在接下来的文章继续讨论第4)和第5)个场景,有关于微软网络虚拟化HNV的相关概念,如RDID、VSID、虚机网络、虚拟子网、默认网关等,可以参考http://ichbinleo.blog.51cto.com/11948851/1902265和http://ichbinleo.blog.51cto.com/11948851/1903866 进一步了解 。
我们先看第一个场景,如图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运行在同一台物理服务器,那么VM1和VM2之间如何学习对方的MAC地址以及在互相学习到对方的MAC地址后如何封装数据包呢?接下来我们详细地分析这一场景的数据包转发流。
1. VM1要和VM2通信,需要学习到对方的MAC地址。因此,VM1发送ARP消息查询 VM2 的MAC地址。
2. Hyper-V虚拟交换机记录VM1连接的端口和MAC地址,并广播ARP消息到:
① 所有在本地且VSID为11111的虚机
② HNV Filter(HNV过滤器)
3. 由于VM2的VSID与VM1一样同为11111,因此VM2在接收到ARP广播后,返回自己的MAC地址信息给Hyper-V交换机,Hyper-V虚拟交换机记录下VM2连接的端口和MAC地址,并将ARP响应转发给VM1。
4. VM1学习到VM2的MAC地址MACvm2 后,封装数据包(目的IP为VM2的IP, 目的MAC地址为VM2的MAC地址)并发送到Hyper-V虚拟交换机。
5. Hyper-V虚拟交换机接收到数据包后,虚拟交换机获取到源虚机(VM1)网卡上的VSID(11111),并将VSID信息封装为带外(OOB)数据。
6. Hyper-V虚拟交换机基于RDID和VSID进行访问控制判断,得知目标VM2的RDID与VSID和VM1的RDID与VSID一致后,再将数据包转发给虚机VM2。
7. VM2收到数据包,完成此次数据的发送和接收。
注意: Hyper-V 虚拟交换机应用了基于VSID和RDID的访问控制策略,VSID ACL在Hyper-V虚拟交换机内部发生,Hyper-V虚拟交换机把VSID信息封装成OOB数据,然后基于OOB数据所提供的VSID进行访问控制。因为虚机的虚拟网卡具有指定的VSID信息,源和目的虚机的VSID相同或者在同一个虚机网络(RDID)时,HNV访问控制列表才允许互相之间的访问。目标和源虚机在同一台物理机上运行时,虚机之间发送数据包并不需要通过NVGRE/VXLAN二次封装,HNV Filter并不参与数据包的转发。
第2个场景,如图2所示。我们在一个虚机网络里创建了2个虚拟子网(分别为172.16.188.0/24和192.168.188.0/24),然后在每个虚拟子网中各自创建1台虚机,分配了各自子网的的IP地址:
VM1的IP地址为192.168.188.2,MAC地址为MACvm1
VM2的IP地址为172.16.188.2,MAC地址为MACvm2
此刻,这两台虚机VM1和VM2运行在同一台物理服务器,那么VM1和VM2之间如何学习对方的MAC地址以及在互相学习到对方的MAC地址后如何封装数据包呢?接下来我们详细地分析这一场景的数据包转发流。
1. VM1要和VM2通信,需要学习到对方的MAC地址。但是VM1和VM2不在同一个子网,所以VM1要学习的是默认网关的MAC地址,而不是VM2的MAC地址。
2. Hyper-V虚拟交换机收到VM1发送ARP数据包后,记录VM1连接的端口和MAC地址,然后将ARP广播到HNV Filter。
3. HNV Filter返回默认网关的MAC地址MACDFGW给虚拟交换机, MACDFGW就是HNV Filter自身。
4. VM1学习到默认网关的MAC地址为MACDFGW,其VSID为11111 (默认网关的MAC地址MACDFGW包含在OOB数据里)。
5. VM1封装数据包,目的IP为VM2的IP地址,目的MAC地址为默认网关的MAC地址MACDFGW ,数据包先发送到默认网关。
6. 接着数据包被默认网关转发到Hyper-V虚拟交换机,Hyper-V虚拟交换机获取到源虚机(VM1)网卡上的VSID(11111),并将VSID信息封装成带外(OOB)数据。
7. 在Hyper-V交换机做进一步数据包转发之前,HNV Filter先检查源虚机VM1和目的虚机VM2的RDID是否一致,如果2者的RDID不同,那么数据包将会被丢弃。
8. HNV Filter检索查找记录(VirtulizationLookupRecord)来确定目的虚机VM2的PA地址,如果找不到目的虚机的PA地址,数据包将会被丢弃。在这种情况下,目标虚机VM2的PA地址就是本地HNV Filter的PA地址。HNV Filter重写数据包以将目的MAC地址更改为VM2的MAC地址MACvm2。
9. 同时,HNV Filter更新数据包中的OOB数据,将VSID从11111更改为22222。
10. Hyper-V虚拟交换机基于RDID和VSID进行访问控制判断,得知目标VM2的RDID和VM1的RDID一致,然后将数据包转发给虚机VM2。
11. VM2收到数据包,完成此次数据的发送和接收。
注意:在此场景下,因为虚机处于不同VSID里,HNV起到分布式路由的作用,需要注意以下几点:
数据包里的GRE Key/VNID里只能容下一个VSID,所以GRE只会将目标虚机的VSID放置在GRE Key/VNID里进行传输。
如果目标和源虚机在同一台物理机上运行时,虚机之间发送数据包并不需要通过NVGRE/VXLAN二次封装。
和2台虚机在相同的VSID的情况不同的是,2台虚机在不同VSID的情况下,HNV Filter 参与数据包的转发,因为HNV Filter承担起默认网关的角色,也即HNV的分布式路由功能。
在承担默认网关的时候,HNV Filter 更新数据包的VSID和目标MAC地址,将其匹配到目标虚机的VSID和MAC地址 。
第3个场景,如图3所示。我们在一个虚机网络里创建了2个虚拟子网(分别为172.16.188.0/24和192.168.188.0/24),然后在每个虚拟子网中各自创建1台虚机,分配了各自子网的的IP地址:
VM1的IP地址为192.168.188.2,MAC地址为MACvm1
VM2的IP地址为172.16.188.2,MAC地址为MACvm2
此刻,这两台虚机VM1和VM2运行在不同的物理服务器,那么VM1和VM2之间如何学习对方的MAC地址以及在互相学习到对方的MAC地址后如何封装数据包呢?接下来我们详细地分析这一场景的数据流。
1. VM1要和VM2通信,需要学习到对方的MAC地址。但是VM1和VM2不在同一个子网,所以VM1要学习的是自己连接的虚拟交换机的默认网关的MAC地址,而不是VM2的MAC地址。
2. Hyper-V虚拟交换机收到VM1发送ARP数据包后,记录VM1连接的端口和MAC地址,然后将ARP广播到HNV Filter。
3. HNV Filter返回默认网关的MAC地址MACDFGW , MACDFGW就是HNV Filter自身。
4. VM1学习到默认网关的MAC地址为MACDFGW ,其VSID为11111 (默认网关的MAC地址MACDFGW包含在OOB数据里)
5. VM1封装数据包目的IP为VM2的IP地址,目的MAC地址为默认网关的MAC地址MACDFGW,数据包先发送到默认网关。
6. 接着数据包被发送到Hyper-V虚拟交换机,Hyper-V虚拟交换机获取到源虚机(VM1)网卡上的VSID(11111),并将VSID信息封装为带外(OOB)数据。
7. HNV Filter检查VM1和VM2的网络是否具有同样的RDID,如果2者的RDID不同,那么数据包将会被丢弃
8. HNV Filter使用查找记录来确定目的虚机VM2的PA地址,如果找不到目的虚机的PA地址,数据包将会被丢弃。
9. HNV Filter重写数据包以将目标MAC地址更改为VM2的MAC地址MACvm2。
10. HNV Filter检索查找记录发现目的虚机的VSID(22222)和源虚机的VSID(11111)所属RDID一样。这时,NVGRE/VXLAN将目的虚机VM2的VSID(22222)、HNV Filter查找到的PA地址(10.2.41.206)连同原始数据包和其他信息做二次封装。二次封装的外部源IP地址是源虚机所对应的PA地址,外部目的IP地址是目的虚机所对应的PA地址。
11. 二次封装的数据包通过传输网络传输到目的虚机所运行的物理机。
12. 在传输网络上,IP地址为10.2.41.206以及MAC地址为MACPA2的Hyper-V物理机接收到数据包,然后将数据发送到该物理机的HNV Filter。
13. HNV Filter拆开封装的数据包,获取到内部数据包(也即原始数据包)以及包含了VSID为22222的OOB数据。
14. HNV Filter将原始数据包(在上一步获取的内部数据包)发送到具有VSID为22222的Hyper-V虚拟交换机。
15. Hyper-V虚拟交换机按照访问控制规则将数据包发送到目标虚机VM2。
注意: 在这个情况下,数据包通过NVGRE/VXLAN进行二次封装,但是封装对于源虚机和目标虚机来说完全是透明的,意味着虚机不能感知到数据的二次封装和拆封。
到此,我们详细讨论了3种不同的场景下,虚机数据转发流过程的详细说明。