介绍

macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。macvlan 本质上是一种网卡虚拟化技术(最大优点是性能极好)

可以在linux命令行执行lsmod | grep macvlan 查看当前内核是否加载了该driver;如果没有查看到,可以通过modprobe macvlan来载入,然后重新查看。内核代码路径/drivers/net/macvlan.c

Macvlan 允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络 interface 有自己独立的 MAC 地址,也可以配置上 IP 地址进行通信。Macvlan 下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域。Macvlan 和 Bridge 比较相似,但因为它省去了 Bridge 的存在,所以配置和调试起来比较简单,而且效率也相对高。除此之外,Macvlan 自身也完美支持 VLAN

工作模式(Bridge VS MACVlan)

Bridge Mode

  • Bridge 是二层设备,仅用来处理二层的通讯。

  • Bridge 使用 MAC 地址表来决定怎么转发帧(Frame)。

  • Bridge 会从 host 之间的通讯数据包中学习 MAC 地址。

  • 可以是硬件设备,也可以是纯软件实现(例如:Linux Bridge)。

提示:

Bridge 有可能会遇到二层环路,如有需要,可以开启 STP 来防止出现环路。


MACVlan Mode

  • 可让使用者在同一张实体网卡上设定多个 MAC 地址。

  • 上述设定的 MAC 地址的网卡称为子接口(sub interface);而实体网卡则称为父接口(parent interface)。

  • parent interface 可以是一个物理接口(eth0),可以是一个 802.1q 的子接口(eth0.10),也可以是 bonding 接口。

  • 可在 parent/sub interface 上设定的不只是 MAC 地址,IP 地址同样也可以被设定。

  • sub interface 无法直接与 parent interface 通讯 (带有 sub interface 的 VM 或容器无法与 host 直接通讯)。

  • 若 VM 或容器需要与 host 通讯,那就必须额外建立一个 sub interface 给 host 用。

  • sub interface 通常以 mac0@eth0 的形式来命名以方便区別。

MACVlan模式

  • Bridge:属于同一个parent接口的macvlan接口之间挂到同一个bridge上,可以二层互通(macvlan接口都无法与parent 接口互通)。

  • VPEA(Virtual Ethernet Port Aggregator):所有接口的流量都需要到外部switch才能够到达其他接口。
  • Private:接口只接受发送给自己MAC地址的报文。

  • Passthru: 父接口和相应的MacVLAN接口捆绑在一起,这种模式每个父接口只能和一个 Macvlan 虚拟网卡接口进行捆绑,并且 Macvlan 虚拟网卡接口继承父接口的 MAC 地址。

前三种模式示意图:


实验

Bridge Mode:创建了两个macvlan接口,分别放到两个netns中;然后验证这两个macvlan口之间客户互通。

设置网卡混杂模式(PROMISC网卡混杂标志):

[root@localhost ~]#ifconfig ens224 promisc

[root@localhost ~]# ifconfig ens224

ens224: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500

………………

创建两个macvlan接口,其parent接口都是ens224

[root@localhost ~]# ip link add link ens224 name macv1 type macvlan mode bridge

[root@localhost ~]# ip link add link ens224 name macv2 type macvlan mode bridge

查看接口状态:

创建namespace

[root@localhost ~]# ip netns add net1

[root@localhost ~]# ip netns add net2

将macvlan接口插入到namespace

[root@localhost ~]# ip link set macv1 netns net1

[root@localhost ~]# ip link set macv2 netns net2

设置网卡IP,设置网卡UP状态

ip netns exec net1 ip addr add 52.1.1.151/24 dev macv1

ip netns exec net2 ip addr add 52.1.1.152/24 dev macv2

设置网卡IP,设置网卡UP状态

[root@localhost ~]#ip netns exec net1 ip addr add 52.1.1.151/24 dev macv1

[root@localhost ~]#ip netns exec net2 ip addr add 52.1.1.152/24 dev macv2

[root@localhost ~]#ip netns exec net1 ip link set macv1 up

[root@localhost ~]#ip netns exec net2 ip link set macv2 up

查看网卡状态

[root@localhost ~]# ip netns exec net1 ip a

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

4: macv1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
     link/ether 4e:a1:51:a9:3f:ef brd ff:ff:ff:ff:ff:ff link-netnsid 0
     inet 52.1.1.151/24 scope global eth0
     valid_lft forever preferred_lft forever

[root@localhost ~]# ip netns exec net2 ip a

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

5: macv2@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
     link/ether fe:b5:85:c1:77:c1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
     inet 52.1.1.152/24 scope global macv2
     valid_lft forever preferred_lft forever

ping测试结果:

net1和net2无法ping通宿主机,ping自己也不通.2个容器互相ping没有问题

更改容器内网卡名字

ip netns exec net1 ip link set mac1 name eth0

ipvlan

IPVlan 和 macvlan 类似,都是从一个主机接口虚拟出多个虚拟网络接口。一个重要的区别就是所有的虚拟接口都有相同的 macv 地址,而拥有不同的 ip 地址。因为所有的虚拟接口要共享 mac 地址,所有有些需要注意的地方:

  • DHCP 协议分配 ip 的时候一般会用 mac 地址作为机器的标识。这个情况下,客户端动态获取 ip 的时候需要配置唯一的 ClientID 字段,并且 DHCP server 也要正确配置使用该字段作为机器标识,而不是使用 mac 地址

Ipvlan 是 linux kernel 比较新的特性,linux kernel 3.19 开始支持 ipvlan,但是比较稳定推荐的版本是 >=4.2(因为 docker 对之前版本的支持有 bug),具体代码见内核目录:/drivers/net/ipvlan/

ipvlan模式

L2:

ipvlan L2 模式和 macvlan bridge 模式工作原理很相似,父接口作为交换机来转发子接口的数据。同一个网络的子接口可以通过父接口来转发数据,而如果想发送到其他网络,报文则会通过父接口的路由转发出去。

L3:

ipvlan 有点像路由器的功能,它在各个虚拟网络和主机网络之间进行不同网络报文的路由转发工作。只要父接口相同,即使虚拟机/容器不在同一个网络,也可以互相 ping 通对方,因为 ipvlan 会在中间做报文的转发工作。

模式架构图:

实验

创建IPVlan L3模式

[root@localhost ~]#ip link add link ens224 ipvlan1 type ipvlan mode l3

[root@localhost ~]#ip link add link ens224 ipvlan2 type ipvlan mode l3

注意看ipvlan1 和ipvlan2 的MAC地址跟ens224的一样

[root@localhost ~]# ip link

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
     link/ether 00:0c:29:05:18:ac brd ff:ff:ff:ff:ff:ff

3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
     link/ether 00:0c:29:05:18:b6 brd ff:ff:ff:ff:ff:ff

4: ipvlan1@enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
     link/ether 00:0c:29:05:18:b6 brd ff:ff:ff:ff:ff:ff

5: ipvlan2@enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
     link/ether 00:0c:29:05:18:b6 brd ff:ff:ff:ff:ff:ff

创建ns绑定接口

[root@localhost ~]#ip net add net-1

[root@localhost ~]#ip net add net-2

[root@localhost ~]#ip link set ipvlan1 netns net-1

[root@localhost ~]#ip link set ipvlan2 netns net-2

配置IP

[root@localhost ~]#ip net exec net-1 ip addr add 10.0.2.18/24 dev ipvlan1

[root@localhost ~]#ip net exec net-2 ip addr add 10.0.3.19/24 dev ipvlan2

[root@localhost ~]#ip net exec net-1 ip link set ipvlan1 up

[root@localhost ~]#ip net exec net-2 ip link set ipvlan2 up

增加路由

[root@localhost ~]#ip net exec net-1 route add default dev ipvlan1

[root@localhost ~]#ip net exec net-2 route add default dev ipvlan2

ping测试

2个ns可以正常互相ping通,无法ping通宿主机IP

抓取ARP报文,结果无法在L3模式中抓到ARP,说明二层广播和组播都不处理,工作在L3.(这就是和L2模式的区别)

[root@localhost ~]#ip net exec net-1 tcpdump -ni ipvlan1 -p arp

创建L2模式,其余操作跟L3一样

ip link add link enp0s3 ipvlan1 type ipvlan mode l2

ip link add link enp0s3 ipvlan2 type ipvlan mode l2

区别在于L2可以在2个ns中抓取到ARP报文

总结:
       ipvlan L3模式中外部网络默认情况下是不知道 ipvlan 虚拟出来的网络的,如果不在外部路由器上配置好对应的路由规则,ipvlan 的网络是不能被外部直接访问的。

Macvlan 和 IPvlan的更多相关文章

  1. [docker] macvlan最佳实战

    macvlan和ipvlan的对比 http://hicu.be/macvlan-vs-ipvlan macvlan ipvlan 参考: https://yq.aliyun.com/articles ...

  2. linux网络虚拟化

    图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN http://smilejay.com/2012/08/qemu-kvm-networking-m ...

  3. 浅谈K8S cni和网络方案

    此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...

  4. (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh

    看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...

  5. 大会聚焦 | 开源技术盛会LinuxCon首次来到中国,大咖齐聚关注业界动态

    2017年6月19-20日,开源技术盛会LinuxCon + ContainerCon + CloudOpen(LC3)首次在中国举行.两天议程满满,包括 17 个主旨演讲.8 个分会场的 88 场技 ...

  6. 开发环境下的 Kubernetes 容器网络演进之路

    马蜂窝技术原创文章,更多干货请搜索公众号:mfwtech 使用 Docker+Kubernetes 来简化开发人员的工作流,使应用更加快速地迭代,缩短发布周期,在很多研发团队中已经是常见的做法. 如果 ...

  7. kubernetes网络模型

    Overview 本文将探讨Kubernetes中的网络模型,以及对各种网络模型进行分析. Underlay Network Model 什么是Underlay Network 底层网络 Underl ...

  8. docker从零开始网络(六)Macvlan

    使用Macvlan网络 某些应用程序,尤其是遗留应用程序或监视网络流量的应用程序,希望直接连接到物理网络.在这种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其 ...

  9. 网络虚拟化技术 TUN/TAP MACVLAN MACVTAP

    TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设备是如何工作的:

随机推荐

  1. linux 搭建局域网YUM源仓库服务器

    yum简介 Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服 ...

  2. linux运维 技能 2018

    1.监控与日志 prometheus.grafana.zabbix ELK(elasticsearch logstash filebeat kibana) 2.容器类 harbor映像管理 docke ...

  3. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  4. 【Beta】发布说明

    再次号外!Visual Pytorch第二个版本上线了! 目前的网址在这里(http://114.115.151.39/) 哦 有关上一版本的功能介绍说明请参考博客:Visual Pytorch -- ...

  5. Java NIO Buffer详解

    一.ByteBuffer类型化的put与get方法 /** * ByteBuffer类型化的put与get方法 */ public class NioTest5 { public static voi ...

  6. Evolutionary approaches towards AI: past, present, and future

    Evolutionary approaches towards AI: past, present, and future 2019-10-06 07:28:13 This blog is from: ...

  7. easyui datagrid合并相同数据的单元格。

    /** * 根据作用域填充单元格 */ function mergeCellsByField(tableID, colList) { var ColArray = colList.split(&quo ...

  8. Error-ASP.NET:无效的 JSON 基元: object。

    ylbtech-Error-ASP.NET:无效的 JSON 基元: object.  1.返回顶部 1. “/”应用程序中的服务器错误. 无效的 JSON 基元: object. 说明: 执行当前 ...

  9. Mac JDK 卸载方法

    卸载步骤 输入 sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -fr /Library/Prefere ...

  10. docker 启动mysql 闪退 无法启动问题

    docker 安装mysql [获取容器] docker pull mysql:5.6 [启动容器] docker run -p 3306:3306 --name mymysql -v $PWD/co ...