如何在Mininet中用Wireshark捕获所有主机流量至单个文件?
当然可行!你之前遇到的问题是因为直接在mininet>下执行sh wireshark时,要么没选对要捕获的接口,要么没有配置流量规则来集中所有主机的流量。下面给你两种可靠的解决方法:
方法一:利用Open vSwitch的端口镜像功能(推荐)
Mininet默认用Open vSwitch(OVS)作为交换机,我们可以通过OVS的流量镜像功能,把所有主机端口的双向流量都转发到一个专门的镜像端口,然后在这个端口上抓包,就能一次性获取所有主机的流量:
启动目标Mininet拓扑
比如你有3台主机的单交换机拓扑,执行:sudo mn --topo single,3确认主机与交换机的端口映射
先搞清楚每台主机对应的交换机端口,执行:mininet> sh ovs-ofctl show s1输出里会看到类似
port 1: s1-eth1(对应h1-eth0)、port 2: s1-eth2(对应h2-eth0)、port 3: s1-eth3(对应h3-eth0)的信息,记下这些端口名。添加专门的镜像端口
给交换机s1新增一个用于镜像流量的虚拟端口:mininet> sh ovs-vsctl add-port s1 mirror0配置流量镜像规则
把所有主机端口的双向流量(包括主机发送和接收的)都镜像到mirror0端口:mininet> sh ovs-vsctl -- set Bridge s1 mirrors=@m \ -- --id=@p1 get Port s1-eth1 \ -- --id=@p2 get Port s1-eth2 \ -- --id=@p3 get Port s1-eth3 \ -- --id=@m create Mirror name=all-traffic \ select-src-port=@p1,@p2,@p3 \ select-dst-port=@p1,@p2,@p3 \ output-port=mirror0用Wireshark捕获镜像端口流量
在mininet>下执行sh wireshark &后台启动Wireshark,在接口列表中选择mirror0开始捕获,就能得到所有3台主机的完整流量,最后保存为单个文件即可。
方法二:直接捕获交换机网桥接口
如果你的拓扑是所有主机都连接到同一个OVS交换机(比如单交换机拓扑),交换机对应的网桥接口本身就会流经所有主机的流量,直接抓这个接口更简单:
- 启动Mininet拓扑后,执行
mininet> sh wireshark &启动Wireshark。 - 在Wireshark的接口列表中找到对应交换机的网桥接口(比如名为
s1的接口),选择它开始捕获。 - 这样就能抓到所有主机之间的交互流量,最终保存为单个文件即可。
注意:如果你的拓扑包含多个交换机,这种方法只能捕获单个交换机上的流量,这时就需要用方法一给每个交换机配置镜像,再汇总捕获。
内容的提问来源于stack exchange,提问作者Haniku

