上一篇文章讨论了几个Linux虚拟网络设备:tap/tun,veth-pair,bridge,它们本质上是Linux系统提供的网络虚拟化解决方案。今天要讨论的macvlan就是其中之一。这是网卡虚拟化的解决方案。由于macvlan技术可以将物理网卡虚拟化为多个虚拟网卡,因此它相当于物理网卡显示多个阴影,从一个到多个。
02 macvlan如何运作?
Macvlan是Linux内核支持的新功能。支持的版本是v3.9-3.19和4.0+,更稳定的版本建议4.0+。它通常以内核模块的形式存在。我们可以通过以下方法确定当前系统是否支持它:
#modprobe macvlan
#lsmod | grep macvlan
Macvlan 24576 0
如果第一个命令报告错误,或者第二个命令没有返回,则当前系统不支持macvlan并且需要升级内核。
macvlan的技术听起来有点像VLAN,但它们的实现机制完全不同。 macvlan子接口完全独立于原始主接口。 MAC地址和IP地址可以单独配置。 VLAN子接口和主接口共享相同的MAC地址。 VLAN用于划分广播域,而macvlan共享相同的广播域。
通过不同的子接口,macvlan还可以隔离流量。 Macvlan将根据接收到的数据包的目标MAC地址判断数据包需要切换到哪个虚拟网卡,然后虚拟网卡将数据包移交给上层协议栈进行处理。
03四种模式
根据macvlan子接口之间的通信方式,macvlan有四种网络模式:
私人模式
Vepa(虚拟以太网端口聚合器)模式桥接模式
Passthru模式
默认为vepa模式。
3.1私人
在这种模式下,同一主接口上的子接口彼此隔离,无法通信。即使它从外部物理开关转移,它也会被无情地丢失。
3.2 vepa
在此模式下,子接口之间的流量需要路由到支持802.1Qbg/VPEA(物理或虚拟)的外部交换机,通过外部交换机转发,然后重新回退。
注意:802.1Qbg/VPEA功能只是交换机需要支持发夹功能,也就是说,数据包在从接口接收后可以被抛回。
3.3桥
在这种模式下,Linux桥的功能是模拟的,但是比桥更好的是每个接口的MAC地址都是已知的,你不需要学习。因此,在这种模式下,子接口可以直接通信。
3.4 passthru
此模式仅允许将单个子接口连接到主接口,并且必须设置为混杂模式。这通常用于子接口桥接和创建VLAN子接口。
3.5 mactap
另一种类似于macvlan的技术是mactap。与macvlan不同,在maccap接收到数据包之后,它不会被移交给协议栈,而是被移交给tapX文件,然后该文件完成与用户模式的直接通信。
04练习
在Linux系统上,创建macvlan的命令如下:
IP链接添加链接设备名称名称类型{macvlan | macvtap} mode {private | vepa |桥|
Passthru [nopromisc]}
通常,单独使用macvlan是没有意义的,并且通常使用VM和容器构建网络。下面我们简单地使用命名空间来查看Linux如何使用macvlan。
实验拓扑结构如下:
在我的系统中,创建两个macvlan子接口(使用桥接模式),以接口enp0s8为例,配置IP并将其挂在两个命名空间中以测试连接。
#创建两个macvlan子接口
ip link添加链接enp0s8 dev mac1类型的macvlan模式桥ip link添加链接enp0s8 dev mac2类型的macvlan模式桥
#创建两个名称空间
Ip netns添加ns1
Ip netns添加ns2
#在两个名称空间中挂起两个子接口
IP链接设置mac1 netns ns1
ip链接设置mac2 netns ns2
#配置IP并启用
Ip netns exec ns1 ip a a 192.168.56.122/24 dev mac1
Ip netns exec ns1 ip l s mac1 up
Ip netns exec ns1 ip a a 192.168.56.123/24 dev mac2
Ip netns exec ns2 ip l s mac2 up
注意:enp0s8的IP为192.168.56.110/24,配置的子接口IP也必须在同一网段。
完成两个子接口后,ping它:
Root @ ubuntu:~#ip netns exec ns1 ip a show mac1
9: mac1 @ if3: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
链接/以太2e: 6e: d9: 08: c5: 05 brd ff: ff: ff: ff: ff: ff link-netnsid 0
Inet 192.168.56.122/24范围全局mac1
Valid_lft永远是preferred_lft永远
Inet6 fe80:: 2c6e: d9ff: fe08: c505/64示波器链接
Valid_lft永远是preferred_lft永远
Root @ ubuntu:~#ip netns exec ns1 ping 192.168.56.123
PING 192.168.56.123(192.168.56.123)56(84)字节的数据。来自192.168.56.123的64字节: icmp_seq=1 ttl=64 time=0.052 ms
64字节来自192.168.56.123: icmp_seq=2 ttl=64 time=0.028 ms
^ C
--- 192.168.56.123 ping统计---
2个包传输,2个接收,0%丢包,时间1000ms
Rtt min/avg/max/mdev=0.028/0.040/0.052/0.012 ms
如您所见,您可以ping通。如果将上述模式更改为其他模式,则无法使用。这留给每个人进行实验(默认为vepa模式)。
另外,在docker中,macvlan是一个更重要的跨主机网络模型,这篇文章的内容将作为下一篇文章进行解释。
05总结
Macvlan是一种网卡虚拟化技术,可以将多个网卡虚拟化为一个网卡。
macvlan的四种通信方式,共模是桥接。
想一会儿:
macvlan桥和桥之间有什么相似之处和不同之处?
有一种类似的技术,其中多个虚拟NIC共享相同的MAC地址但具有单独的IP地址。什么是技术?