Tcpreplay的介绍

简单的说, tcpreplay是一种pcap包的重放工具, 它可以将用ethreal, wireshark工具抓下来的包原样或经过任意修改后重放回去. 它允许你对报文做任意的修改(主要是指对2层, 3层, 4层报文头), 指定重放报文的速度等, 这样tcpreplay就可以用来复现抓包的情景以定位bug, 以极快的速度重放从而实现压力测试.

Tcpreplay包含几个辅助工具:

tcpprep:划分client和server,可以将client的报文从一个网卡发包,server的报文从一个网卡发包

tcprewrite:修改2层、3层、4层的报文头部

tcpreplay:真正的发包,可以选择主网卡、从网卡和发包速率等

后文中均已mysql.pcap报文为例,报文内容如下:

tcpprep

tcpprep工具会生成一个cache文件

tcpprep帮助文档

[root@x11 tcpreplay_mysql_test]# tcpprep -h

tcpprep (tcpprep) - Create a tcpreplay cache cache file from a pcap file.

Usage: tcpprep [ - [] | --[{=| }] ]...

-a, --auto=str Auto-split mode

-c, --cidr=str CIDR-split mode

-r, --regex=str Regex-split mode

-p, --port Port-split mode

-e, --mac=str Source MAC split mode

--reverse Matches to be client instead of server

-C, --comment=str Embeded cache file comment

--no-arg-comment Do not embed any cache file comment

-x, --include=str Include only packets matching rule

-X, --exclude=str Exclude any packet matching this rule

-o, --cachefile=str Output cache file

-i, --pcap=str Input pcap file to process

-P, --print-comment=str Print embedded comment in the specified cache file

-I, --print-info=str Print basic info from the specified cache file

-S, --print-stats=str Print statistical information about the specified cache file

-s, --services=str Load services file for server ports

-N, --nonip Send non-IP traffic out server interface

-R, --ratio=str Ratio of client to server packets

-m, --minmask=num Minimum network mask length in auto mode

-M, --maxmask=num Maximum network mask length in auto mode

-v, --verbose Print decoded packets via tcpdump to STDOUT

-A, --decode=str Arguments passed to tcpdump decoder

-V, --version Print version information

-h, --less-help Display less usage information and exit

-H, --help display extended usage information and exit

-!, --more-help extended usage information passed thru pager

--save-opts[=arg] save the option state to a config file

--load-opts=str load options from a config file

Options are specified by doubled hyphens and their name or by a single

hyphen and the flag character.

tcpprep is a 'pcap(3)' file pre-processor which creates a cache file which

provides "rules" for 'tcprewrite(1)' and 'tcpreplay(1)' on how to process

and send packets.

tcpprep举例

根据源IP,举例一:

[root@x11 tcpreplay_mysql_test]# tcpprep -c 10.5.8.244/24 -i mysql.pcap -o mysql.cach

将文件夹中的mysql.pcap报文中的地址为10.5.8.244/24的流设置为client端,其余流设置为server端

自动模式,举例二:

[root@x11 tcpreplay_mysql_test]# tcpprep -a client -i mgcp.pcap -o mgcp.cach

上面的命令采用自动/client模式指定分包模式. 自动模式这里按我的理解解释一下:

tcpprep在自动模式下认为有下面行为的IP为client端: 1.发TCP SYN包的一方, 2.发DNS

包的一方, 3. 收入到 ICMP-Port Unreachable的一方. 认为有下面行为的一方为server

端: 1.发TCP Syn/Ack的一方, 2.发DNS应答的一方, 3.发ICMP-Port Unreachable的一方.

而被认定为server的那一方发的那些包, 将从主网卡发出, 被认定为client的包则从次网

卡发出. 而自动/client模式将所有没有认出的包都归为client, 同理自动/server模式将

没有认出的包都归为server.这种模式貌似不如按IP地址分类的方式好用.

tcprewrite

简单地说, tcprewrite就是改写pcap包里的报文头部, 包括2层, 3层, 4层, 5-7层. 从3.0

版本以后, 所有改写pcap报文头的操作都从tcpreplay中移到了tcprewrite里了.

使用tcprewrite对packet进行修改可以有两个方法, 一种方法是一次修改一项, 生成一个

文件, 再拿这个文件作为输入文件..., 直到完成最后的修改, 如:

tcprewrite --option1=xxx -c input.cach -i input.pcap -o 1.pcap

tcprewrite --option2=xxx -c input.cach -i 1.pcap -o 2.pcap

...

tcprewrite --optionN=xxx -c input.cach -i N-1.pcap -o N.pcap

还有一种方法是一古脑的把所有的选项放到一个命令里完成, 如:

tcprewrite --option1=xxx --option2=xxx ... --optionN=xxx -i input.pcap -c input.cach -o out.pcap

两种方法都是可行的, 也各有利弊. 第一方法明了, 但是复杂, 第二种方法简单但不容易

理解. 我的建议是先用第一种方法做试验, 容易调试, 等修改成功了以后再把所有的选项

合到一起, 在实际使用的时候用第二种方法. 下面我先给出一个例子, 然后再逐个分析一

下用tcprewrite是如何修改二层, 三层, 四层, 5-7层头的, 以便理解tcprewrite的工作原

理.

tcprewrite的基本格式是(请注意命令中是没有换行符的, 只为了阅读的方便添加了换行

符): 详请可以用tcprewrite ?命令查询详情.

#tcprewrite的格式:
|$ tcprewrite --enet-smac=host_src_mac,client_src_mac   \
|              --enet-dmac=host_dst_mac, client_dst_mac \
|              --endpoints=host_dst_ip:client_dst_ip    \
|              --portmap=old_port1:new_port1,old_port2, new_port2 \
|              -i input.pcap -c input.cach -o out.pcap

解释一下, 该命令的输入参数是input.pcap和input.cach文件, 结果将另存为out.pcap文
件. 该命令将所有input.pcap包里的主机包(由input.cach文件指定哪些包是主机包, 哪些
包是客户端包)的源mac地址, 目的mac地址, 目的IP地址分别改为 :host_src_mac,
host_dst_mac和host_dst_ip, 客户端包源mac地址, 目的mac地址, 目的IP地址分别改为
:client_src_mac, client_dst_mac和client_dst_ip, 将端口号由old_port1改为
new_port1, 将端口号由old_port2改为new_port2.

tcprewrite举例

修改报文的源IP、目的IP、源mac和目的mac

[root@x11 tcpreplay_mysql_test]# tcprewrite --enet-smac=11:11:11:11:11:11,22:22:22:22:22:22 --enet-dmac=22:22:22:22:22:22,11:11:11:11:11:11 --endpoints=10.0.0.1:20.0.0.2 -i mysql.pcap -c mysql.cach -o out.pcap

操作完成后查看文件夹下多了一个out.pcap

[root@x11 tcpreplay_mysql_test]# ll

total 188

-rw-r--r-- 1 root root 120 Apr 24 16:04 mysql.cach

-rw-r--r-- 1 root root 91941 Apr 24 16:00 mysql.pcap

-rw-r--r-- 1 root root 91941 Apr 24 16:05 out.pcap

使用wireshark打开out.pcap发现源IP、目的IP、源mac和目的mac都被修改了

修改二层头

修改MAC地址

·不指定cache文件

如果不指定cache文件, 将把所有包的源mac地址和目的mac地址都改写成
12:23:34:45:56:67和66:66:66:66:66:66

[root@x11 tcpreplay_mysql_test]# tcprewrite --enet-smac=12:23:34:45:56:67 --enet-dmac=66:66:66:66:66:66 --infile=mysql.pcap --outfile=mysql_mac.pcap

打开的mysql_mac.pcap如下:

或者

[root@x11 tcpreplay_mysql_test]# tcprewrite --enet-smac=12:23:34:45:56:67 --enet-dmac=66:66:66:66:66:66 -imysql.pcap -o mysql_mac1.pcap

打开的mysql_mac1.pcap如下:

·指定cache文件

指定cache文件后, 将server包的目的/源mac地址改写成
00:44:66:FC:29:AF/00:66:AA:D1:32:C2, 将client的目的/源mac地址改成:
00:55:22:AF:C6:37/00:22:55:AC:DE:AC, 注意是server地址在前.

[root@x11 tcpreplay_mysql_test]# tcprewrite --enet-dmac=00:44:66:FC:29:AF,00:55:22:AF:C6:37 --enet-smac=00:66:AA:D1:32:C2,00:22:55:AC:DE:AC --cachefile=mysql.cach --infile=mysql.pcap --outfile=mysql_L2.pcap

打开生成的mysql_L2.pcap报文

修改802.1q VLAN

经常客户的抓包带有VLAN头域, 这些包如果不去掉VLAN头是没有办法在自己的交换机上replay的, tcprewrite提供了去掉或添加VLAN的方法:

添加vlan也很简单, 下面的命令将VLAN tag设成40, CFI设成1, VLAN priority设成4.

[root@x11 tcpreplay_mysql_test]# tcprewrite --enet-vlan=add --enet-vlan-tag=40 --enet-vlan-cfi=1 --enet-vlan-pri=4 -i mysql.pcap -o mysql_vlan.pcap

删除vlan很简单:

[root@x11 tcpreplay_mysql_test]# tcprewrite --enet-vlan=del -i mysql_vlan.pcap -o mysql_unvlan.pcap

修改三层头

修改目的IP

根据cache文件里的标识, 将server的IP改为10.10.1.1, client的IP改为10.10.1.2:

[root@x11 tcpreplay_mysql_test]# tcprewrite --endpoints=10.10.1.1:10.10.1.2 --cachefile=mysql.cach -i mysql.pcap -o mysql_IP.pcap

修改IP的网络部分

IP地址同网络部分和主机部分组成, 下面的命令可以将子网地址为10.0.0.0/8的IP改成子网为172.0.0.0/8

[root@x11 tcpreplay_mysql_test]# tcprewrite --pnat=10.0.0.0/8:172.0.0.0/8 --infile=mysql.pcap --outfile=mysql_network.pcap --skipbroadcast

修改IP头其它部分

修改IPv4头的TOS为50

[root@x11 tcpreplay_mysql_test]# tcprewrite  --tos=50 –infile=mysql.pcap –outfile=mysql_tos.pcap

将IPv6头Traffic Class值改为33

[root@x11 tcpreplay_mysql_test]# tcprewrite  --tclass=33 –infile=mysql.pcap –outfile=mysql_tos.pcap

修改Flow Label field

[root@x11 tcpreplay_mysql_test]#tcprewrite--flowlabel=67234 –infile=mysql.pcap --outfile=mysql_tos.pcap

修改四层头

和修改IP头一样, 修改4层头的时候tcpwrite会自动计算校验和, 这个就不需要担心了.

修改端口号

将80端口号改为8080, 22改为8022

[root@x11 tcpreplay_mysql_test]# tcprewrite--portmap=80:8080,22:8022  –infile=mysql.pcap –outfile=mysql_tos.pcap

强制计算传输层校验和:

有些应用可能不计算传输层的校验和, 可以让tcpwrite强制计算一下:

[root@x11 tcpreplay_mysql_test]# tcprewrite--fixcsum  –infile=mysql.pcap –outfile=mysql_tos.pcap

修改5-7层数据

tcpwrite对5-7层的修改非常有限, 顶多也就是抓包没有抓全, 中间的应用层数据丢了.
tcpwrite将没有抓到的数据补成全0, 或者修改tcp/udp的长度字节, 或者将该包丢弃. 有
需要的直接参考官方资料吧.

tcpreplay的使用指导的更多相关文章

  1. 新手入门指导:Vue 2.0 的建议学习顺序

    起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...

  2. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

  3. Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义

    Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义 首先我们指明,任何一种行动以及教派修行方法都有他的多元化,只看到某一方面,就不能很好的评估利弊,适不适合自己使 ...

  4. SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  5. SQL Server 解读【已分区索引的特殊指导原则】(1)- 索引对齐

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  6. SQL Server 解读【已分区索引的特殊指导原则】(2)- 唯一索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  7. Hive Tutorial(上)(Hive 入门指导)

    用户指导 Hive 指导 Hive指导 概念 Hive是什么 Hive不是什么 获得和开始 数据单元 类型系统 内置操作符和方法 语言性能 用法和例子(在<下>里面) 概念 Hive是什么 ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...

随机推荐

  1. Git创建多个ssh key

    在使用git的时候,遇到需要创建多个ssh key的需求,一个用来git hub项目,一个用来git lab项目: 之前如果已将创建过一个ssh key,那么在创建第二个的时候,要修改默认名称,然后增 ...

  2. vim改变字体和查看映射的(mapping)命令

    临时修改.通过gvim Command MODE,输入如下命令即可: Linux/Unix: set guifont=Monospace\空格14 注意这里需要对空格使用\进行转义 Windows:  ...

  3. 10 种常用 Matplotlib 图的 Python 代码

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 喜欢的朋友欢迎关注小编,除了分享技术文章之外还有很多福利,私信“资料”可以 ...

  4. 百度文本编辑器的toolbars属性值描述

    toolbars: [    [        'anchor', //锚点        'undo', //撤销        'redo', //重做        'bold', //加粗   ...

  5. Docker镜像命令笔记

    docker安装 官方Ubuntu安装文档 获取 docker pull NAME[:TAG] docker pull registry.docker-cn.com/library/ubuntu:14 ...

  6. 入门大数据---通过Flume、Sqoop分析日志

    一.Flume安装 参考:Flume 简介及基本使用 二.Sqoop安装 参考:Sqoop简介与安装 三.Flume和Sqoop结合使用案例 日志分析系统整体架构图: 3.1配置nginx环境 请参考 ...

  7. Redis高级特性

    redis的事务(transaction) 转载:https://blog.csdn.net/fmwind/article/details/78065236 redis中的事务是一组命令的集合.事务同 ...

  8. vue基础入门(4)

    4.综合实例 4.1.基于数据驱动的选项卡 4.1.1.需求 需求说明: 1. 被选中的选项按钮颜色成橙色 2. 完成被选中选项下的数据列表渲染 3. 完成选项切换 4.1.2.代码实现 <!D ...

  9. MFC中窗口静态分割&视图切换

    目录 窗口静态分割 单个分割器 声明 准备视图 静态分割窗口&添加视图 使视图大小随窗口大小改变 多个分割器 声明 静态分割窗口&添加视图 使视图大小随窗口大小改变 视图切换 视图之间 ...

  10. vs2010调试运行时弹出对话框:系统找不到指定文件

    很多时候,我们会将一些低版本IDE编译过的项目,搬迁到VS2010 ,那么会存在很多编译,调试问题.[1] 编译成功了.可是无法调试 . .       显示 无法启动程序“...........\t ...