01 macvlan 简介

前面的文章讲过了几种 Linux 虚拟网络设备:tap/tun、veth-pair、bridge,它们本质上是 Linux 系统 提供的网络虚拟化解决方案,今天要讲的 macvlan 也是其中的一种,准确说这是一种网卡虚拟化的解决方案。因为 macvlan 这种技术能将 一块物理网卡虚拟成多块虚拟网卡 ,相当于物理网卡施展了 多重影分身之术 ,由一个变多个。它可以为一张物理同时要求物理网卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本来是一块物理网卡连接到交换机,现在是多块虚拟网卡连接到交换机。macvlan应该很简单。

macvlan和host性能比较 macvlan ipvlan_Ethernet

 

 mavclan要知道的小知识点

  • macvlan并不创建网络,只创建虚拟网卡,(网络和网卡的区别)
  • macvlan会共享物理网卡所链接的外部网络,实现的效果跟桥接模式是一样的。
  1. macvlan 既不创建网络,主要有什么特性?或者说,macvlan的使用场景?
  • macvlan主要是用来解决效率问题的。
  • 也就是说macvlan是效率贵高的跨主机网络虚拟化解决方案之一。
  • 适合在对网络性能要求极高的场景下。
  1. 网络虚拟化的目的? 就是在多租户场景下,在统一的底层网络之上,单独为每个租户虚拟出自己的网络从而达到隔离的目的。
  2. macvlan属于什么解决方案呢?或者说,macvlan到底是干什么的,? 或者说,有什么用?
  • macvlan是网卡虚拟化方案
  • macvlan将一张物理网卡设置多个mac地址,就是一变多,一对多;类似于鸣人的影分身之术, 注意: 需要物理网卡,打开混杂模
[root@localhost ~]# ifconfig 
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        ether 02:42:03:f4:36:a8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp49s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.1.2  netmask 255.255.255.0  broadcast 10.10.1.255
        inet6 fe80::d65d:64ff:fe07:a8ea  prefixlen 64  scopeid 0x20<link>
        ether d4:5d:64:07:a8:ea  txqueuelen 1000  (Ethernet)
        RX packets 753534  bytes 87775044 (83.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 197292  bytes 17180026 (16.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xe6e20000-e6e3ffff  

enp49s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.1.3  netmask 255.255.255.0  broadcast 10.10.1.255
        inet6 fe80::630d:9f6c:1f70:ee47  prefixlen 64  scopeid 0x20<link>
        ether d4:5d:64:07:a8:eb  txqueuelen 1000  (Ethernet)
        RX packets 870944  bytes 127812481 (121.8 MiB)
        RX errors 0  dropped 23689  overruns 0  frame 0
        TX packets 15528  bytes 1014159 (990.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xe6e00000-e6e1ffff  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 2798  bytes 295384 (288.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2798  bytes 295384 (288.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

此处我对enp49s0f1网卡做macvaln

  • 开始混杂模式ifconfig enp49s0f1 promisc   网卡混杂模式介绍以及有几种模式:

          网卡具有如下的几种工作模式:
         1) 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。
         2)多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
         3)直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。
         4)混杂模式(Promiscuous Model):工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
              网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,一个站点的网卡将接受同一网络内所有站点所发送的数据包这样就可以到达对于网络信息监视捕获的目的。     

 



 取消混杂模式ifconfig enp49s0f1 -promisc 注意是“-”符号

[root@localhost ~]# ifconfig enp49s0f1 -promisc
[root@localhost ~]# ifconfig enp49s0f1
enp49s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.1.3  netmask 255.255.255.0  broadcast 10.10.1.255
        inet6 fe80::630d:9f6c:1f70:ee47  prefixlen 64  scopeid 0x20<link>
        ether d4:5d:64:07:a8:eb  txqueuelen 1000  (Ethernet)
        RX packets 872501  bytes 127974143 (122.0 MiB)
        RX errors 0  dropped 23717  overruns 0  frame 0
        TX packets 15533  bytes 1014464 (990.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xe6e00000-e6e1ffff
  • 既然有了多个mac地址,就可以设置多个IP地址了,从而实现,一块物理网卡链接到交换机,变成多个虚拟网卡链接到交换机。
  1. macvlan是linux kernel提供的一种network driver类型, 如何查看当前内核是否加载了该driver呢?
  • lsmod | grep macvlan (查看是否加载了)
  • modprobe macvlan (手动加载macvlan驱动到内核)
  • /drivers/net/macvlan.c (源码地址)

 02 macvlan 的工作原理

macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比较稳定的版本推荐 4.0+。它一般是以内核模块的形式存在,我们可以通过以下方法判断当前系统是否支持:

[root@localhost ~]# uname -a
Linux localhost.localdomain 4.18.0+ #1 SMP Thu Nov 19 16:39:22 CST 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# modprobe macvlan
[root@localhost ~]# lsmod | grep macvlan
macvlan                28672  0 
[root@localhost ~]# modinfo macvlan
filename:       /lib/modules/4.18.0+/kernel/drivers/net/macvlan.ko
alias:          rtnl-link-macvlan
description:    Driver for MAC address based VLANs
author:         Patrick McHardy <kaber@trash.net>
license:        GPL
rhelversion:    8.2
srcversion:     43A1B84175291054C98F5FD
depends:        
intree:         Y
name:           macvlan
vermagic:       4.18.0+ SMP mod_unload modversions

如果第一个命令报错,或者第二个命令没有返回,说明当前系统不支持 macvlan,需要升级内核。

macvlan 这种技术听起来有点像 VLAN,但它们的实现机制是完全不一样的。macvlan 子接口和原来的主接口是完全独立的,可以单独配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用来划分广播域,而 macvlan 共享同一个广播域。

通过不同的子接口,macvlan 也能做到流量的隔离。macvlan 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。

macvlan和host性能比较 macvlan ipvlan_文件系统_02

03 四种模式man ip link(  ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru  [ nopromisc ] | source })

根据 macvlan 子接口之间的通信模式,macvlan 有四种网络模式:

  • private 模式
  • vepa(virtual ethernet port aggregator) 模式
  • bridge 模式
  • passthru 模式

默认使用的是 vepa 模式。

3.1 private

这种模式下,同一主接口下的子接口之间彼此隔离,不能通信。即使从外部的物理交换机导流,也会被无情地丢掉。(子接口之间不可以通信,但是可以和父接口直接通信)

macvlan和host性能比较 macvlan ipvlan_文件系统_03

3.2 vepa

这种模式下,子接口之间的通信流量需要导到外部支持 802.1Qbg/VPEA 功能的交换机上(可以是物理的或者虚拟的{bridge}),经由外部交换机转发,再绕回来。

注: 802.1Qbg/VPEA 功能简单说就是交换机要支持 发夹(hairpin) 功能,也就是数据包从一个接口上收上来之后还能再扔回去。

macvlan和host性能比较 macvlan ipvlan_macvlan和host性能比较_04

3.3 bridge

这种模式下,模拟的是 Linux bridge 的功能,但比 bridge 要好的一点是每个接口的 MAC 地址是已知的,不用学习。所以,这种模式下,子接口之间就是直接可以通信的,也可以和父接口通信。

macvlan和host性能比较 macvlan ipvlan_Ethernet_05

3.4 passthru

这种模式,只允许单个子接口连接主接口,且必须设置成混杂模式,一般用于子接口桥接和创建 VLAN 子接口的场景。

macvlan和host性能比较 macvlan ipvlan_IP_06

3.5 mactap 没有mactun这样的设备 tun属于三层。mac开头的都是2层

和 macvlan 相似的技术还有一种是 mactap。和 macvlan 不同的是,mactap 收到包之后不是交给协议栈,而是交给一个 tapX 文件/dev/net/tapX,然后通过这个文件,完成和用户态的直接通信。

macvlan和host性能比较 macvlan ipvlan_macvlan和host性能比较_07

04 实践

在 Linux 系统下,创建 macvlan 的命令形式如下:

在 Linux 系统下,创建 macvlan 的命令形式如下:

  1. ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru [ nopromisc ] }

通常,单独使用 macvlan 毫无意义,一般都是结合 VM 和容器来构建网络。下面我们就简单使用 namespace 来看看 Linux 是怎么使用 macvlan 的。

namespace :ip netns add ns1  也代表的是一个网络空间 ns1 就是代表一个vm或容器。但也只是网络隔离,没有pid,进程,相关的隔离

Linux Namespace

Linux Namespace(命名空间)是一种操作系统层级的资源隔离技术,能够将 Linux 的全局资源,划分为 namespace 范围内的资源,而且不同 namespace 间的资源彼此透明,不同 namespace 里的进程无法感知到其它 namespace 里面的进程和资源。

Linux namespace 实现了 6 项资源隔离,基本上涵盖了一个小型操作系统的运行要素,包括主机名、用户权限、文件系统、网络、进程号、进程间通信。Linux Namespace 是操作系统虚拟化技术(e.g. 容器)的底层实现支撑。

macvlan和host性能比较 macvlan ipvlan_文件系统_08

Linux Namespace 的类型

  • UTS namespace 提供了 hostname 和 domain 的隔离,这样每个容器就拥有独立的主机名和域名了,在网络上就可以被视为一个独立的节点,在容器中对 hostname 的命名不会对宿主机造成任何影响。
  • PID namespace 完成的是进程号的隔离,保证了容器的 init 进程是以 1 号进程来启动的。
  • IPC namespace 实现了进程间通信的隔离,包括常见的几种进程间通信机制,例如:信号量,消息队列和共享内存。我们知道,要完成 IPC,需要申请一个全局唯一的标识符,即 IPC 标识符,所以 IPC 资源隔离主要完成的就是隔离 IPC 标识符。
  • Mount namespace 通过隔离文件系统的挂载点来达到对文件系统的隔离。保证了容器看到的文件系统的视图,是容器镜像提供的一个文件系统,也就是说它看不见宿主机上的其它文件,除了通过 -v 参数 bound 的那种模式,是可以把宿主机上面的一些目录和文件,让它在容器里面可见的;
  • Network namespace 实现了操作系统层面的网络资源隔离,包括网络设备接口、IPv4 和 IPv6 协议栈,IP 路由表,防火墙,/proc/net 目录,/sys/class/net 目录,Sockets 套接字等资源。同一个网络设备只能位于一个 Network namespace 中,不同 namespace 中的网络设备可以利用 veth pair 进行桥接。
  • User namespace 主要隔离了安全相关的标识符和属性,包括 User ID、User Group ID、root 目录、key 以及特殊权限。

实际上,还有第 7 个是 cgroup namespace。Docker 中用到了前六种,第 7 种 cgroup namespace 在 Docker 本身并没有用到,但是在 runC 实现中实现了 cgroup namespace。用 cgroup namespace 带来的一个好处是容器中看到的 cgroup 视图是以根的形式来呈现的,这样的话就和宿主机上面进程看到的 cgroup namespace 的一个视图方式是相同的,另外一个好处是让容器内部使用 cgroup 会变得更安全。

实验拓扑如下:

macvlan和host性能比较 macvlan ipvlan_文件系统_09

在我的系统中,以接口 enp0s8 为例创建两个 macvlan 子接口(使用 bridge 模式),配置 IP 并将其挂到两个 namespace 中,测试连通性。

# 创建两个 macvlan 子接口
[root@localhost ~]# ip link add link enp49s0f1 dev mac1 type macvlan mode bridge
[root@localhost ~]# ip link add link enp49s0f1 dev mac2 type macvlan mode bridge
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp49s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether d4:5d:64:07:a8:ea brd ff:ff:ff:ff:ff:ff
3: enp49s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether d4:5d:64:07:a8:eb brd ff:ff:ff:ff:ff:ff
110: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:03:f4:36:a8 brd ff:ff:ff:ff:ff:ff
115: mac1@enp49s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff
116: mac2@enp49s0f1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff

# 创建两个 namespace
[root@localhost ~]# ip netns add ns1
[root@localhost ~]# ip netns add ns2
[root@localhost ~]# ip netns list
ns2
ns1

# 将两个子接口分别挂到两个 namespace 中
[root@localhost ~]# ip link set dev mac1 netns ns1
[root@localhost ~]# ip link set dev mac2 netns ns2
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp49s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether d4:5d:64:07:a8:ea brd ff:ff:ff:ff:ff:ff
3: enp49s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether d4:5d:64:07:a8:eb brd ff:ff:ff:ff:ff:ff
110: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:03:f4:36:a8 brd ff:ff:ff:ff:ff:ff

# 配置 IP 并启用 ip netns exec ns1 dhclient mac1或ip netns exec ns1 ip address add 10.10.1.20/24 dev mac1   注: enp49s0f1  的 IP 是 10.10.1.20/24,配置的子接口 IP 也必须是同一网段的。
[root@localhost ~]# ip netns exec ns1 dhclient mac1 
dhclient(38370) is already running - exiting.                       说名pid进程没有隔离

This version of ISC DHCP is based on the release available
on ftp.isc.org.  Features have been added and other changes
have been made to the base software release in order to make
it work better with this distribution.

Please report for this software via the CentOS Bugs Database:
    http:///

exiting.
[root@localhost ~]# kill -9 38370   杀死dhclient进程
[root@localhost ~]# ip netns exec ns1 dhclient mac1
[root@localhost ~]# ip netns exec ns2 dhclient mac2
dhclient(113930) is already running - exiting.                       说名pid进程没有隔离

This version of ISC DHCP is based on the release available
on ftp.isc.org.  Features have been added and other changes
have been made to the base software release in order to make
it work better with this distribution.

Please report for this software via the CentOS Bugs Database:
    http:///

exiting.
[root@localhost ~]# kill -9 113930
[root@localhost ~]# ip netns exec ns2 dhclient mac2
[root@localhost ~]# ip netns exec ns1 ip link set dev mac1 up
[root@localhost ~]# ip netns exec ns2 ip link set dev mac2 up
[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
115: mac1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.1.127/24 brd 10.10.1.255 scope global dynamic mac1
       valid_lft 86351sec preferred_lft 86351sec
    inet6 fe80::741e:ffff:fe99:9cd8/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec ns2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
116: mac2@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.1.115/24 brd 10.10.1.255 scope global dynamic mac2
       valid_lft 86365sec preferred_lft 86365sec
    inet6 fe80::8c45:afff:fe31:caca/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]#

完了两个子接口 ping 一下:ping自己不通,ping其他子接口和父接口父接口的网关都是通的 

[root@localhost ~]# ip netns exec ns1 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
115: mac1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.1.127/24 brd 10.10.1.255 scope global dynamic mac1
       valid_lft 86065sec preferred_lft 86065sec
    inet6 fe80::741e:ffff:fe99:9cd8/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec ns2 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
116: mac2@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.10.1.115/24 brd 10.10.1.255 scope global dynamic mac2
       valid_lft 86078sec preferred_lft 86078sec
    inet6 fe80::8c45:afff:fe31:caca/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec ns1 ping 10.10.1.115
PING 10.10.1.115 (10.10.1.115) 56(84) bytes of data.
64 bytes from 10.10.1.115: icmp_seq=1 ttl=64 time=0.095 ms
^C
--- 10.10.1.115 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.095/0.095/0.095/0.000 ms
[root@localhost ~]# ip netns exec ns1 ping 10.10.1.127
PING 10.10.1.127 (10.10.1.127) 56(84) bytes of data.
^C
--- 10.10.1.127 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

[root@localhost ~]# ip netns exec ns1 ping 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 56(84) bytes of data.
64 bytes from 10.10.1.1: icmp_seq=1 ttl=255 time=4.37 ms
^C
--- 10.10.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 4.375/4.375/4.375/0.000 ms
[root@localhost ~]# ip netns exec ns1 ping 10.10.1.2
PING 10.10.1.2 (10.10.1.2) 56(84) bytes of data.
64 bytes from 10.10.1.2: icmp_seq=1 ttl=64 time=0.172 ms
^C
--- 10.10.1.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.172/0.172/0.172/0.000 ms

可以看到,能够 ping 通,如果把上面的 mode 换成其他模式就行不通了,这个就留给大家去实验了(默认是 vepa 模式)。

另外,在 docker 中,macvlan 是一种较为重要的跨主机网络模型,这块的内容就留作下篇文章再做讲解了。

经过确认可以知道mac1与mac2都正确分配到了网段10.10.1.0/24中的地址。创建的虚拟网卡既可以给本地宿主机使用,也可以指定宿主机上创建的虚拟机。

macvlan作用

        从以上的创建步骤可以看出,macvlan并没有创建网络,只是虚拟了网卡,共享了物理网卡所连接的外部网络,它的效果与桥接模式是一样的。网络虚拟化的目的就是在多租户场景,在统一的低层网络之上,单独为每个租户虚拟出自己的网络从而达到隔离的目的。macvlan既然不创建网络,又有什么用处呢?答案是效率,它是效率最高的跨主机网络虚拟化解决方案之一。vlan与vxlan方案中涉及到的虚拟化设备:

1.tap设备,就是虚拟机的网卡。

2.bridge设备,宿主机内的网络。

3.vlan/vxlan设备。

而macvlan只涉及到一个虚拟设备macvlan。可以看出,macvlan方案涉及到的虚拟设备更少,数据包处理所经过的点就更少,效率就更高。macvlan会出现在一些对网络性能要求极高的场景下.

05 总结

macvlan 是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。

macvlan 的四种通信模式,常用模式是 bridge。

思考一下:

  1. macvlan bridge 和 bridge 的异同点?  
  2. 还有一种类似的技术,多张虚拟网卡共享相同 MAC 地址,但有独立的 IP 地址,这是什么技术?这是vlan技术,vlan和macvlan区别