Mininet脚本发送流量源IP为宿主虚拟机IP而非仿真主机IP故障问询
问题根因
你当前的错误核心是调用逻辑混淆了Mininet仿真主机命令执行接口和系统全局执行接口:
os.system()是直接在运行Mininet脚本的宿主机全局网络命名空间执行命令,完全没有进入对应仿真主机的独立网络命名空间,所以所有流量都走宿主机的物理/虚拟网卡,源IP/MAC自然是宿主机的地址。host.cmd()是Mininet提供的、专门将命令注入到对应仿真主机的独立网络命名空间执行的接口,不需要嵌套任何系统级执行函数。
修复方案
1. 修正基础调用语法
将原嵌套了os.system的调用
for host in dictOfAllHostsAndIPs.keys(): host.cmd(os.system( "python3 ./traffic_generator.py %s" % <my_args>))
修改为直接传入命令字符串即可,末尾加&让进程在仿真主机后台运行,避免阻塞主流程:
for host in dictOfAllHostsAndIPs.keys(): host.cmd(f"python3 ./traffic_generator.py {my_args} &")
通过host.cmd启动的进程会自动继承仿真主机的网络命名空间,进程内所有子调用(包括你脚本里的nc命令)都会自动使用仿真主机的IP/MAC发送流量。
2. 多线程场景适配
你当前的多线程是在Mininet主进程中创建的,要注意以下两点:
- 不要在TrafficGenerator类的线程逻辑中直接调用
os.system发送流量,这种逻辑仍然是在宿主机全局命名空间执行 - 可以保留多线程调度逻辑,仅将实际的流量发送动作通过对应host的
cmd/popen接口注入到仿真主机执行,或者将整个流量生成逻辑封装为独立脚本,通过host.cmd启动即可
3. 快速验证
可以先执行最简测试确认调用逻辑生效:
- 在Mininet脚本中添加
net.get('h1').cmd("ping -c 3 10.0.0.2 &") - 在交换机端口抓包,确认ICMP包源IP为h1的10.0.0.1地址,验证通过后再运行你的流量生成脚本即可。
内容的提问来源于stack exchange,提问作者WildWilyWilly
相关产品推荐
相关产品推荐

