macvlan是kernel提供的一种网卡虚拟化技术,可以将网卡(不一定是真是的物理网卡,virtio等虚拟网卡也可以)虚拟出多个接口,这个网卡称为master或者父接口,这些虚拟接口和外面环境通信都是通过父接口。作用的话比如用于k8s的macvlan cni。
macvlan提供了五种模式: bridge, vepa, private, passthrough和source
private mode:
这种模式下,同一父接口下的子接口之间彼此隔离,不能通信。即
使从外部的交换机导流再次被父接口接收,也会被无情地丢掉。
vepa mode:
这种模式下,子接口之间的通信流量需要导到外部支持
802.1Qbg/VPEA 功能的交换机上(可以是物理的或者虚拟的),
经由外部交换机转发,再绕回来。
注:802.1Qbg/VPEA 功能简单说就是交换机要支持 发夹
(hairpin) 功能,也就是数据包从一个接口上收上来之后还能再扔
回去。
bridge mode:
这种模式下,模拟的是 Linux bridge 的功能,但比 bridge 要好的一
点是每个接口的 MAC 地址是已知的,不用学习。所以,这种模式
下,子接口之间就是直接可以通信的。
passthru mode:
这种模式,只允许单个子接口连接父接口。
source mode:
这种模式,只接收源mac为指定的mac地址的报文。
下面图片是在网上截图的,各个模式下,数据如何转发。不管哪种模式,子接口都不能和父接口通信。
image.png
下面是通过ip命令创建macvlan接口的help信息
root@node2:~# ip link add link ens8 dev macvlan1 type macvlan help
Usage: ... macvlan mode MODE [flag MODE_FLAG] MODE_OPTS
MODE: private | vepa | bridge | passthru | source
MODE_FLAG: null | nopromisc -->只针对passthru模式
MODE_OPTS: for mode "source": -->只针对source模式
macaddr { { add | del } | set [ [ ... ] ] | flush }
有两个选项需要注意:
a. nopromisc 配置只针对passthru模式
b. 添加macaddr的选项只针对source模式,以便在source模式下只接收从外部接收的源mac这些设定的值的报文
如何查看父接口和子接口的对应关系
a. 如果子接口和父接口都在同一个namespace,比如都在root namespace,则可以通过查看 /sys/class/net/xxx/下的链接文件获知。
注意两个前缀lower和upper,对于macvlan,从层级上看,父接口是网卡,子接口是虚拟出来的,所以父接口在下面,子接口在上面,所以lower表示父接口,而upper表示子接口。
#查看macvlan子接口的父接口(macvlan1的父接口为ens8)
root@node2:~# ls -l /sys/class/net/macvlan1/lower*
lrwxrwxrwx 1 root root 0 Oct 27 13:55 /sys/class/net/macvlan1/lower_ens8 -> ../../../pci0000:00/0000:00:08.0/net/ens8
#查看父接口的macvlan子接口(ens8有两个子接口: macvlan1和macvlan2)
root@node2:~# ls -l /sys/class/net/ens8/upper*
lrwxrwxrwx 1 root root 0 Oct 27 13:55 /sys/class/net/ens8/upper_macvlan1 -> ../../../../virtual/net/macvlan1
lrwxrwxrwx 1 root root 0 Oct 27 13:56 /sys/class/net/ens8/upper_macvlan2 -> ../../../../virtual/net/macvlan2
b. 如果子接口和父接口不在同一个namespace,比如将子接口放在其他namespace,方法a就不生效了。可查看网卡名字@后面的数字,比如下面的macvlan1@if3和macvlan2@if3,@后面的if3,表示对应root namespace的网卡索引,即ens8的索引号。
root@node2:~# ip netns exec test1 ip a
...
8308: macvlan1@if3: mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ce:dc:2c:c2:e3:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 1.1.1.3/24 scope global macvlan1
valid_lft forever preferred_lft fore