跳转至

Linux虚拟网络接口

2021-04-11
英文原文点此处

Linux具有丰富的虚拟网络功能,可用作托管VM和容器以及云环境的基础。
可以使用ip link help获取帮助

TAP/TUN

详见内核文档
tp-tun

Bridge

Linux网桥的行为类似于网络交换机。
它在与其连接的接口之间转发数据包。
它通常用于在路由器,网关或虚拟机与主机上的网络名称空间之间转发数据包。
它还支持STP,VLAN过滤器和多播侦听。
bridge

Bonded'

将多个网络接口聚合为单个逻辑接口的方法。
bond有多种模式
详见内核文档
bonded

Team device

与绑定接口类似,组设备的目的是提供一种在L2层将多个NIC(端口)分组为一个逻辑端(teamdev)的机制。
team
Team设备并不是替代或者模仿bond设备,而是用不同的方式去实现聚合,例如:tx/tx时少锁(用RCU),等
更多差异见此处

Linux最近又增加一种 新的驱动net_failover.

net_failover

VLAN

VLAN,又叫虚拟局域网,通过对网络报文增加标识来划分广播域.
VLAN可以将同一台交换机下或不同交换机之间的主机分组。
vlan
vlan

VXLAN

VXLAN (Virtual eXtensible Local Area Network),旨在解决IEEE 802.1q中有限的VLAN ID(4,096)的问题。
通过24位网段ID(又称为VXLAN网络标识符(VNI),VXLAN最多允许2 ^ 24(16,777,216)个虚拟LAN,这是VLAN容量的4,096倍。
VXLAN将带有VXLAN标头的第2层帧封装到UDP-IP数据包中,如下所示:
vxlan VXLAN通常部署在虚拟主机上的数据中心中,该主机可以分布在多个机架上。
vxlan
详见:
vxlan内核文档
vxlan介绍

MACVLAN

通过VLAN,可以在一个接口上创建多个接口,并根据VLAN标记过滤程序包。
使用MACVLAN,可以在一个接口上创建具有不同第2层(即以太网MAC)地址的多个接口。

在使用MACVLAN之前,如果要从VM或名称空间连接到物理网络,则需要创建TAP / VETH设备,并将一侧连接到网桥,并同时将物理接口连接到主机上的网桥,如下所示。
br_ns
借助MACVLAN,您可以将与MACVLAN关联的物理接口直接绑定到名称空间,而无需桥接。
macvlan
There are five MACVLAN types:

1.Private

macvlan
不允许同一物理接口上的MACVLAN实例通信,即使外部交换机支持hairpin模式

2.VEPA

macvlan
同一物理接口上从一个MACVLAN实例到另一个MACVLAN实例的数据通过该物理接口传输。
连接的交换机需要支持hairpin模式,或者必须有TCP / IP路由器转发数据包才能进行通信。

3.Bridge

macvlan
所有终端都通过物理接口通过简单的桥接器直接相互连接。

4.Passthru

macvlan
允许将单个VM直接连接到物理接口。

5.Source

源模式用于基于允许的源MAC地址列表过滤流量,以创建基于MAC的VLAN关联。
详见

配置

Bash
1
2
3
4
5
6
7
8
9
#以桥接模式创建两个macvlan
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
#将两个macvlan分配到两个命名空间
ip link set macvlan1 netns net1
ip link set macvlan2 netns net2

IPVLAN

IPVLAN与MACVLAN相似,区别在于端点具有相同的MAC地址。
ipvlan
IPVLAN支持L2和L3模式。IPVLAN L2模式在桥接模式下的行为类似于MACVLAN。
父接口看起来像一个网桥或交换机。
ipvlan
在IPVLAN L3模式下,父接口的作用类似于路由器,并且数据包在端点之间路由,从而提供了更好的可伸缩性。
ipvlan

IPVLAN和MACVLAN差异

IPVLAN内核文档

使用

如果以下情况之一定义了您的用例,则可以选择使用ipvlan :
(a)连接到外部交换机/路由器的Linux主机已配置了策略,每个端口仅允许一个mac。
(b)在主服务器上创建的虚拟设备均未超过mac容量,并且无法将NIC置于混杂模式,因此性能下降是一个问题。
(c)如果要将从设备放入敌对/不受信任的网络名称空间中,则可以更改/滥用从设备上的L2

Bash
1
2
3
ip netns add ns0
ip link add name ipvl0 link eth0 type ipvlan mode l2
ip link set dev ipvl0 netns ns0

MACVTAP/IPVTAP

MACVTAP/ IPVTAP是一种新的设备驱动程序,旨在简化虚拟化桥接网络。
当在物理接口顶部创建MACVTAP / IPVTAP实例时,内核还将创建一个字符设备/dev / tapX,
以与TUN / TAP设备一样使用,可以由KVM / QEMU直接使用。

使用MACVTAP / IPVTAP,您可以用单个模块替换TUN / TAP和网桥驱动程序的组合:
mactap
通常,MACVLAN / IPVLAN用于使访客和主机都直接显示在主机所连接的交换机上。
MACVTAP和IPVTAP之间的差异与MACVLAN / IPVLAN相同。

Bash
1
ip link add link eth0 name macvtap0 type macvtap

MACsec

MACsec(媒体访问控制安全性)是用于有线以太网LAN中安全性的IEEE标准。
与IPsec相似,作为第2层规范,MACsec不仅可以保护IP流量,还可以保护ARP,邻居发现和DHCP。
MACsec标头如下所示:
macsec
MACsec的主要用例是保护标准LAN上的所有消息(包括ARP,NS和DHCP消息)的安全。
macsec

Bash
1
ip link add macsec0 link eth1 type macsec
详见

VETH

VETH (virtual Ethernet)设备是本地以太网隧道.
该设备是成对创建的.
在该对中的一个设备上传输的数据包将立即在另一设备上接收。
当任何一台设备关闭时,该对的链接状态为关闭。
veth
当命名空间需要与主机命名空间或彼此之间进行通信时,使用VETH配置。

Bash
1
2
3
4
5
6
#创建两个命名空间 net1和net2,以及对应的veth设备
ip netns add net1
ip netns add net2
#将veht1分配到命名空间net1;将veth2分配到命名空间net2
#两个命名空间通过veth对链接
ip link add veth1 netns net1 type veth peer name veth2 netns net2

VCAN

与网络环回设备类似,VCAN(虚拟CAN)驱动程序提供了虚拟本地CAN(控制器局域网)接口,因此用户可以通过VCAN接口发送/接收CAN消息。 如今,CAN主要用于汽车领域。
有关更多CAN协议信息,请参考内核CAN文档。 要在本地主机上测试CAN协议实现时,请使用VCAN。
创建VCAN的方法如下:

Bash
1
ip link add dev vcan1类型vcan

VXCAN

与VETH驱动程序类似,VXCAN(虚拟CAN隧道)在两个VCAN网络设备之间实现本地CAN流量隧道。创建VXCAN实例时,两个VXCAN设备将成对创建。当一端接收到数据包时,该数据包出现在设备对上,反之亦然。VXCAN可用于跨命名空间通信。

当您想跨名称空间发送CAN消息时,请使用VXCAN配置。

设置VXCAN实例的方法如下:

Bash
1
2
3
ip netns add net1
ip netns add net2
ip link add vxcan1 netns net1 type vxcan peer name vxcan2 netns net2

IPOIB

IPOIB设备支持IP-over-InfiniBand协议。
这样可以通过InfiniBand(IB)传输IP数据包,因此您可以将IB设备用作快速NIC。
IPoIB驱动程序支持两种操作模式:数据报和已连接。
在数据报模式下,使用IB UD(不可靠数据报)传输。
在连接模式下,使用IB RC(可靠连接)传输。
连接模式利用了IB传输的连接特性,并允许MTU最多达到64K的最大IP数据包大小。
详见
当您拥有IB设备并想通过IP与远程主机通信时,请使用IPOIB设备。

Bash
1
ip link add ib0 name ipoib0 type ipoib pkey IB_PKEY mode connected

NLMON

NLMON是Netlink监视设备。
当您要监视系统Netlink消息时,请使用NLMON设备。

Bash
1
2
3
4
5
6
#创建名为nlmon0的设备
ip link add nlmon0 type nlmon
#使能设备
ip link set nlmon0 up
#抓包
tcpdump -i nlmon0 -w nlmsg.pcap

Dummy interface

虚拟接口完全是虚拟的,例如回环接口。
虚拟接口的目的是提供一种设备,可以在不实际传输数据包的情况下路由数据包。
使用虚拟接口使无效的SLIP(串行Internet协议)地址看起来像本地程序的真实地址。
如今,虚拟接口主要用于测试和调试。

Bash
1
2
3
4
#Here’s how to create a dummy interface:
ip link add dummy1 type dummy
ip addr add 1.1.1.1/24 dev dummy1
ip link set dummy1 up

IFB

IFB (Intermediate Functional Block) 驱动程序提供了一种设备,
该设备允许集中来自多个源的流量并调整传入流量,而不是将其丢弃。
当您要排队和调整传入流量时,请使用IFB接口。

Bash
1
2
3
4
5
6
7
#Here’s how to create an IFB interface:
ip link add ifb0 type ifb
ip link set ifb0 up
tc qdisc add dev ifb0 root sfq
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: u32 match u32 0 0 action mirred egress redirect dev ifb0
#This creates an IFB device named ifb0 and replaces the root qdisc #scheduler with SFQ (Stochastic Fairness Queueing), which is a classless #queueing scheduler. Then it adds an ingress qdisc scheduler on eth0 and #redirects all ingress traffic to ifb0.
详见

netdevsim interface

netdevsim是一种模拟的联网设备,用于测试各种联网API。
目前,它特别专注于测试硬件卸载,tc/XDP BPF和SR-IOV。

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#创建新的netdevsim设备
ip link add dev sim0 type netdevsim
ip link set dev sim0 up
#To enable tc offload:
ethtool -K sim0 hw-tc-offload on
#To load XDP BPF or tc BPF programs:
ip link set dev sim0 xdpoffload obj prog.o
# To add VFs for SR-IOV testing:
echo 3 > /sys/class/net/sim0/device/sriov_numvfs
ip link set sim0 vf 0 mac 
#To change the vf numbers, you need to disable them completely first:
echo 0 > /sys/class/net/sim0/device/sriov_numvfs
echo 5 > /sys/class/net/sim0/device/sriov_numvfs
#Note: Redhat默认未编译netdevsim