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. 这一次搞懂Spring的XML解析原理

    前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规 ...

  2. 淘宝官网css初始化

    body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend ...

  3. 《Redis开发与运维》

    第1章 初识Redis 1. Redis介绍: Redis是一种基于键值对(key-value)的NoSQL数据库. 与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).has ...

  4. 获取系统的IP地址

    获取linux主机的IP地址 问题描述 在很多软件配置过程中,都需要设置ID信息,通常我选择使用系统配置的eth0网卡的IP地址信息,比如salt-minion-id,在通过cobbler批量安装操作 ...

  5. v-if和v-show的使用和特点

    v-if的特点是每次都会重新删除或创建操作 v-show的特点是每次不会进行DOM的删除和创建操作,只是切换了元素的display:none样式 <div id="app"& ...

  6. Linux Pam后门总结拓展

    首发先知社区: https://xz.aliyun.com/t/7902 前言 渐渐发现pam后门在实战中存在种植繁琐.隐蔽性不强等缺点,这里记录下学习pam后门相关知识和pam后门的拓展改进. 0x ...

  7. 甜咸粽子党大战,Python爬取淘宝上的粽子数据并进行分析

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 爬虫 爬取淘宝数据,本次采用的方法是:Selenium控制Chrome浏览 ...

  8. pikachu靶场-暴力破解(验证码、token)

    甲.基于表单的破解 较为简单,直接BurpSuite爆破. 乙.验证码绕过(on server) 打开题目,比第一题多了一个验证码验证,很多初学者遇到验证码就会感觉不知所措.其实这题也较为简单,首先正 ...

  9. 《Java核心技术(卷1)》笔记:第8章 泛型程序设计

    (P 327)"菱形"语法: ArrayList<String> files = new ArrayList<>(); // Java 9 扩展了菱形语法的 ...

  10. 调用微信内置的方法及wx.config的配置问题

    首先请看网址: https://www.w3cschool.cn/weixinkaifawendang/h8ap1qe5.html 重点说下怎么配置wx.config(为了安全,所有的参数都在服务端获 ...