linux修改vlan子接口mac地址,macvlan虚拟接口

本文详细介绍了Linux中macvlan接口的工作原理和不同模式,包括private、vepa、bridge、passthru及source模式。通过示例展示了如何创建macvlan子接口并配置其工作模式,以及子接口与父接口之间的关系。此外,还探讨了如何查看和理解macvlan子接口的MAC地址,以及在不同模式下的通信行为。
摘要由CSDN通过智能技术生成

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地址的报文。

下面图片是在网上截图的,各个模式下,数据如何转发。不管哪种模式,子接口都不能和父接口通信。

a599d2a9a1ef

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值