概述
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,它的两端分别是内核协议栈和外面的物理网络,从物理网络收到的数据,会转发给内核协议栈,而应用程序从协议栈发过来的数据将会通过物理网络发送出去。对于一个虚拟网络设备一端可以连接内核协议栈或其母设备,另一端取决于各种具体实现。
图1b:tun应用
- APP 1通过socket 1发送了一个数据包给目的地址192.168.1.10
- socket将这个数据包发给协议栈
- 协议栈根据数据包的目的IP地址,匹配本地路由规则,知道这个数据包应该由tun0出去,于是将数据包交给tun0
- tun0收到数据包之后,发现另一端被进程APP 2打开了,于是将数据包发给了APP 2
- 进程APP 2收到数据包之后,做一些跟业务相关的处理,然后构造一个新的数据包,将原来的数据包嵌入在新的数据包中,最后通过socket 2将数据包转发出去,而目的IP地址变成了一个和APP 2业务相关地址,比如是8.8.8.8.
- socket 2将数据包转给协议栈
- 协议栈根据本地路由,发现这个数据包应该要通过eth0发送出去,于是将数据包交给eth0
- eth0通过物理网络将数据包发送出去
tun/tap设备的用处是将协议栈中的部分数据包转发给用户空间的应用程序,通过文件接口暴露给用户空间的程序一个处理数据包的机会。用户层程序通过tun设备只能读写IP数据包,而通过tap设备能读写链路层数据包,类似于普通socket和raw socket的差别,处理数据包的格式不一样。
Bonded Interface
Bonded Interface用于将多个网络接口聚合成一个逻辑上的”bonded”接口。可用于故障备份或负载均衡等场景。
图2:Bonded Interface
Team Device
与Bonded Interface类似,将多个网络接口聚合成一个逻辑接口。参见 Bonded Interface vs Team Device
图3:Team Device
Linux中还有一种叫net_failover的虚拟设备,如下图所示,将半虚拟化的网卡方案和passthru的方案聚合成一个界面。增加了抵抗设备出错的风险。
图4:net_failover
VLAN
VLAN被用来划分子网,可以减少广播包对网络的压力。其通过往以太网数据包头添加一个TAG来实现过滤。下图是VLAN数据包格式:
图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
图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数据包格式如下图所示
图7:VXLAN数据包格式
VXLAN可以跨本地网络建立子网。
图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端。
图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, 如下图所示
图10:VETH连接namespces
而使用MACVLAN取代 Bridge + VETH如下图所示
图11:MACVLAN
MACVLAN 有5中不同的模式,在隔离性上有所不同。
1 Private Mode: 该模式下,各个端点只能与外界通信。MACVLAN端点之间不能通信。
图12:MACVLAN Private Mode
2 VEPA Mode: 该模式下,各个端点可以与外界通信。MACVLAN端点之间通信需要外部Switch支持一个叫发夹弯(hairpin)的功能才可以。
图13:MACVLAN VEPA Mode
3 Bridge Mode: 该模式下,各个端点之间可以通信,与外界也可以通信。功能和Bridge + VETH一致。
图14:MACVLAN Bridge Mode
4 Passthru Mode: 该模式可以让Container直接连接外部Switch。
图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设备一致。
图16:IPVLAN
IPVLAN可以工作在L2或L3模式。如果工作在L2模式,其parent设备的行为可以看成是Bridge或Switch,与 MACVLAN的区别在于其通过IP地址来过滤数据包,而后者通过MAC地址过滤。如果工作在L3模式,其parent设备的行为可以看成是一个Router。
图17:IPVLAN working in L2 Mode
图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的区别相类似。
图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包。其封包结构如下图所示:
图20:MACsec封包
其主要也是用在保护APR,NS, DHCP等以太网数据包
图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