You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 快速验证

可以先执行最简测试确认调用逻辑生效:

  1. 在Mininet脚本中添加net.get('h1').cmd("ping -c 3 10.0.0.2 &")
  2. 在交换机端口抓包,确认ICMP包源IP为h1的10.0.0.1地址,验证通过后再运行你的流量生成脚本即可。

内容的提问来源于stack exchange,提问作者WildWilyWilly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:57:03