首页 > 系统相关 >【linux】Linux虚拟网络中的网络接口介绍

【linux】Linux虚拟网络中的网络接口介绍

时间:2024-11-08 11:43:06浏览次数:5  
标签:ip linux 接口 add link Linux 设备 type 网络接口

原创 信息技术圈
Introduction to Linux interfaces for virtual networking

Linux 拥有丰富的虚拟网络功能,这些功能为托管虚拟机、容器以及云环境提供了基础。在这篇文章中,我将简要介绍所有常用虚拟网络接口类型。本文不涉及代码分析,仅对 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 虚拟接口介绍:隧道》。

《Linux 虚拟接口介绍:隧道》

https://developers.redhat.com/blog/2019/05/17/an-introduction-to-linux-virtual-interfaces-tunnels/

Bridge

Linux 网桥的工作方式类似于网络交换机。它在连接到它的接口之间转发数据包。通常用于路由器、网关上或主机上的虚拟机与网络命名空间之间的数据包转发。它还支持生成树协议(STP)、虚拟局域网过滤和多播侦听。

当你希望在虚拟机、容器和主机之间建立通信通道时,可以使用网桥。

创建网桥的方法如下:

# 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 的绑定(bonding)驱动提供了一种将多个网络接口聚合成一个单一逻辑的“绑定”接口的方法。绑定接口的行为取决于模式;一般来说,这些模式提供热备份或负载均衡服务。

当你希望提高链路速度或在服务器上实现故障转移时,可以使用绑定接口。

创建绑定接口的方法如下:

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

这将创建一个名为 bond1 的绑定接口,模式为主动-备份。对于其他模式,请参阅内核文档。

https://www.kernel.org/doc/Documentation/networking/bonding.txt

Team 设备

类似于绑定接口,team 设备的目的在于提供一种机制,将多个网络接口控制器(NIC,即端口)在第二层(L2 层)上组合成一个逻辑设备(teamdev)。

需要注意的是,team 设备并不是试图复制或模仿绑定接口。它所做的是以不同的方式解决相同的问题,例如,使用无锁(RCU)传输/接收路径和模块化设计。

但是,绑定接口和 team 之间也存在一些功能上的差异。例如,team 支持 LACP 负载均衡、NS/NA(IPV6)链路监控、D-Bus 接口等,这些在绑定中是没有的。有关绑定和 team 之间差异的更多详细信息,请参阅“Bonding vs. Team features”。

https://github.com/jpirko/libteam/wiki/Bonding-vs.-Team-features

当你想使用一些绑定所不提供的功能时,可以使用 team。

创建 team 的方法如下:

# 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

这将创建一个名为 team0 的 team 接口,模式为active-backup,并将 eth0 和 eth1 作为 team0 的子接口添加。

最近,Linux中添加了一个名为net_failover 的新驱动程序。它是另一个用于虚拟化的故障转移主网络设备,管理一个主设备(passthru/VF [Virtual Function] 设备)和一个备用设备(原始的半虚拟化接口)。

https://www.kernel.org/doc/html/latest/networking/net_failover.html https://wiki.libvirt.org/page/Networking#PCI_Passthrough_of_host_network_devices

VLAN

VLAN(虚拟局域网)通过在网络数据包中添加标签来分隔广播域。VLAN 允许网络管理员在同一交换机下或不同交换机之间对主机进行分组。

VLAN 包头看起来像这样:

当你想在虚拟机、网络命名空间或主机中分离子网时,可以使用 VLAN。

创建 VLAN 的方法如下:

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

这将添加 VLAN 2,名称为 eth0.2,以及 VLAN 3,名称为 eth0.3。拓扑结构如下所示:

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

VXLAN

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

通过使用 24 位的段标识符(也称为 VXLAN 网络标识符 (VNI)),VXLAN 允许多达 2^24(16,777,216)个虚拟 LAN,这比 VLAN 的容量大 4096 倍。

VXLAN 将带有 VXLAN 头的第 2 层帧封装到 UDP-IP 数据包中,看起来像这样:

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

以下是如何使用 VXLAN 的方法:

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

作为参考,您可以阅读 VXLAN 内核文档或这篇 VXLAN 介绍。

https://www.kernel.org/doc/Documentation/networking/vxlan.txt https://vincent.bernat.ch/en/blog/2017-vxlan-linux

MACVLAN

通过 VLAN,您可以在单个接口之上创建多个接口,并根据 VLAN 标签过滤数据包。而通过 MACVLAN,您可以在单个接口之上创建具有不同第 2 层(即以太网 MAC)地址的多个接口。

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

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

MACVLAN 有五种类型:

私有(Private):不允许同一物理接口上的 MACVLAN 实例之间进行通信,即使外部交换机支持发夹模式(hairpin mode)也是如此。

VEPA(Virtual Ethernet Port Aggregator):同一物理接口上的一个 MACVLAN 实例向另一个 MACVLAN 实例发送的数据会通过物理接口传输。要么连接的交换机需要支持发夹模式,要么必须有一个 TCP/IP 路由器来转发数据包,以便允许通信。

桥接(Bridge):所有端点通过物理接口上的简单网桥直接相互连接。

直通(Passthru):允许单个虚拟机直接连接到物理接口。

(Source):源模式用于根据允许的源 MAC 地址列表过滤流量,以创建基于 MAC 的 VLAN 关联。请参考提交信息。

macvlan: add source mode
This patch adds a new mode of operation to macvlan, called "source".
It allows one to set a list of allowed mac address, which is used
to match against source mac address from received frames on underlying
interface.
This enables creating mac based VLAN associations, instead of standard
port or tag based. The feature is useful to deploy 802.1x mac based
behavior, where drivers of underlying interfaces doesn't allows that.

Configuration is done through the netlink interface using e.g.:
 ip link add link eth0 name macvlan0 type macvlan mode source
 ip link add link eth0 name macvlan1 type macvlan mode source
 ip link set link dev macvlan0 type macvlan macaddr add 00:11:11:11:11:11
 ip link set link dev macvlan0 type macvlan macaddr add 00:22:22:22:22:22
 ip link set link dev macvlan0 type macvlan macaddr add 00:33:33:33:33:33
 ip link set link dev macvlan1 type macvlan macaddr add 00:33:33:33:33:33
 ip link set link dev macvlan1 type macvlan macaddr add 00:44:44:44:44:44

This allows clients with MAC addresses 00:11:11:11:11:11,
00:22:22:22:22:22 to be part of only VLAN associated with macvlan0
interface. Clients with MAC addresses 00:44:44:44:44:44 with only VLAN
associated with macvlan1 interface. And client with MAC address
00:33:33:33:33:33 to be associated with both VLANs.
https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/commit/?id=79cf79abce71

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

当你希望直接从容器连接到物理网络时,使用 MACVLAN。

以下是设置 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
# 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:

(a) 连接到外部交换机/路由器的 Linux 主机已配置策略,每个端口只允许一个 MAC 地址。
(b) 在主设备上创建的虚拟设备数量超过了 MAC 容量,并导致网卡进入混杂模式,性能下降成为一个问题。
(c) 如果从设备将被置于敌对/不可信的网络命名空间中,从设备的 L2 层可能被更改/滥用。"

以下是如何设置 IPVLAN 实例:

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

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

MACVTAP/IPVTAP

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

通过 MACVTAP/IPVTAP,你可以用单一模块替代 TUN/TAP 和桥接驱动的组合:

通常,MACVLAN/IPVLAN 用于使虚拟机和主机直接显示在连接到主机的交换机上。MACVTAP 和 IPVTAP 的区别与 MACVLAN/IPVLAN 相同。

以下是如何创建 MACVTAP 实例:

# ip link add link eth0 name macvtap0 type macvtap

MACsec

MACsec(媒体访问控制安全,Media Access Control Security)是IEEE针对有线以太网LAN安全的一项标准。与IPsec类似,作为二层规范,MACsec不仅可以保护IP流量,还可以保护ARP、邻居发现和DHCP。
MACsec的头部结构如下所示:

MACsec的主要用例是保证标准LAN上的所有信息的安全,包括ARP、NS和DHCP消息。

以下是如何设置MACsec配置的步骤:

# ip link add macsec0 link eth1 type macsec

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

https://developers.redhat.com/blog/2016/10/14/macsec-a-different-solution-to-encrypt-network-traffic/

VETH

VETH(虚拟以太网,virtual Ethernet)设备是一种本地以太网隧道。这些设备成对创建,如下图所示。

在成对的一台设备上传输的数据包会立即在另一台设备上被接收。当其中任一设备处于关闭状态时,这对设备的链路状态也会变为关闭。

当命名空间需要与主机的主命名空间或相互之间进行通信时,使用VETH配置。

以下是如何设置VETH配置的步骤:

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

这创建了两个命名空间,net1和net2,并创建了一对VETH设备,将veth1分配给命名空间net1,将veth2分配给命名空间net2。这两个命名空间通过这对VETH设备连接起来。分配一对IP地址,然后你可以在两个命名空间之间进行ping和通信。

VCAN

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

有关更多CAN协议信息,请参阅内核CAN文档。(https://www.kernel.org/doc/Documentation/networking/can.txt)

当你想在本地主机上测试CAN协议实现时,可以使用VCAN。

以下是如何创建VCAN的步骤:

# ip link add dev vcan1 type vcan

VXCAN

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

当你想在不同命名空间之间发送CAN消息时,使用VXCAN配置。

以下是如何设置VXCAN实例的步骤:

# 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)设备支持IP-over-InfiniBand协议。它通过InfiniBand(IB)传输IP数据包,因此你可以将IB设备用作快速网络接口卡(NIC)。

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

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

https://www.kernel.org/doc/Documentation/infiniband/ipoib.txt

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

以下是如何创建IPOIB设备的步骤:

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

NLMON

NLMON是一个Netlink监控设备。

当你想监控系统的Netlink消息时,使用NLMON设备。

以下是如何创建NLMON设备的步骤:

# ip link add nlmon0 type nlmon
# ip link set nlmon0 up
# tcpdump -i nlmon0 -w nlmsg.pcap

这创建了一个名为nlmon0的NLMON设备并启动它。使用数据包嗅探器(例如tcpdump)来捕获Netlink消息。最新版本的Wireshark具备解码Netlink消息的功能。

Dummy 接口

Dummy 接口类似于回环接口,是完全虚拟的。Dummy接口的目的是提供一个设备,用于路由数据包而不实际传输它们。

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

以下是如何创建Dummy接口的步骤:

# 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接口。

以下是如何创建IFB接口的步骤:

# 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设备,并将根队列调度器替换为SFQ(Stochastic Fairness Queueing,随机公平队列),这是一种无类队列调度器。然后,它在eth0上添加一个入口队列调度器,并将所有入口流量重定向到ifb0。

有关更多IFB队列调度器的使用案例,请参阅Linux基金会的IFB相关维基页面。(https://wiki.linuxfoundation.org/networking/ifb)

参考资源

# Red Hat开发者博客上的虚拟网络文章

https://developers.redhat.com/search?t=Virtual+networking+articles

# Open Virtual Network (OVN)中的动态IP地址管理

https://developers.redhat.com/blog/2018/09/03/ovn-dynamic-ip-address-management/

# Red Hat企业Linux中的非root Open vSwitch

https://developers.redhat.com/blog/2018/03/23/non-root-open-vswitch-rhel/

# Red Hat开发者博客上的Open vSwitch文章

https://developers.redhat.com/search?t=Open+vSwitch

netdevsim接口

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

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

# ip link add dev sim0 type netdevsim
# ip link set dev sim0 up

要启用tc卸载:

# ethtool -K sim0 hw-tc-offload on

要加载XDP BPF或tc BPF程序:

# ip link set dev sim0 xdpoffload obj prog.o

要为SR-IOV测试添加VF:

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

要更改VF数量,首先需要完全禁用它们:

# echo 0 > /sys/class/net/sim0/device/sriov_numvfs
# echo 5 > /sys/class/net/sim0/device/sriov_numvfs

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

文章来源

https://developers.redhat.com/blog/2018/10/22/introduction-to-linux-interfaces-for-virtual-networking#

标签:ip,linux,接口,add,link,Linux,设备,type,网络接口
From: https://www.cnblogs.com/o-O-oO/p/18534781

相关文章

  • linux新增物理卷,扩容逻辑分区,出现WARNING: xfs signature detected on /dev/vdb at of
    linux新增物理卷出现WARNING:xfssignaturedetectedon/dev/vdbatoffset0.Wipeit?[y/n]:标识这个/dev/vdb磁盘已经从0位置被标记为xfs类型的文件系统报错解释:这条信息表示在设备/dev/vdb上检测到了XFS文件系统的签名。通常情况下,这可能意味着分区/dev/vdb已被......
  • Linux分区出现 Device for PV wwoBYr-XnZx-Oa4D-71JE-essF-5qPe-Zu8Cvw not found or
    linux分区,出现这种情况,磁盘创建或分配出现了异常WARNING:DeviceforPVwwoBYr-XnZx-Oa4D-71JE-essF-5qPe-Zu8Cvwnotfoundorrejectedbyafilter.Couldn'tfinddevicewithuuidwwoBYr-XnZx-Oa4D-71JE-essF-5qPe-Zu8Cvw.PV/dev/vda2VGcentoslvm2[<39.0......
  • 在Linux中如何添加新的硬盘
    准备工作检查系统环境在开始Linux磁盘分区之前,检查系统环境是一个关键步骤。Linux提供了两种常用的方法来查看现有的磁盘信息:fdisk-l:这个命令用于显示磁盘的分区表,提供详细的分区信息。lsblk:这个命令以树状结构展示系统中的块设备,包括磁盘和分区,同时显示挂载点信息。......
  • Linux命令行压力测试工具:基准测试与性能优化
    文章目录Linux命令行压力测试工具:基准测试与性能优化Linux安装模拟CPU压力基本用法:高负载模拟:常见选项解析:模拟CPU满负荷模拟I/O瓶颈随机读测试:顺序写测试:初始化与清理操作:模拟大流量网络压力客户端测试命令:服务端命令:模拟端口禁用与防火墙配置查看当前规则:禁用出口端......
  • 【命令操作】Linux三剑客之sed详解 _ 统信 _ 麒麟 _ 方德
    原文链接:【命令操作】Linux三剑客之sed详解|统信|麒麟|方德Hello,大家好啊!今天带来一篇关于Linux三剑客之sed命令详解的文章。sed是一款功能强大的流编辑器,它可以在命令行中快速处理文本,支持替换、插入、删除等操作,特别适合用于处理大型文件或批量文本处理任务。本文......
  • linux_1
    静态库:以lib开头,文件名通常:libxxx.a;静态库在编译时,会链接(拷贝一份)放到可执行程序;因为要被复制到可执行文件,所以代码体积会增大。它不会共享。若库被更新了程序需要重新编译。共享库:文件名通常libxx.so;在需要这个库时程序需要回到共享库区执行库中的代码。库更......
  • Linux基础 -- (1)
    声明:本文的学习内容来源于B站up主“泷羽sec”的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,请联系本人,我将立即删除相关内容。本文旨在帮助网络安全爱好者提升自身安全技能,并严格遵守国家法律法规。任何人利用本文......
  • 轻松上手:在Linux上用Docker部署Cloudreve云盘,远程访问无压力!
    文章目录前言1.安装Docker2.使用Docker拉取镜像3.创建并启动Cloudreve容器4.本地访问测试5.公网远程访问本地Cloudreve5.1内网穿透工具安装5.2创建远程连接公网地址5.3使用固定公网地址远程访问前言本文主要介绍如何在Linux系统使用Docker快速部署Cloudrev......
  • 【面试全纪实 | Linux 07 文件管理命令类】请回答,你真的了解Linux吗?
    ......
  • Nexpose 6.6.277 for Linux & Windows - 漏洞扫描
    Nexpose6.6.277forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,releasedNov06,2024请访问原文链接:https://sysin.org/blog/nexpose-6/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序新增功能2024年11月......