概述

Linux提供了许多虚拟网络设备用于运行VMs和containers。下面对这些网络虚拟化设备做相应介绍。

 

Bridge

Bridge类似于一个网络交换机,用于交换数据包,连接不同的VMs, containers以及Host.

 

虚拟化平台网络图 虚拟化网络设备_虚拟化平台网络图

图1a:Bridge

 

# ip link add br0 type bridge
# ip link set eth0 master br0
# ip link set tap1 master br0
# ip link set tap2 master br0
# ip link set veth1 master br0

 

TUN / TAP

对于一个网络设备来说,就像一个管道,有两端,从其中任意一端收到的数据将从另一端发送出去。比如一个物理网卡eth0,它的两端分别是内核协议栈和外面的物理网络,从物理网络收到的数据,会转发给内核协议栈,而应用程序从协议栈发过来的数据将会通过物理网络发送出去。对于一个虚拟网络设备一端可以连接内核协议栈或其母设备,另一端取决于各种具体实现。

 

虚拟化平台网络图 虚拟化网络设备_kernel_02

图1b:tun应用

 

  1. APP 1通过socket 1发送了一个数据包给目的地址192.168.1.10
  2. socket将这个数据包发给协议栈
  3. 协议栈根据数据包的目的IP地址,匹配本地路由规则,知道这个数据包应该由tun0出去,于是将数据包交给tun0
  4. tun0收到数据包之后,发现另一端被进程APP 2打开了,于是将数据包发给了APP 2
  5. 进程APP 2收到数据包之后,做一些跟业务相关的处理,然后构造一个新的数据包,将原来的数据包嵌入在新的数据包中,最后通过socket 2将数据包转发出去,而目的IP地址变成了一个和APP 2业务相关地址,比如是8.8.8.8.
  6. socket 2将数据包转给协议栈
  7. 协议栈根据本地路由,发现这个数据包应该要通过eth0发送出去,于是将数据包交给eth0
  8. eth0通过物理网络将数据包发送出去

tun/tap设备的用处是将协议栈中的部分数据包转发给用户空间的应用程序,通过文件接口暴露给用户空间的程序一个处理数据包的机会。用户层程序通过tun设备只能读写IP数据包,而通过tap设备能读写链路层数据包,类似于普通socket和raw socket的差别,处理数据包的格式不一样。

 

Bonded Interface

Bonded Interface用于将多个网络接口聚合成一个逻辑上的”bonded”接口。可用于故障备份或负载均衡等场景。

 

虚拟化平台网络图 虚拟化网络设备_linux_03

图2:Bonded Interface

 

Team Device

Bonded Interface类似,将多个网络接口聚合成一个逻辑接口。参见 Bonded Interface vs Team Device

 

虚拟化平台网络图 虚拟化网络设备_虚拟设备_04

图3:Team Device

Linux中还有一种叫net_failover的虚拟设备,如下图所示,将半虚拟化的网卡方案和passthru的方案聚合成一个界面。增加了抵抗设备出错的风险。

 

虚拟化平台网络图 虚拟化网络设备_kernel_05

图4:net_failover

 

VLAN

VLAN被用来划分子网,可以减少广播包对网络的压力。其通过往以太网数据包头添加一个TAG来实现过滤。下图是VLAN数据包格式:

 

虚拟化平台网络图 虚拟化网络设备_虚拟设备_06

图5:VLAN数据包格式

 

可以使用VLAN来分割VMs, Containers以及host中的网络。以下是一个例子

 

# ip link add link eth0 name eth0.2 type vlan id 2
# ip link add link eth0 name eth0.3 type vlan id 3

 

虚拟化平台网络图 虚拟化网络设备_linux_07

图6:VLAN

 

VXLAN

VXLAN (Virtual eXtensible Local Area Network),见IETF RFC 7348,是一种隧道协议。其解决了在划分大规模网络VLAN IDs不足(只有4096)的缺点。VXLAN有一个24-bit的 ID, 一共支持2^24(16777216)个virtual LANs。 其将L2的数据包添加上 VXLAN头,然后整个数据包作为一个UDP IP包在网络上传输。

VXLAN数据包格式如下图所示

虚拟化平台网络图 虚拟化网络设备_虚拟设备_08

图7:VXLAN数据包格式

VXLAN可以跨本地网络建立子网。

虚拟化平台网络图 虚拟化网络设备_虚拟化平台网络图_09

图8:VXLAN

 

# ip link add vx0 type vxlan id 100 local 1.1.1.1 remote 2.2.2.2 dev eth0 dstport 4789

参考 Introduction to Cloud Overlay Networks - VXLAN

 

VETH

VETH(virtual Ethernet)是一种本地以太网隧道。该设备成对出现,用于连接不同的namespace。如下图所示, 其一端收到的数据会直接发送给其peer端。

虚拟化平台网络图 虚拟化网络设备_虚拟化平台网络图_10

图9:VETH

 

# ip netns add net1
# ip netns add net2
# ip link add veth1 netns net1 type veth peer name veth2 netns net2

 

MACVLAN

使用VLAN, 你可以在一个网络接口上建立多个虚拟网络接口,并通过VLAN tag来过滤数据包。使用MACVLAN你可以在一个网络接口上建立多个拥有不同MAC地址的界面。

MACVLAN之前,如果你想连接两个不同的namespace,需要时用 Bridge + VETH, 如下图所示

虚拟化平台网络图 虚拟化网络设备_linux_11

图10:VETH连接namespces

而使用MACVLAN取代 Bridge + VETH如下图所示

虚拟化平台网络图 虚拟化网络设备_kernel_12

图11:MACVLAN

MACVLAN 有5中不同的模式,在隔离性上有所不同。

1 Private Mode: 该模式下,各个端点只能与外界通信。MACVLAN端点之间不能通信。

虚拟化平台网络图 虚拟化网络设备_虚拟设备_13

图12:MACVLAN Private Mode

2 VEPA Mode: 该模式下,各个端点可以与外界通信。MACVLAN端点之间通信需要外部Switch支持一个叫发夹弯(hairpin)的功能才可以。

虚拟化平台网络图 虚拟化网络设备_linux_14

图13:MACVLAN VEPA Mode

3 Bridge Mode: 该模式下,各个端点之间可以通信,与外界也可以通信。功能和Bridge + VETH一致。

虚拟化平台网络图 虚拟化网络设备_网络_15

图14:MACVLAN Bridge Mode

4 Passthru Mode: 该模式可以让Container直接连接外部Switch。

虚拟化平台网络图 虚拟化网络设备_虚拟设备_16

图15:MACVLAN Passthru Mode

5 Source Mode: 该模式主要用于traffic过滤,是一种基于MAC的VLAN。可参考 源代码

综上模式,Bridge Mode是最常用的模式。

# ip link add macvlan1 link eth0 type macvlan mode bridge
# ip link add macvlan2 link eth0 type macvlan mode bridge
# ip netns add net1
# ip netns add net2
# ip link set macvlan1 netns net1
# ip link set macvlan2 netns net2

 

IPVLAN

IPVLAN与 MACVLAN类似, 区别在于 IPVLAN各端点的MAC地址是相同的,与其parent设备一致。

虚拟化平台网络图 虚拟化网络设备_虚拟设备_17

图16:IPVLAN

IPVLAN可以工作在L2或L3模式。如果工作在L2模式,其parent设备的行为可以看成是Bridge或Switch,与 MACVLAN的区别在于其通过IP地址来过滤数据包,而后者通过MAC地址过滤。如果工作在L3模式,其parent设备的行为可以看成是一个Router。

 

虚拟化平台网络图 虚拟化网络设备_虚拟设备_18

图17:IPVLAN working in L2 Mode

 

虚拟化平台网络图 虚拟化网络设备_kernel_19

图18:IPVLAN working in L3 Mode

MACVLAN与 IPVLAN在很多方面相似。下面介绍几需使用 IPVLAN 而非 MACVLAN的场景。

  • 1) 如果host连接的外部交换机只允许一个MAC地址。
  • 2) 如果出于性能考虑,需要关闭网卡杂项模式(promiscuous mode), MACVLAN需要网卡运行在杂项模式。
  • 3) 创建的virtual device 超过了parent的MAC地址容量。
  • 4) 如果工作在不安全的L2网络

 

# ip netns add ns0
# ip link add name ipvl1 link eth0 type ipvlan mode l2
# ip link set dev ipvl0 netns ns0

 

MACVTAP/IPVTAP

类似 MACVLAN用以取代 Bridge + VETH 来连接不同的namespace. MACVTAP 用以取代 Bridge + TUN/TAP来连接不同的VMs。MACVLAN / IPVLAN 连接不同的namespace, 旨在将Guest namespace和Host的网络接口直接程序给外部Switch。MACVTAP / IPVTAP 连接不同VMs, 内核为其创建了设备文件/dev/tapX,可以直接被虚拟化软件QEMU使用。MACVTAP与 IPVTAP的区别 和 MACVLAN 与 IPVLAN的区别相类似。

 

虚拟化平台网络图 虚拟化网络设备_虚拟设备_20

图19:MACVTAP

 

# ip link add link eth0 name macvtap0 type macvtap

 

MACsec

MACsec (Media Access Control Security), 是一个IEEE制定的以太网安全标准。其与IPsec类似,但其不仅可以保护IP数据包,还可以保护其他IP层之外的协议包,如ARP, 邻居发现协议包(neighbor discovery),DHCP包。其封包结构如下图所示:

虚拟化平台网络图 虚拟化网络设备_linux_21

图20:MACsec封包

其主要也是用在保护APR,NS, DHCP等以太网数据包

虚拟化平台网络图 虚拟化网络设备_虚拟化平台网络图_22

图21:MACsec

 

# ip link add macsec0 link eth1 type macsec

 

VCAN

与网络loopback设备类似,VCAN(virtual CAN)驱动提供一种虚拟CAN接口叫VCAN。具体参见内核CAN文档

 

VXCAN

VXCAN可以作为一种本地隧道连接两个VCAN网络设备。与VETH类似,你会创建一个VXCAN对, 用于连接不同namespaces的VCAN。

# ip netns add net1
# ip netns add net2
# ip link add vxcan1 netns net1 type vxcan peer name vxcan2 netns net2