linux虚拟网络之macvlan设备

 

macvlan能将一块物理网卡虚拟成多块虚拟网卡;macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比较稳定的版本推荐 4.0+。它一般是以内核模块的形式存在
modprobe macvlan #加载macvlan;可用于判断系统是否支持macvlan
lsmod | grep macvlan #确认是否已加载

复制代码
macvlan对比vlan
=======================================================================================================
macvlan对比vlan
    1.macvlan 子接口和原来的主接口是完全独立的,可以单独配置 MAC 地址和 IP 地址;VLAN 子接口和主接口共用相同的 MAC 地址。
    2.VLAN 用来划分广播域; macvlan 共享同一个广播域。

macvlan是一个网卡的影分身;vlan则是携带vlan id的分身。看起来差不多,实际相差很大,底层是完全不同的技术,所以也表现出了以下的差异:
    1.macvlan的不同分身,均使用不同的mac地址;而vlan设备则是共用mac地址
    2.macvlan共享同一个广播域;VLAN 用来划分广播域
    3.macvlan设备直接接入到vm或network namespace并进行使用;vlan 设备接触到的是attach bridge,直接接入到vm或network namespace 也是可以的
        如果将macvlan attach到bridge,相当于将物理交换网络拓展到linux内部,但是这种是无意义的吧

=========================实验:vlan设备直接放入到network namespace=============================================================
ip link add link eth0 name eth0.888 type vlan id 888
ip netns add vlan888_ns
ip link set eth0.888 netns vlan888_ns
ip netns exec vlan888_ns ip addr add 88.8.8.8/24 dev eth0.888
ip netns exec vlan888_ns ip link set eth0.888 up
--------------------------------------------------------------------------------
ip link add link eth0 name eth0.888 type vlan id 888
ip netns add vlan888_ns
ip link set eth0.888 netns vlan888_ns
ip netns exec vlan888_ns ip addr add 88.8.8.88/24 dev eth0.888
ip netns exec vlan888_ns ip link set eth0.888 up
-------------------------------------------------------------------------------------
[root@yefeng ~]# ip netns exec vlan888_ns ping 88.8.8.8 -c1
PING 88.8.8.8 (88.8.8.8) 56(84) bytes of data.
64 bytes from 88.8.8.8: icmp_seq=1 ttl=64 time=0.205 ms

--- 88.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.205/0.205/0.205/0.000 ms
###ping包测试,通;
###抓包查看,确实携带vlan id 888
macvlan对比vlan
复制代码

 

macvlan流量隔离:macvlan 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。

 

ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru  [ nopromisc ] }

复制代码
macvlan的4种网络模式(private、vepa、bridge、passthru)
========================================================
根据 macvlan 子接口之间的通信模式,macvlan 有四种网络模式:
    1.private 模式
        同一主接口下的子接口之间彼此隔离,不能通信。即使从外部的物理交换机导流,也会被无情地丢掉。
    2.vepa(virtual ethernet port aggregator) 模式(默认模式)
        子接口之间的通信流量需要导到外部支持 802.1Qbg/VPEA 功能的交换机上(可以是物理的或者虚拟的),经由外部交换机转发,再绕回来。
        注:802.1Qbg/VPEA 功能简单说就是交换机要支持 发夹(hairpin) 功能,也就是数据包从一个接口上收上来之后还能再扔回去。
    3.bridge 模式
        模拟 Linux bridge 的功能,但比 bridge 要好的一点是每个接口的 MAC 地址是已知的;这种模式下,子接口之间就是直接可以通信的。
    4.passthru 模式
        这种模式,只允许单个子接口连接主接口,且必须设置成混杂模式,一般用于子接口桥接和创建 VLAN 子接口的场景。
macvlan的4种网络模式(private、vepa、bridge、passthru)
复制代码

 

vety pair设备: ip a 显示 本设备@对端设备
macvlan设备: ip a 显示 本设备@父设备

 

mactap:和 macvlan 相似的技术;和 macvlan 不同的是,mactap 收到包之后不是交给协议栈,而是交给一个 tapX 文件,然后通过这个文件,完成和用户态的直接通信。

 

复制代码
macvlan实验
==============================================================================================================
ip link add link eth0 dev macvlan2 type macvlan mode bridge     #创建bridge模式的macvlan网卡
ip netns add macvlan2_ns                                        #创建network namespace
ip link set macvlan2 netns macvlan2_ns                          #将macvlan网卡放入network namespace
ip netns exec macvlan2_ns ip addr add 100.0.0.2/24 dev macvlan2
ip netns exec macvlan2_ns ip link set macvlan2 up
------------------------------------------------------------------------------
ip link add link eth0 dev macvlan3 type macvlan mode bridge
ip netns add macvlan3_ns
ip link set macvlan3 netns macvlan3_ns
ip netns exec macvlan3_ns ip addr add 100.0.0.3/24 dev macvlan3
ip netns exec macvlan3_ns ip link set macvlan3 up
------------------------------------------------------------------------------
[root@yefeng test1]# ip netns exec macvlan2_ns ip a s macvlan2
41: macvlan2@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 36:57:39:7d:74:41 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 100.0.0.2/24 scope global macvlan2
       valid_lft forever preferred_lft forever
    inet6 fe80::3457:39ff:fe7d:7441/64 scope link
       valid_lft forever preferred_lft forever

[root@yefeng test1]# ip netns exec macvlan2_ns ping 100.0.0.2 -c1       #ping自己不通????
PING 100.0.0.2 (100.0.0.2) 56(84) bytes of data.

--- 100.0.0.2 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

[root@yefeng test1]# ip netns exec macvlan2_ns ping 100.0.0.3 -c1       #ping 100.0.0.3通
PING 100.0.0.3 (100.0.0.3) 56(84) bytes of data.
64 bytes from 100.0.0.3: icmp_seq=1 ttl=64 time=0.027 ms

--- 100.0.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.027/0.027/0.027/0.000 ms

###反过来在macvlan3_ns的测试结果也是相同的,ping自己不通,ping 100.0.0.2是通的

===============================实验:vepa模式===========================================================
ip link add link eth0 dev macvlan4 type macvlan mode vepa
ip netns add macvlan4_ns
ip link set macvlan4 netns macvlan4_ns
ip netns exec macvlan4_ns ip addr add 100.0.0.4/24 dev macvlan4
ip netns exec macvlan4_ns ip link set macvlan4 up
---------------------------------------------------------------------------------------
ip link add link eth0 dev macvlan5 type macvlan mode vepa
ip netns add macvlan5_ns
ip link set macvlan5 netns macvlan5_ns
ip netns exec macvlan5_ns ip addr add 100.0.0.5/24 dev macvlan5
ip netns exec macvlan5_ns ip link set macvlan5 up


ip netns exec macvlan4_ns ip addr
[root@yefeng test1]# ip netns exec macvlan4_ns ping 100.0.0.5        #不通,符合预期
PING 100.0.0.5 (100.0.0.5) 56(84) bytes of data.
^C
--- 100.0.0.5 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4000ms
macvlan实验
复制代码

 

参考链接:

网卡也能虚拟化?网卡虚拟化技术 macvlan 详解 https://segmentfault.com/a/1190000018742817
Docker 网络模型之 macvlan 详解,图解,实验完整 https://segmentfault.com/a/1190000019237248

图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN https://blog.csdn.net/dog250/article/details/45788279

  ###该链接需要再次学习

posted @   雲淡風輕333  阅读(858)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示