虚拟网络技术:ipvlan

本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程、网络技术、Linux内核及实操、容器技术等。欢迎大家关注,二维码文末可以扫。

导读:ipvlan是linux kernel比较新颖的特性,稳定的版本>=4.2,和macvlan类似,都是从一个主机接口虚拟出多个虚拟网络接口,ipvlan虚拟出的子接口共有物理接口的mac地址,但可配置不同的ip地址。


一、ipvlan简介

ipvlan和macvlan类似,都是从一个主机接口虚拟出多个虚拟网络接口。唯一比较大的区别就是ipvlan虚拟出的子接口都有相同的mac地址(与物理接口共用同个mac地址),但可配置不同的ip地址。由于所有的虚拟接口共享同个mac地址,因此有些地方需要注意:当使用DHCP协议分配ip时,一般会用mac地址作为机器的标识,因此需要配置唯一的ClientID字段作为机器的标识, DHCP server配置ip时需使用该字段作为机器标识,而不是使用mac地址。

ipvlan是linux kernel比较新颖的特性,从3.19版本就开始支持ipvlan,但是比较稳定推荐的版本是 >=4.2(因为docker对接之前版本时存在bug)。


二、两种工作模式

ipvlan有两种不同的工作模式:L2和L3。一个父接口只能选择其中一种模式(不能采用混用模式),依附于它的所有虚拟接口都会运行在这个模式下。

1、L2模式

Ipvlan的L2模式和macvlan的bridge模式工作原理很相似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。

2、L3模式

L3模式下,ipvlan有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相ping通对方,因为ipvlan会在中间做报文的转发工作。

L3模式下的虚拟接口不会接收到多播或者广播的报文(ipvlan的虚拟接口会显示NOARP标志),在这个模式下,所有的网络报文都会发送给父接口,因此所有的ARP过程或者多播都是在底层的父接口完成的。需要注意的是:外部网络默认情况下是不知道ipvlan虚拟出来的网络的,如果不在外部路由器上配置好对应的路由规则,ipvlan的网络是不能被外部直接访问的。


三、ipvlan不同模式下的代码流程

如果是L2模式的话,分配ip给container,在container中会做arp的广播发送,当需要路由时,都是通过master设置进行路由转发。

如果是L3模式的话,ipvlan的虚拟机接口是不处理arp的广播和请求的,二层的广播交给了master device进行处理。在这种模式下master设备类似于路由器进行转发,需要配置针对container的路由信息。具体的详细细节可以参考以下代码流程图。

1、L2的发包流程

虚拟网络技术:ipvlan_第1张图片

 

2、L2的收包流程

虚拟网络技术:ipvlan_第2张图片

 

3、L3的发包流程

虚拟网络技术:ipvlan_第3张图片

 

4、L3的收包流程

虚拟网络技术:ipvlan_第4张图片


四、选择ipvlan还是macvlan?

ipvlan和macvlan两个虚拟网络模型提供的功能,看起来差距并不大,那么什么时候需要用到ipvlan呢?要回答这个问题,我们先来看看macvlan存在的不足:

1、需要大量mac地址。每个虚拟接口都有自己的mac地址,而网络接口和交换机支持的mac地址个数是有限的,在mac地址过多的情况下会造成严重的性能损失

2、无法和802.11(wireless)网络一起工作

假如你遇到了以上描述的问题,则这时就可以考虑使用ipvlan。

 

我的公众号「码农之屋」(id: Spider1818) ,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。

你可能感兴趣的:(网络虚拟技术)