用于虚拟网络的Linux接口简介
用于虚拟网络的Linux接口简介
本文译自:Introduction to Linux interfaces for virtual networking。
Linux具有丰富的虚拟网络功能,可用作托管VM和容器以及云环境的基础。在这篇文章中,我将简要介绍所有常用的虚拟网络接口类型。没有代码分析,只有对接口及其在Linux上的用法的简要介绍。任何有网络背景的人都可能对这篇博文感兴趣。可以使用以下命令获取接口列表"ip link help".
这篇文章涵盖了以下常用接口和一些容易相互混淆的接口:
BridgeBonded interfaceTeam deviceVLAN (Virtual LAN)VXLAN (Virtual eXtensible Local Area Network)MACVLANIPVLANMACVTAP/IPVTAPMACsec (Media Access Control Security)VETH (Virtual Ethernet)VCAN (Virtual CAN)VXCAN (Virtual CAN tunnel)IPOIB (IP-over-InfiniBand)NLMON (NetLink MONitor)Dummy interfaceIFB (Intermediate Functional Block)netdevsim
阅读本文后,您将了解这些接口是什么,它们之间有什么区别,何时使用它们以及如何创建它们。有关隧道等其他接口,请参阅Linux虚拟接口简介:隧道。
Bridge (网桥)
Linux网桥的行为类似于网络交换机。它在连接到它的接口之间转发数据包。它通常用于在路由器、网关上或在主机上的VM和网络命名空间之间转发数据包。它还支持STP、VLAN过滤器和组播侦听。
如果要在VM、容器和主机之间建立通信通道,请使用网桥。
以下是创建桥接的方法:
1 | |
这将创建一个名为br0的网桥并设置两个TAP设备(tap1,tap2)、VETH设备veth1和物理设备eth0作为其从属,如上图所示。
Bonded interface (绑定接口)
Linux绑定驱动程序提供了一种将多个网络接口聚合到单个逻辑"bonded"接口的方法。绑定接口的行为取决于模式;一般来说,模式提供热备用或负载平衡服务。
当您想要提高链接速度或在服务器上执行故障转移时,请使用绑定接口。
以下是创建绑定接口的方法:
1 | |
这将创建一个active-backup模式的绑定接口(名为bond1)。对于其他模式,请参阅内核文档。
Team device (团队设备)
与绑定接口类似,团队设备的目的是提供一种机制,将多个NIC(端口)分组到一个逻辑NIC(teamdev)的L2层(数据链路层)。
要意识到的主要事情是,团队设备不会尝试复制或模仿绑定接口。它的作用是使用不同的方法解决相同的问题,例如,使用无锁(RCU)TX/RX路径和模块化设计。
但是绑定接口和团队设备之间也存在一些功能差异。例如,团队设备支持LACP负载平衡、NS/NA(IPV6)链路监控、D-Bus接口等,这些在绑定接口中是没有的。有关绑定接口和团队设备之间差异的更多详细信息,请参阅绑定与团队功能。
当您想要使用绑定接口无法提供的某些功能时,请使用团队设备。
以下是创建团队设备的方法:
1 | |
这将创建一个active-backup模式的团队设备(名为team0),它添加了eth0和eth1作为team0的子接口。
最近,一个名为net_failover的新驱动程序已添加到Linux中。它是另一个用于虚拟化的可故障转移的主网络设备,管理一个主从属网络设备(直通/VF(虚拟功能)设备)和一个备用从属网络设备(原始半虚拟接口)。
VLAN (虚拟局域网)
VLAN(也称为虚拟局域网)通过向网络数据包添加标记来分隔广播域。VLAN允许网络管理员将主机分组到同一交换机下或不同交换机之间。
VLAN标头如下所示:
如果要分隔虚拟机、命名空间或主机中的子网,请使用VLAN。
以下是创建VLAN的方法:
1 | |
这将添加名为"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 | |
作为参考,你可以阅读VXLAN kernel documentation或this VXLAN introduction。
MACVLAN (链路层虚拟局域网)
使用VLAN,您可以在单个接口之上创建多个接口,并根据VLAN标记过滤包。借助MACVLAN,您可以在单个接口之上创建具有不同L2层(即以太网MAC)地址的多个接口。
在提出MACVLAN之前,如果要从虚拟机或命名空间连接到物理网络,则需要创建TAP/VETH设备并将一端连接到网桥,同时将物理接口连接到主机上的网桥,如下所示:
现在,使用MACVLAN,可以将与MACVLAN关联的物理接口直接绑定到命名空间,而无需网桥。
有五种MACVLAN类型:
- 私有:不允许同一物理接口上的MACVLAN实例之间进行通信,即使外部交换机支持
"hairpin"(发夹弯)模式也是如此。
- VEPA:同一物理接口上的不同MACVLAN实例之间通信,需通过物理接口传输。连接的交换机需要支持
"hairpin"(发夹弯)模式,或者必须有一个TCP/IP路由器转发数据包才能允许之。
- 桥接:所有端点通过物理接口通过简单的网桥直接相互连接。
- 直通:允许单个虚拟机直接连接到物理接口。
- 源:源模式用于根据允许的源MAC地址列表过滤流量,以创建基于MAC的VLAN关联。请参阅提交消息。
注意:出于隔离考虑,MACVLAN子实例无法直接与父接口通信。
根据不同的需要选择类型。桥接模式是最常用的。
如果要从容器直接连接到物理网络,请使用MACVLAN。
以下是设置MACVLAN的方法:
1 | |
这会在桥接模式下创建两个新的MACVLAN设备,并分配给两个不同的命名空间。
IPVLAN (网际层虚拟局域网)
IPVLAN类似于MACVLAN,不同之处在于端点具有相同的MAC地址。
IPVLAN支持L2和L3模式。IPVLAN L2模式的作用类似于桥接模式下的MACVLAN。父接口看起来像网桥或交换机。
在IPVLAN L3模式下,父接口的作用类似于路由器,数据包在端点之间路由,从而提供更好的可扩展性。
关于何时使用IPVLAN,IPVLAN内核文档说MACVLAN和IPVLAN:在许多方面非常相似,根据具体的情况可以很好地决定选择哪种设备。如果以下情况之一符合您的用例,则可以选择使用IPVLAN:
- 连接到外部交换机或路由器的Linux主机配置的策略为每个端口仅允许一个MAC地址。
- 创建的虚拟设备虽未超过MAC地址容量,但考虑到网卡置于混杂模式,性能下降的问题。
- 若将子设备放入敌对或不受信任的网络命名空间中,其上的L2层(数据链路层)可能会被更改或滥用。
以下是设置IPVLAN实例的方法:
1 | |
这将创建一个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 | |
MACsec (媒体访问控制安全)
MACsec(媒体访问控制安全)是用于有线以太局域网安全性的IEEE标准。与IPsec类似,作为L2层(数据链路层)规范,MACsec不仅可以保护IP流量,还可以保护ARP、neighbor discovery和DHCP。MACsec标头如下所示:
MACsec的主要用例是保护标准LAN上的所有消息,包括ARP、NS和DHCP消息。
以下是配置MACsec的方法:
1 | |
注意:这只会在接口eth1上添加一个名为macsec0的MACsec设备。有关更详细的配置,请参阅MACsec
introduction by Sabrina Dubroca的配置示例部分。
VETH (虚拟以太网)
VETH(虚拟以太网)设备是本地以太网通道。设备成对创建,如下图所示:
在VETH pair中的一台设备上传输的数据包会立即在配对的另一台设备上接收。当任一设备关闭时,此VETH pair的链路状态也关闭。
当命名空间需要与主主机命名空间通信或彼此通信时,请使用VETH pair。
以下是设置VETH pair的方法:
1 | |
这将创建两个命名空间net1和net2,以及一对VETH设备,并将veth1分配给命名空间net1,将veth2分配给命名空间net2。这两个命名空间与此VETH pair连接。分配一对IP地址,然後您可以在两个命名空间之间互相ping和通信。
VCAN (虚拟控制器局域网)
与网络环回设备类似,VCAN(虚拟CAN)驱动程序提供虚拟本地CAN(控制器局域网)接口,因此用户可以通过VCAN接口发送或接收CAN报文。CAN目前主要用于汽车领域。
有关更多CAN协议信息,请参阅内核CAN文档。
如果要在本地主机上测试CAN协议实现,请使用VCAN。
以下是创建VCAN的方法:
1 | |
VXCAN (虚拟控制器隧道)
与VETH驱动程序类似,VXCAN(虚拟CAN隧道)在两个VCAN网络设备之间实现本地CAN流量隧道。创建VXCAN实例时,将成对创建两个VXCAN设备。当一端收到数据包时,数据包出现在设备的另一端上,反之亦然。VXCAN可用于跨命名空间通信。
如果要跨命名空间发送CAN消息,请使用VXCAN。
以下是设置VXCAN实例的方法:
1 | |
注意: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 | |
NLMON
NLMON是一个Netlink监控设备。
当您想要监视系统网络链接消息时,请使用NLMON设备。
以下是创建NLMON设备的方法:
1 | |
这将创建一个名为nlmon0的NLMON设备并对其进行设置。使用数据包嗅探器(例如tcpdump)捕获Netlink消息。最新版本的Wireshark具有Netlink消息解码功能。
Dummy interface (Dummy接口)
Dummy接口是完全虚拟的,例如环回接口。Dummy接口的目的是提供一个设备来路由数据包,而无需实际传输它们。
使用Dummy接口使非活动SLIP(串行线路互联网协议)地址看起来像本地程序的真实地址。如今,Dummy接口主要用于测试和调试。
以下是创建Dummy接口的方法:
1 | |
IFB (中间功能块)
IFB(中间功能块)驱动程序提供了一个设备,该设备允许集中来自多个源的流量并调整传入流量,而不是丢弃它。
当您想要对传入流量进行排队和调整时,请使用IFB接口。
以下是创建IFB接口的方法:
1 | |
这将创建一个名为ifb0的IFB设备,并将root qdisc调度程序替换为SFQ(随机公平性队列),SFQ是一种无类排队调度程序。然后,它在eth0上添加一个入口qdisc调度程序,并将所有入口流量重定向到ifb0。
有关更多IFB qdisc用例,请参阅Linux Foundation
wiki on IFB。
netdevsim
netdevsim是一个模拟的网络设备,用于测试各种网络API。目前,它特别专注于测试硬件卸载、tc/XDP BPF和SR-IOV。
可以按如下方式创建netdevsim设备
1 | |
要启用tc卸载,请执行以下操作:
1 | |
要加载XDP BPF或tc BPF程序,请执行以下操作:
1 | |
要添加用于SR-IOV测试的VF,请执行以下操作:
1 | |
要更改vf编号,您需要先完全禁用它们:
1 | |
注意: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