macvlan和macvtap介绍和使⽤
01 macvlan 简介
前⾯的⽂章讲过了⼏种 Linux 虚拟⽹络设备:tap/tun、veth-pair、bridge,它们本质上是 Linux 系统 提供的⽹络虚拟化解决⽅案,今天要讲的 macvlan 也是其中的⼀种,准确说这是⼀种⽹卡虚拟化的解决⽅案。因为 macvlan 这种技术能将 ⼀块物理⽹卡虚拟成多块虚拟⽹卡 ,相当于物理⽹卡施展了 多重影分⾝之术 ,由⼀个变多个。它可以为⼀张物理同时要求物理⽹卡打开混杂模式。针对每个mac地址,都可以设置IP地址,本来是⼀块物理⽹卡连接到交换机,现在是多块虚拟⽹卡连接到交换机。macvlan应该很简单。
mavclan要知道的⼩知识点
macvlan并不创建⽹络,只创建虚拟⽹卡,(⽹络和⽹卡的区别)
macvlan会共享物理⽹卡所链接的外部⽹络,实现的效果跟桥接模式是⼀样的。
1. macvlan 既不创建⽹络,主要有什么特性?或者说,macvlan的使⽤场景?
namespace是干嘛的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>
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 地址是已知的,不⽤学习。所以,这种模式下,⼦接⼝之间就是直接可以通信的,也可以和⽗接⼝通信。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论