如何在Mininet中通过Python编程捕获两台主机间的TLS流量
Mininet环境TLS流量自动抓包修复方案
现有代码核心问题
- 执行顺序错误:先启动客户端传输流量后才启动抓包,导致流量漏抓
- 调用逻辑错误:使用
os.system/cmd运行抓包命令属于同步阻塞调用,会卡住后续流程;robot变量未定义直接调用popen属于笔误 - 客户端配置错误:TLS客户端部署在h2上,却填写h2自身IP作为连接目标,实际应该连接h1的服务端IP,导致流量根本没有产生
- 未等待服务端就绪:服务端启动后直接跑客户端,可能出现服务端还没完成端口监听,客户端连接失败的问题
修正后可自动化运行的代码
#!/usr/bin/python # -*- coding: utf-8 -*- import sys import os import subprocess import time from mininet.node import Host, OVSKernelSwitch, Controller from mininet.topo import Topo from mininet.log import lg, info from mininet.net import Mininet from mininet.link import TCLink class ExperimentTopology(Topo): """Custom mininet topology for robot-controller experiments""" def __init__(self): Topo.__init__(self) switch = self.addSwitch("s1") h1= self.addHost("h1") h2= self.addHost("h2") self.addLink(switch, h1) self.addLink(switch, h2) def main(): lg.setLogLevel("info") # 提前创建抓包保存目录 capture_dir = os.path.expanduser('~/captures') os.makedirs(capture_dir, exist_ok=True) capture_path = os.path.join(capture_dir, 'capture.pcap') net = Mininet(topo=ExperimentTopology(), waitConnected=True) net.start() h1= net.get('h1') h2 = net.get('h2') s1 = net.get('s1') # 第一步:后台启动抓包进程,捕获s1上所有流量 info("Starting tcpdump capture...\n") capture_proc = s1.popen(f'tcpdump -i any -w {capture_path}') # 等待抓包进程启动 time.sleep(1) # 第二步:启动TLS服务端,后台运行 info("Starting TLS server on h1...\n") h1p = h1.popen(f'python3 tls_server.py -i {h1.IP()} -p 443') # 等待服务端完成端口监听 time.sleep(2) # 第三步:启动TLS客户端,阻塞等待客户端传输完成 info("Starting TLS client on h2, starting traffic transmission...\n") h2.cmd(f'python3 tls_client.py -i {h1.IP()} -p 443 -m x -d 1 -s 12.5') info("Traffic transmission completed\n") # 第四步:终止抓包进程,确保pcap文件正常写入 capture_proc.terminate() capture_proc.wait() info(f"Capture saved to {capture_path}\n") # 清理进程、停止网络 h1p.terminate() net.stop() if __name__ == '__main__': main()
关键说明
- 抓包使用Mininet节点自带的
popen方法启动,属于后台非阻塞调用,不会卡住主流程,流量传输完成后主动终止抓包进程,无需手动操作 - 修正了客户端连接IP的配置错误,确保TLS流量正常在h1和h2之间传输
- 新增了目录创建逻辑,避免抓包路径不存在导致的写入失败
- 全程无人工交互,实现全自动化执行,执行完成后可直接在
~/captures/capture.pcap获取捕获的TLS流量包 - 若需要解密TLS流量,可在客户端/服务端代码中添加
SSLKEYLOGFILE环境变量导出会话密钥,搭配Wireshark即可解密查看明文内容
内容的提问来源于stack exchange,提问作者rshah
相关产品推荐
相关产品推荐

