本文主要是介绍macvlan和macvtap介绍和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考文献:
https://blog.csdn.net/dkfajsldfsdfsd/article/details/79525187
http://www.qingpingshan.com/m/view.php?aid=389184
学习这个的目的,是为了了解下面的内容:
https://github.com/containernetworking/plugins
01 macvlan 简介
前面的文章讲过了几种 Linux 虚拟网络设备:tap/tun、veth-pair、bridge,它们本质上是 Linux 系统 提供的网络虚拟化解决方案,今天要讲的 macvlan 也是其中的一种,准确说这是一种网卡虚拟化的解决方案。因为 macvlan 这种技术能将 一块物理网卡虚拟成多块虚拟网卡 ,相当于物理网卡施展了 多重影分身之术 ,由一个变多个。它可以为一张物理同时要求物理网卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本来是一块物理网卡连接到交换机,现在是多块虚拟网卡连接到交换机。macvlan应该很简单。
mavclan要知道的小知识点
macvlan并不创建网络,只创建虚拟网卡,(网络和网卡的区别)
- macvlan会
共享物理网卡
所链接的外部网络
,实现的效果跟桥接模式是一样的。
macvlan 既不创建网络,主要有什么特性?或者说,macvlan的使用场景?
- macvlan主要是用来解决效率问题的。
- 也就是说macvlan是效率贵高的跨主机网络虚拟化解决方案之一。
- 适合在对网络性能要求极高的场景下。
-
网络虚拟化的目的?
就是在多租户场景下,在统一的底层网络之上,单独为每个租户
虚拟出自己的网络从而达到隔离
的目的。 -
macvlan属于什么解决方案呢?或者说,macvlan到底是干什么的,? 或者说,有什么用?
- macvlan是网卡虚拟化方案
- macvlan将一张物理网卡设置多个mac地址,就是一变多,一对多;类似于鸣人的影分身之术,
注意: 需要物理网卡,打开混杂模
-
[root@localhost ~]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0ether 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 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0enp49s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.10.1.2 netmask 255.255.255.0 broadcast 10.10.1.255inet6 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 0TX packets 197292 bytes 17180026 (16.3 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device memory 0xe6e20000-e6e3ffff enp49s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.10.1.3 netmask 255.255.255.0 broadcast 10.10.1.255inet6 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 0TX packets 15528 bytes 1014159 (990.3 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device memory 0xe6e00000-e6e1ffff lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::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 0TX 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 1500inet 10.10.1.3 netmask 255.255.255.0 broadcast 10.10.1.255inet6 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 0TX packets 15533 bytes 1014464 (990.6 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device memory 0xe6e00000-e6e1ffff
-
既然有了多个mac地址,就可以设置多个IP地址了,从而实现,一块物理网卡链接到交换机,变成多个虚拟网卡链接到交换机。
- 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 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。
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
这种模式下,同一主接口下的子接口之间彼此隔离,不能通信。即使从外部的物理交换机导流,也会被无情地丢掉。(子接口之间不可以通信,但是可以和父接口直接通信)
3.2 vepa
这种模式下,子接口之间的通信流量需要导到外部支持 802.1Qbg/VPEA
功能的交换机上(可以是物理的或者虚拟的{bridge}),经由外部交换机转发,再绕回来。
注: 802.1Qbg/VPEA
功能简单说就是交换机要支持 发夹(hairpin)
功能,也就是数据包从一个接口上收上来之后还能再扔回去。
3.3 bridge
这种模式下,模拟的是 Linux bridge 的功能,但比 bridge 要好的一点是每个接口的 MAC 地址是已知的,不用学习。所以,这种模式下,子接口之间就是直接可以通信的,也可以和父接口通信。
3.4 passthru
这种模式,只允许单个子接口连接主接口,且必须设置成混杂模式,一般用于子接口桥接和创建 VLAN 子接口的场景。
3.5 mactap 没有mactun这样的设备 tun属于三层。mac开头的都是2层
和 macvlan 相似的技术还有一种是 mactap。和 macvlan 不同的是,mactap 收到包之后不是交给协议栈,而是交给一个 tapX 文件/dev/net/tapX,然后通过这个文件,完成和用户态的直接通信。
04 实践
在 Linux 系统下,创建 macvlan 的命令形式如下:
在 Linux 系统下,创建 macvlan 的命令形式如下:
-
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. 容器)的底层实现支撑。
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 会变得更安全。
实验拓扑如下:
在我的系统中,以接口 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 1000link/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 1000link/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 1000link/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 1000link/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 1000link/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 1000link/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 1000link/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 1000link/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://bugs.centos.org/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://bugs.centos.org/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 1000link/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 1000link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.127/24 brd 10.10.1.255 scope global dynamic mac1valid_lft 86351sec preferred_lft 86351secinet6 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 1000link/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 1000link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.115/24 brd 10.10.1.255 scope global dynamic mac2valid_lft 86365sec preferred_lft 86365secinet6 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 1000link/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 1000link/ether 76:1e:ff:99:9c:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.127/24 brd 10.10.1.255 scope global dynamic mac1valid_lft 86065sec preferred_lft 86065secinet6 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 1000link/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 1000link/ether 8e:45:af:31:ca:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.10.1.115/24 brd 10.10.1.255 scope global dynamic mac2valid_lft 86078sec preferred_lft 86078secinet6 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 是一种较为重要的跨主机网络模型,这块的内容就留作下篇文章再做讲解了。https://blog.csdn.net/Michaelwubo/article/details/110483589
经过确认可以知道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。
思考一下:
-
macvlan bridge 和 bridge 的异同点?
-
还有一种类似的技术,多张虚拟网卡共享相同 MAC 地址,但有独立的 IP 地址,这是什么技术?这是vlan技术,vlan和macvlan区别
参考
https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247485246&idx=1&sn=c42a3618c357ebf5f6b7b7ce78ae568f&chksm=ea743386dd03ba90ad65940321385f68f9315fec16d82a08efa12c18501d8cadf95cf9e614a2&scene=21#wechat_redirect
https://www.jianshu.com/p/2b8b6c738bf6
https://blog.csdn.net/dkfajsldfsdfsd/article/details/79525187
这篇关于macvlan和macvtap介绍和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!