Macvlan虚拟网卡能否使用自身MAC地址发送数据包?求助
解决macvlan接口发送数据包使用物理网卡MAC的问题
问题现象
网络拓扑
20.0.0.25/24 20.0.0.26/24 ----- ens10 --------- ens4 ----- | PC1 | ----------| VSwitch |--------| PC2 | | | | | | | ----- --------- ------
操作步骤
创建macvlan虚拟网卡的命令:
ip link add link ens10 ens10.1 type macvlan ip addr add 20.0.0.100/24 dev ens10.1 ip link set dev ens10.1 up
执行ip a确认接口状态:
3: ens10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 0c:da:41:1d:fe:6c brd ff:ff:ff:ff:ff:ff inet 20.0.0.25/24 scope global ens10 valid_lft forever preferred_lft forever inet6 fe80::eda:41ff:fe1d:fe6c/64 scope link valid_lft forever preferred_lft forever 5: ens10.1@ens10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 3e:9e:85:d0:f7:f1 brd ff:ff:ff:ff:ff:ff inet 20.0.0.100/24 scope global ens10.1 valid_lft forever preferred_lft forever inet6 fe80::3c9e:85ff:fed0:f7f1/64 scope link valid_lft forever preferred_lft forever
异常现象
执行ping -I 20.0.0.100 20.0.0.26时,所有Ping数据包及ARP回复均使用ens10的MAC地址(0c:da:41:1d:fe:6c),而非ens10.1的MAC地址(3e:9e:85:d0:f7:f1),且仅能在ens10接口上捕获到流量。
原因分析
同网段下物理网卡与macvlan接口共存时,Linux网络栈会优先选择物理网卡作为出接口(物理网卡的直连路由优先级更高),导致数据包复用物理网卡的MAC地址发送,而非macvlan虚拟网卡的MAC。
解决方案
方法1:添加指定路由强制流量走macvlan接口
- 添加针对目标网段的路由,明确指定出接口为
ens10.1并绑定源IP:
ip route add 20.0.0.0/24 dev ens10.1 src 20.0.0.100
- 刷新ARP缓存,清除旧的地址映射避免干扰:
ip neigh flush all dev ens10 ip neigh flush all dev ens10.1
- 重新执行Ping命令验证:
ping -I 20.0.0.100 20.0.0.26
此时用tcpdump捕获流量(例如tcpdump -i ens10 ether host 3e:9e:85:d0:f7:f1),即可看到数据包使用ens10.1的MAC地址发送。
方法2:临时移除物理网卡的同网段IP
如果不需要物理网卡ens10保留20.0.0.25/24地址,可直接移除该IP,强制网络栈使用macvlan接口的地址和MAC:
ip addr del 20.0.0.25/24 dev ens10
执行后重新Ping即可生效。
内容的提问来源于stack exchange,提问作者indexalice
相关产品推荐
相关产品推荐

