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流量隔离: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 子接口的场景。
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 详解 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
###该链接需要再次学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!