Macvlan 和 IPvlan

介绍

       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 地址。

前三种模式示意图:

image




实验

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


查看接口状态:

image


创建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 会在中间做报文的转发工作。


模式架构图:

image

实验

创建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 的网络是不能被外部直接访问的。

转载于:https://www.cnblogs.com/menkeyi/p/11374023.html

<think>好的,用户现在想了解MacvlanIPvlan网络的区别,我需要详细解释两者的不同点。首先,我需要回忆之前提供的关于Docker网络配置的信息,特别是Macvlan的部分。用户之前的问题涉及到Docker的网络类型,包括bridge、host、overlaymacvlan,现在他们进一步想了解MacvlanIPvlan之间的区别。 首先,我应该明确MacvlanIPvlan的基本概念。Macvlan允许在物理接口上创建多个虚拟接口,每个都有独立的MAC地址,而IPvlan则是基于同一个MAC地址分配多个IP地址。这点在之前的引用中已经提到,用户提供的引用[1][2]说明了Macvlan的工作原理,每个虚拟接口有独立MACIP,而IPvlan可能共享MAC。 接下来,需要比较两者的主要区别。根据已有的知识,MacvlanIPvlan的主要区别包括MAC地址处理方式、网络环境适应性、隔离性、广播流量处理以及使用场景。比如,Macvlan需要交换机支持混杂模式,而IPvlan不需要,这对某些受限制的网络环境来说很重要。此外,IPvlan因为共享MAC,可能在需要MAC地址过滤的环境中遇到问题,但适合IP为中心的部署。 然后,我需要考虑用户可能的实际应用场景。用户之前的问题涉及Docker网络配置,可能是在容器化环境中使用这些网络类型。例如,在需要容器直接使用物理网络IP时,MacvlanIPvlan都是选项,但根据网络环境的不同选择适合的类型。比如,如果网络不允许大量MAC地址,IPvlan更适合。 还要确保回答结构清晰,分点列出区别,可能使用表格对比,并给出示例配置,帮助用户理解。同时,需要引用之前提到的资料,比如引用[1]中的Macvlan配置示例,以及引用[2]中关于MAC地址独立性的说明。 最后,生成相关问题,引导用户进一步思考,比如适用场景或性能比较。确保回答符合用户要求的中文、LaTeX格式引用标记。需要检查是否有遗漏的关键点,比如IPvlan的子模式(L2/L3/S),以及Macvlan的不同模式(bridge、VEPA等),这些可能需要简要说明。</think>### Macvlan vs IPvlan 网络区别详解 #### 一、核心设计差异 1. **MAC地址处理机制** - **Macvlan**:每个虚拟接口拥有**独立MAC地址**(基于物理网卡生成),例如父接口`eth0`创建`macvlan1`时生成新MAC地址$00:1a:2b:3c:4d:5e$[^2]。 - **IPvlan**:所有虚拟接口**共享物理接口的MAC地址**,仅通过IP地址区分不同终端,例如父接口`eth0`的MAC为$00:1a:2b:3c:4d:5e$时,其IPvlan子接口均继承该MAC。 2. **网络环境适应性** - **Macvlan**:需要交换机支持**混杂模式**(Promiscuous Mode),否则可能因MAC地址过多被过滤[^1]。 - **IPvlan**:无需交换机特殊配置,适用于**MAC地址限制严格**的网络环境(如云服务商网络)。 3. **隔离性与通信规则** - **Macvlan**: - 默认模式下(bridge),同父接口的子接口可直接通信 - VEPA模式下需通过外部交换机转发 - **IPvlan**: - L2模式下同子网内直接通信 - L3模式下需路由配置 $$通信流程对比公式$$ Macvlan: \quad \text{容器A} \xrightarrow[\text{独立MAC}]{\text{物理网卡}} \text{交换机} \rightarrow \text{容器B} IPvlan: \quad \text{容器A} \xrightarrow[\text{共享MAC}]{\text{IP区分}} \text{物理网卡} \rightarrow \text{容器B}$$ #### 二、性能与资源消耗对比 | 对比维度 | Macvlan | IPvlan | |---------------|----------------------------|----------------------------| | ARP广播处理 | 每个接口独立响应广播 | 父接口统一处理广播 | | MAC表项数量 | 随子接口数量线性增长 | 仅需维护父接口MAC表项 | | 适用协议栈 | 仅支持L2网络 | 支持L2/L3/S(三种子模式) | | 典型延迟 | 微秒级 | 纳秒级(无MAC层处理) | #### 三、配置示例对比 **Macvlan配置**(基于物理接口`eth0`): ```bash # 创建macvlan接口并分配至命名空间 sudo ip link add macvlan1 link eth0 type macvlan mode bridge sudo ip link set macvlan1 netns ns1 sudo ip netns exec ns1 ip addr add 192.168.1.10/24 dev macvlan1 ``` **IPvlan配置**(L2模式): ```bash # 创建ipvlan接口并分配IP sudo ip link add ipvlan1 link eth0 type ipvlan mode l2 sudo ip addr add 192.168.1.20/24 dev ipvlan1 ``` #### 四、选型建议 1. **选择Macvlan场景**: - 需要容器/VM显示真实MAC地址(如DHCP服务器需MAC绑定) - 网络设备支持混杂模式 - 需要传统L2网络功能(如ARP广播) 2. **选择IPvlan场景**: - 云环境或禁用MAC地址变更的网络 - 大规模部署时减少MAC表项压力 - 需要L3路由功能(IPvlan L3模式)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值