天天看点

Macvlan和IPvlan基础知识

Macvlan和IPvlan基础知识

Macvlan和IPvlan都是Linux网络驱动程序,它们将底层(Underlay)网络或主机接口直接暴露给在主机中运行的VM或容器。在这篇博客中,我将介绍macvlan 和ipvlan的基础知识,并将macvlan和ipvlan与Linux网桥和子接口进行比较,同时,将展示如何在Linux系统中创建这些接口。

虚拟机和容器网络

运行裸机服务器时,主机网络可以很简单,只需很少的以太网接口和提供外部连接的默认网关。但当我们在一个主机中运行多个虚拟机时,需要在主机内和跨主机之间提供虚拟机之间的连接。一般,单个主机中的VM数量不超过15-20个。但在一台主机上运行Containers时,单个主机上的Containers数量很容易超过100个,需要有成熟的机制来实现Containers之间的网络互联。概括地说,容器或虚拟机之间有两种通信方式。 在底层网络方法中,虚拟机或容器直接暴露给主机网络,Bridge、macvlan和ipvlan网络驱动程序都可以做到。在Overlay网络方法中,容器或VM网络和底层网络之间存在额外的封装形式,如VXLAN、NVGRE等。

Linux网桥

Linux Bridge的作用类似于具有学习功能的常规硬件交换机,并且还支持STP等协议以防止环路。在linux桥接实现中,VM或容器将连接到网桥,而网桥将连接到外部世界。对于外部连接,我们还需要使用NAT。下图显示了连接到Linux网桥的2个容器,其中ethx接口提供外部连接。

Macvlan和IPvlan基础知识

Macvlan

Macvlan允许单个物理接口使用macvlan子接口拥有多个mac和ip地址。这与使用vlan在物理接口上创建子接口不同。对于vlan子接口,每个子接口使用vlan属于不同的L2域,并且所有子接口具有相同的MAC地址。使用macvlan,每个子接口都会获得唯一的mac和ip地址,并直接暴露在底层网络中。Macvlan接口通常用于虚拟化应用程序,每个macvlan接口都连接到一个Container或VM。每个容器或VM都可以像主机一样直接从公共服务器获取dhcp地址。这将有助于已经拥有IP寻址方案的Containers成为其传统网络的一部分的客户。Macvlan有4种类型(Private、VEPA、Bridge、Passthru)。最常用的类型是Macvlan Bridge,它允许单个主机中的端点能够在没有数据包离开主机的情况下相互通信。对于外部连接,使用底层网络。下图显示了两个容器使用macvlan Bridge相互通信以及与外界通信。两个容器都将使用Macvlan子接口直接暴露在底层网络中。

Macvlan和IPvlan基础知识

以下是创建2个macvlan网桥子接口的示例。这些示例在Ubuntu 14.04上进行了测试。

sudo ip link add mymacvlan1 link eth0 type macvlan mode bridge
sudo ip link add mymacvlan2 link eth0 type macvlan mode bridge
sudo ifconfig mymacvlan1 up
sudo ifconfig mymacvlan2 up
           

以下输出显示了父接口和两个macvlan子接口的详细信息。正如我们所见,这两个macvlan子接口获得了与父接口eth0不同的MAC地址。

$ ip link show mymacvlan1
19: mymacvlan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether 7e:33:b3:7d:f9:80 brd ff:ff:ff:ff:ff:ff
$ ip link show mymacvlan2
20: mymacvlan2@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether de:1a:30:bc:a3:a0 brd ff:ff:ff:ff:ff:ff
$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:85:47:0a  
          inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe85:470a/64 Scope:Link
           

下图为macvlan子接口与vlan子接口配合使用的示例。容器c1、c2连接到底层接口ethx.1,容器c3、c4连接到底层接口ethx.2。

Macvlan和IPvlan基础知识

以下命令创建2个vlan子接口,并在每个vlan子接口上创建两个macvlan bridge子接口,如上图所示:

sudo vconfig add eth2 10
sudo vconfig add eth2 20
 
macvlan with subinterface:
sudo ip link add mymacvlan1 link eth2.10 type macvlan mode bridge
sudo ip link add mymacvlan2 link eth2.10 type macvlan mode bridge
sudo ifconfig mymacvlan1 up
sudo ifconfig mymacvlan2 up

sudo ip link add mymacvlan3 link eth2.20 type macvlan mode bridge
sudo ip link add mymacvlan4 link eth2.20 type macvlan mode bridge
sudo ifconfig mymacvlan3 up
sudo ifconfig mymacvlan4 up
           

以下输出显示了相关接口的详细信息:

$ ip link show eth2.10
24: eth2.10@eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 08:00:27:32:b9:d3 brd ff:ff:ff:ff:ff:ff
smakam14@myubuntu:~$ ip link show eth2.20
25: eth2.20@eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 08:00:27:32:b9:d3 brd ff:ff:ff:ff:ff:ff
smakam14@myubuntu:~$ ip link show mymacvlan1
26: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether 26:2a:eb:a8:19:18 brd ff:ff:ff:ff:ff:ff
smakam14@myubuntu:~$ ip link show mymacvlan2
27: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether 3e:a4:35:93:90:7c brd ff:ff:ff:ff:ff:ff
smakam14@myubuntu:~$ ip link show mymacvlan3
28: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether 3e:07:83:fc:72:2a brd ff:ff:ff:ff:ff:ff
smakam14@myubuntu:~$ ip link show mymacvlan4
29: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether fe:92:b8:50:ef:7b brd ff:ff:ff:ff:ff:ff
           

Macvlan与Bridge比较

网桥可用于需要提供跨主机连接并能够在网桥上运行L2协议的复杂场景。Macvlan用于需要将端点直接暴露给外部网络的更简单的场景。使用Bridge时,必须需要使用NAT进行外部连接。使用macvlan,由于端点直接映射到底层网络,因此可以使用主机使用的相同dhcp服务器和交换机完成外部连接。

IPvlan

ipvlan与macvlan类似,不同之处在于端点具有相同的mac地址。ipvlan支持L2和L3模式。在ipvlan l2模式下,每个端点获取相同的MAC地址但不同的IP地址。在ipvlan l3模式下,数据包可在端点之间路由,因此提供了更好的可扩展性。

ipvlan需要内核版本>4.2。我在Ubuntu 16.04中测试了ipvlan。

sudo ip link add myipvlan1 link enp0s3 type ipvlan mode l2
sudo ifconfig myipvlan1 up
sudo ip link add myipvlan2 link enp0s3 type ipvlan mode l2
sudo ifconfig myipvlan2 up
           
$ ip link show
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
mode DEFAULT group default qlen 1000
    link/ether 08:00:27:79:da:82 brd ff:ff:ff:ff:ff:ff
3: myipvlan1@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue st
ate UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 08:00:27:79:da:82 brd ff:ff:ff:ff:ff:ff
4: myipvlan2@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue st
ate UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 08:00:27:79:da:82 brd ff:ff:ff:ff:ff:ff
           

IPvlan和Macvlan比较

更多资料

  • 网桥和Macvlan
  • Macvlan和IPvlan
  • 在Linux中配置Macvlan和IPvlan

继续阅读