用于虚拟网络的Linux接口简介

用于虚拟网络的Linux接口简介

本文译自:Introduction to Linux interfaces for virtual networking

Linux具有丰富的虚拟网络功能,可用作托管VM和容器以及云环境的基础。在这篇文章中,我将简要介绍所有常用的虚拟网络接口类型。没有代码分析,只有对接口及其在Linux上的用法的简要介绍。任何有网络背景的人都可能对这篇博文感兴趣。可以使用以下命令获取接口列表"ip link help".

这篇文章涵盖了以下常用接口和一些容易相互混淆的接口:

  • Bridge
  • Bonded interface
  • Team device
  • VLAN (Virtual LAN)
  • VXLAN (Virtual eXtensible Local Area Network)
  • MACVLAN
  • IPVLAN
  • MACVTAP/IPVTAP
  • MACsec (Media Access Control Security)
  • VETH (Virtual Ethernet)
  • VCAN (Virtual CAN)
  • VXCAN (Virtual CAN tunnel)
  • IPOIB (IP-over-InfiniBand)
  • NLMON (NetLink MONitor)
  • Dummy interface
  • IFB (Intermediate Functional Block)
  • netdevsim

阅读本文后,您将了解这些接口是什么,它们之间有什么区别,何时使用它们以及如何创建它们。有关隧道等其他接口,请参阅Linux虚拟接口简介:隧道

Bridge (网桥)

Linux网桥的行为类似于网络交换机。它在连接到它的接口之间转发数据包。它通常用于在路由器、网关上或在主机上的VM和网络命名空间之间转发数据包。它还支持STP、VLAN过滤器和组播侦听。

如果要在VM、容器和主机之间建立通信通道,请使用网桥。

以下是创建桥接的方法:

1
2
3
4
5
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

这将创建一个名为br0的网桥并设置两个TAP设备(tap1,tap2)、VETH设备veth1和物理设备eth0作为其从属,如上图所示。

Bonded interface (绑定接口)

Linux绑定驱动程序提供了一种将多个网络接口聚合到单个逻辑"bonded"接口的方法。绑定接口的行为取决于模式;一般来说,模式提供热备用或负载平衡服务。

当您想要提高链接速度或在服务器上执行故障转移时,请使用绑定接口。

以下是创建绑定接口的方法:

1
2
3
ip link add bond1 type bond miimon 100 mode active-backup
ip link set eth0 master bond1
ip link set eth1 master bond1

这将创建一个active-backup模式的绑定接口(名为bond1)。对于其他模式,请参阅内核文档

Team device (团队设备)

与绑定接口类似,团队设备的目的是提供一种机制,将多个NIC(端口)分组到一个逻辑NIC(teamdev)的L2层(数据链路层)。

要意识到的主要事情是,团队设备不会尝试复制或模仿绑定接口。它的作用是使用不同的方法解决相同的问题,例如,使用无锁(RCU)TX/RX路径和模块化设计。

但是绑定接口和团队设备之间也存在一些功能差异。例如,团队设备支持LACP负载平衡NS/NA(IPV6)链路监控D-Bus接口等,这些在绑定接口中是没有的。有关绑定接口和团队设备之间差异的更多详细信息,请参阅绑定与团队功能

当您想要使用绑定接口无法提供的某些功能时,请使用团队设备。

以下是创建团队设备的方法:

1
2
3
4
5
teamd -o -n -U -d -t team0 -c '{"runner": {"name": "activebackup"},"link_watch": {"name": "ethtool"}}'
ip link set eth0 down
ip link set eth1 down
teamdctl team0 port add eth0
teamdctl team0 port add eth1

这将创建一个active-backup模式的团队设备(名为team0),它添加了eth0eth1作为team0的子接口。

最近,一个名为net_failover的新驱动程序已添加到Linux中。它是另一个用于虚拟化的可故障转移的主网络设备,管理一个主从属网络设备(直通/VF(虚拟功能)设备)和一个备用从属网络设备(原始半虚拟接口)。

VLAN (虚拟局域网)

VLAN(也称为虚拟局域网)通过向网络数据包添加标记来分隔广播域。VLAN允许网络管理员将主机分组到同一交换机下或不同交换机之间。

VLAN标头如下所示:

如果要分隔虚拟机、命名空间或主机中的子网,请使用VLAN。

以下是创建VLAN的方法:

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

这将添加名为"eth0.2"VLAN 2和名为"eth0.3"VLAN 3,拓扑图如下所示:

注意:配置VLAN时,您需要确保连接到主机的交换机能够处理VLAN标记,例如,通过将交换机端口设置为中继模式。

VXLAN (虚拟可扩展局域网)

VXLAN(虚拟可扩展局域网)是一种隧道协议,旨在解决IEEE 802.1q中VLAN ID有限(4096个)的问题。它由IETF RFC 7348描述。

使用24位分段ID(也称为VXLAN网络标识符(VNI)),VXLAN最多允许2^24(16777216)个虚拟LAN,是VLAN容量的4096倍。

VXLAN将带有VXLAN标头的L2层(数据链路层)帧封装到UDP-IP数据包中,如下所示:

VXLAN通常部署在虚拟化主机上的数据中心,这些主机可能分布在多个机架上。

以下是使用VXLAN的方法:

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

作为参考,你可以阅读VXLAN kernel documentationthis VXLAN introduction

MACVLAN (链路层虚拟局域网)

使用VLAN,您可以在单个接口之上创建多个接口,并根据VLAN标记过滤包。借助MACVLAN,您可以在单个接口之上创建具有不同L2层(即以太网MAC)地址的多个接口。

在提出MACVLAN之前,如果要从虚拟机或命名空间连接到物理网络,则需要创建TAP/VETH设备并将一端连接到网桥,同时将物理接口连接到主机上的网桥,如下所示:

现在,使用MACVLAN,可以将与MACVLAN关联的物理接口直接绑定到命名空间,而无需网桥。

有五种MACVLAN类型:

  1. 私有:不允许同一物理接口上的MACVLAN实例之间进行通信,即使外部交换机支持"hairpin"(发夹弯)模式也是如此。
  1. VEPA:同一物理接口上的不同MACVLAN实例之间通信,需通过物理接口传输。连接的交换机需要支持"hairpin"(发夹弯)模式,或者必须有一个TCP/IP路由器转发数据包才能允许之。
  1. 桥接:所有端点通过物理接口通过简单的网桥直接相互连接。
  1. 直通:允许单个虚拟机直接连接到物理接口。
  1. 源:源模式用于根据允许的源MAC地址列表过滤流量,以创建基于MAC的VLAN关联。请参阅提交消息

注意:出于隔离考虑,MACVLAN子实例无法直接与父接口通信。

根据不同的需要选择类型。桥接模式是最常用的。

如果要从容器直接连接到物理网络,请使用MACVLAN。

以下是设置MACVLAN的方法:

1
2
3
4
5
6
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

这会在桥接模式下创建两个新的MACVLAN设备,并分配给两个不同的命名空间。

IPVLAN (网际层虚拟局域网)

IPVLAN类似于MACVLAN,不同之处在于端点具有相同的MAC地址。

IPVLAN支持L2和L3模式。IPVLAN L2模式的作用类似于桥接模式下的MACVLAN。父接口看起来像网桥或交换机。

在IPVLAN L3模式下,父接口的作用类似于路由器,数据包在端点之间路由,从而提供更好的可扩展性。

关于何时使用IPVLAN,IPVLAN内核文档说MACVLAN和IPVLAN:在许多方面非常相似,根据具体的情况可以很好地决定选择哪种设备。如果以下情况之一符合您的用例,则可以选择使用IPVLAN:

  1. 连接到外部交换机或路由器的Linux主机配置的策略为每个端口仅允许一个MAC地址。
  2. 创建的虚拟设备虽未超过MAC地址容量,但考虑到网卡置于混杂模式,性能下降的问题。
  3. 若将子设备放入敌对或不受信任的网络命名空间中,其上的L2层(数据链路层)可能会被更改或滥用。

以下是设置IPVLAN实例的方法:

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

这将创建一个L2模式的的IPVLAN设备(名为ipvl0),并分配给命名空间ns0

MACVTAP/IPVTAP

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

使用MACVTAP/IPVTAP,您可以将TUN/TAP和桥接驱动的组合替换为单个模块:

通常,MACVLAN/IPVLAN用于使客户机和主机直接显示在主机所连接的交换机上。MACVTAP和IPVTAP之间的区别与MACVLAN/IPVLAN相同。

以下是创建MACVTAP实例的方法:

1
ip link add link eth0 name macvtap0 type macvtap

MACsec (媒体访问控制安全)

MACsec(媒体访问控制安全)是用于有线以太局域网安全性的IEEE标准。与IPsec类似,作为L2层(数据链路层)规范,MACsec不仅可以保护IP流量,还可以保护ARPneighbor discoveryDHCP。MACsec标头如下所示:

MACsec的主要用例是保护标准LAN上的所有消息,包括ARPNSDHCP消息。

以下是配置MACsec的方法:

1
ip link add macsec0 link eth1 type macsec

注意:这只会在接口eth1上添加一个名为macsec0的MACsec设备。有关更详细的配置,请参阅MACsec introduction by Sabrina Dubroca的配置示例部分。

VETH (虚拟以太网)

VETH(虚拟以太网)设备是本地以太网通道。设备成对创建,如下图所示:

VETH pair中的一台设备上传输的数据包会立即在配对的另一台设备上接收。当任一设备关闭时,此VETH pair的链路状态也关闭。

当命名空间需要与主主机命名空间通信或彼此通信时,请使用VETH pair

以下是设置VETH pair的方法:

1
2
3
ip netns add net1
ip netns add net2
ip link add veth1 netns net1 type veth peer name veth2 netns net2

这将创建两个命名空间net1net2,以及一对VETH设备,并将veth1分配给命名空间net1,将veth2分配给命名空间net2。这两个命名空间与此VETH pair连接。分配一对IP地址,然後您可以在两个命名空间之间互相ping和通信。

VCAN (虚拟控制器局域网)

与网络环回设备类似,VCAN(虚拟CAN)驱动程序提供虚拟本地CAN(控制器局域网)接口,因此用户可以通过VCAN接口发送或接收CAN报文。CAN目前主要用于汽车领域。

有关更多CAN协议信息,请参阅内核CAN文档

如果要在本地主机上测试CAN协议实现,请使用VCAN。

以下是创建VCAN的方法:

1
ip link add dev vcan1 type vcan

VXCAN (虚拟控制器隧道)

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

如果要跨命名空间发送CAN消息,请使用VXCAN。

以下是设置VXCAN实例的方法:

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

注意:VXCAN在Red Hat Enterprise Linux中尚不受支持。

IPOIB

IPOIB设备支持IP-over-InfiniBand协议。这将通过InfiniBand(IB)传输IP数据包,因此您可以将IB设备用作快速网卡。

IPoIB驱动程序支持两种操作模式:数据报和连接。在数据报模式下,使用IB UD(不可靠数据报)传输。在连接模式下,使用IB RC(可靠连接)传输。连接模式利用IB传输的连接特性,并允许MTU的最大IP数据包大小为64K。

有关更多详细信息,请参阅IPOIB内核文档

当您拥有IB设备并希望通过IP与远程主机通信时,请使用IPOIB设备。

以下是创建IPOIB设备的方法:

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

NLMON

NLMON是一个Netlink监控设备。

当您想要监视系统网络链接消息时,请使用NLMON设备。

以下是创建NLMON设备的方法:

1
2
3
ip link add nlmon0 type nlmon
ip link set nlmon0 up
tcpdump -i nlmon0 -w nlmsg.pcap

这将创建一个名为nlmon0的NLMON设备并对其进行设置。使用数据包嗅探器(例如tcpdump)捕获Netlink消息。最新版本的Wireshark具有Netlink消息解码功能。

Dummy interface (Dummy接口)

Dummy接口是完全虚拟的,例如环回接口。Dummy接口的目的是提供一个设备来路由数据包,而无需实际传输它们。

使用Dummy接口使非活动SLIP(串行线路互联网协议)地址看起来像本地程序的真实地址。如今,Dummy接口主要用于测试和调试。

以下是创建Dummy接口的方法:

1
2
3
ip link add dummy1 type dummy
ip addr add 1.1.1.1/24 dev dummy1
ip link set dummy1 up

IFB (中间功能块)

IFB(中间功能块)驱动程序提供了一个设备,该设备允许集中来自多个源的流量并调整传入流量,而不是丢弃它。

当您想要对传入流量进行排队和调整时,请使用IFB接口。

以下是创建IFB接口的方法:

1
2
3
4
5
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

这将创建一个名为ifb0的IFB设备,并将root qdisc调度程序替换为SFQ(随机公平性队列),SFQ是一种无类排队调度程序。然后,它在eth0上添加一个入口qdisc调度程序,并将所有入口流量重定向到ifb0

有关更多IFB qdisc用例,请参阅Linux Foundation wiki on IFB

netdevsim

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

可以按如下方式创建netdevsim设备

1
2
ip link add dev sim0 type netdevsim
ip link set dev sim0 up

要启用tc卸载,请执行以下操作:

1
ethtool -K sim0 hw-tc-offload on

要加载XDP BPFtc BPF程序,请执行以下操作:

1
ip link set dev sim0 xdpoffload obj prog.o

要添加用于SR-IOV测试的VF,请执行以下操作:

1
2
echo 3 > /sys/class/net/sim0/device/sriov_numvfs
ip link set sim0 vf 0 mac

要更改vf编号,您需要先完全禁用它们:

1
2
echo 0 > /sys/class/net/sim0/device/sriov_numvfs
echo 5 > /sys/class/net/sim0/device/sriov_numvfs

注意:netdevsim默认不是在RHEL中编译的。

参考资料

Virtual networking articles on the Red Hat Developer blog

Dynamic IP Address Management in Open Virtual Network (OVN)

Non-root Open vSwitch in Red Hat Enterprise Linux

Open vSwitch articles on the Red hat Developer Blog

A developer’s path to success with OpenShift and containers

How to create a GCP instance via workflow and Ansible

How to create a GCP instance using Ansible Automation

How to create an instance on GCP using the Ansible CLI

How to deploy a MSSQL database using Ansible Vault


用于虚拟网络的Linux接口简介
https://blog.siantao.top/技术/计算机/软件/Linux/网络设备/用于虚拟网络的Linux接口简介/
作者
玉水仙楊
发布于
2023年7月17日
许可协议