参考连接:
网卡虚拟化技术 macvlan
Linux 虚拟网络设备:tap/tun、veth-pair、bridge,它们本质上是 Linux 系统 提供的网络虚拟化解决方案,今天要讲的 macvlan 也是其中的一种,准确说这是一种网卡虚拟化的解决方案。因为 macvlan 这种技术能将 一块物理网卡虚拟成多块虚拟网卡
macvlan 的工作原理
macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比较稳定的版本推荐 4.0+。它一般是以内核模块的形式存在,我们可以通过以下方法判断当前系统是否支持:
$ modprobe macvlan
$ lsmod | grep macvlan
macvlan 24576 0
macvlan 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。
四种模式
根据 macvlan 子接口之间的通信模式,macvlan 有四种网络模式:
- private 模式
- vepa(virtual ethernet portaggregator) 模式
- bridge 模式
- passthru 模式 默认使用的是 vepa 模式。
private
这种模式下,同一主接口下的子接口之间彼此隔离,不能通信。即使从外部的物理交换机导流,也会被无情地丢掉
vepa
这种模式下,子接口之间的通信流量需要导到外部支持 802.1Qbg/VPEA 功能的交换机上(可以是物理的或者虚拟的),经由外部交换机转发,再绕回来。
注:802.1Qbg/VPEA 功能简单说就是交换机要支持 发夹(hairpin) 功能,也就是数据包从一个接口上收上来之后还能再扔回去(因为子接口对应交换机的同一个插口)
bridge
这种模式下,模拟的是 Linux bridge 的功能,但比 bridge 要好的一点是每个接口的 MAC 地址是已知的,不用学习。所以,这种模式下,子接口之间就是直接可以通信的。
passthru
passthru模式不是很清楚.
以上四种模式下, 子接口都无法通父接口eth0通信
mactap
和 macvlan 相似的技术还有一种是 mactap。和 macvlan 不同的是,mactap 收到包之后不是交给协议栈,而是交给一个 tapX 文件,然后通过这个文件,完成和用户态的直接通信
实践
通常,单独使用 macvlan 毫无意义,一般都是结合 VM 和容器来构建网络。下面我们就简单使用 namespace 来看看 Linux 是怎么使用 macvlan 的。
实验拓扑如下:
创建网络
以接口 ens33 为例创建两个 macvlan 子接口(使用 bridge 模式),配置 IP 并将其挂到两个 namespace 中
# 创建两个 macvlan 子接口
$ ip link add link ens33 dev mac1 type macvlan mode bridge
$ ip link add link ens33 dev mac2 type macvlan mode bridge
# 创建两个 namespace
$ ip netns add ns1
$ ip netns add ns2
# 将两个子接口分别挂到两个 namespace 中
$ ip link set mac1 netns ns1
$ ip link set mac2 netns ns2
# 配置 IP 并启用
$ ip netns exec ns1 ip a a 192.168.31.121/24 dev mac1
$ ip netns exec ns1 ip l s mac1 up
$ ip netns exec ns2 ip a a 192.168.31.122/24 dev mac2
$ ip netns exec ns2 ip l s mac2 up
测试
- 两个子接口 ping 一下
$ ip netns exec ns1 ping 192.168.31.122
能够 ping 通,如果把上面的 mode 换成其他模式就行不通了
- 同一网段局域网中的另一台主机ping两个子接口
在另一台主机上运行:
ping 192.168.31.122
也是可以ping通的
- 本机ping两个子接口
在本机上运行:
ping 192.168.31.122