WSL2 Ubuntu中隔离虚拟测试网络搭建后,广播ping无法跨tap设备被捕获的问题排查
兄弟,你这套虚拟网络的架子搭得没问题,但核心坑点已经从brctl showstp的输出里暴露出来了——test_eth0和test_eth1这两个tap端口的状态都是disabled,网桥根本不会在禁用的端口之间转发流量,这就是tcpdump抓不到ping包的原因!
为啥会出现这个问题?
Tap设备是一种需要用户态程序配合的虚拟网卡:内核会把tap设备的端口标记为禁用,直到有用户态程序打开并关联它。简单说就是“没人用的tap设备,内核认为它是不可用的”,自然不会让网桥把流量发过去。
快速解决方法
第一步:用socat临时激活tap设备
先装个socat工具(如果没装的话):
sudo apt update && sudo apt install socat -y
然后打开两个独立的终端窗口,分别执行以下命令(别关这两个窗口,保持运行):
# 第一个终端:绑定并保持test_eth0处于打开状态 sudo socat /dev/net/tap,iff=test_eth0 - # 第二个终端:绑定并保持test_eth1处于打开状态 sudo socat /dev/net/tap,iff=test_eth1 -
这两个命令会让socat一直占用tap设备,内核就会认为这两个端口是活跃可用的了。
第二步:验证端口状态
再跑一次brctl showstp test_switch,你会看到两个tap端口的状态已经变成forwarding(或者先进入listening/learning状态,等几秒就会切换到forwarding)。
第三步:重新测试
回到你的tcpdump窗口(如果没开,重新启动:sudo tcpdump -i test_eth0 -p -e -A -vv),然后执行广播ping:
sudo ping -I test_eth1 -b 255.255.255.255
这时候你应该能在tcpdump里看到来自test_eth1的广播ping包了,完美!
额外说明
你提到的STP显示no其实不是问题——你的网桥只有两个端口,不存在环路风险,关闭STP完全没问题,和这次的故障无关。
另外,等你后续跑自己的C代码时,你的程序本身需要通过打开/dev/net/tap设备来和tap网卡交互,这时候你的程序就相当于刚才的socat,只要程序在运行,tap端口就会保持活跃状态,不需要再用socat啦。
备注:内容来源于stack exchange,提问作者Ski

