tcpreplay的安装使用

转自:https://www.cnblogs.com/zlslch/p/7325599.html?utm_source=itdadao&utm_medium=referral

tcpreplay是什么?

  简单的说, tcpreplay是一种pcap包的重放工具, 它可以将用ethreal, wireshark工具抓下来的包原样或经过任意修改后重放回去. 它允许你对报文做任意的修改(主要是指对2层, 3层, 4层报文头), 指定重放报文的速度等, 这样tcpreplay就可以用来复现抓包的情景以定位bug, 以极快的速度重放从而实现压力测试。
  tcpreplay本身包含了几个辅助工具(tcpprep、tcprewrite、tcpreplay和tcpbridge), 用于准备发包的cache, 重写报文等。这也是 Tcpreplay 的第一个字母大写T的原因 。

      * tcpprep - 简单的说就是划分哪些包是client的, 哪些是server的, 一会发包的时候client的包从一个网卡发, server的包可能从另一个网卡发。

        即区分pcap数据包的流向,即区分出客户端和服务器。
      * tcprewrite - 简单的说就是修改2层, 3层, 4层报文头部。

        即改写pcap数据包的2-4层的头部信息,即MAC地址、IP地址和PORT等。
      * tcpreplay - 真正发包, 可以选择主、从网卡, 发包速度等。

        即回放pcap文件中的数据包。

   * tcpreplay-edit-更写pcap数据并回放,将tcprewrite和tcpreplat一条命令实现。
      * tcpbridge - bridge two network segments with the power of tcprewrite。

    

 

   以下是官网的原文。

The Tcpreplay suite includes the following tools:

  • tcpprep - multi-pass pcap file pre-processor which determines packets as client or server and creates cache files used by tcpreplay and tcprewrite
  • tcprewrite - pcap file editor which rewrites TCP/IP and Layer 2 packet headers
  • tcpreplay - replays pcap files at arbitrary speeds onto the network
  • tcpliveplay - Replays network traffic stored in a pcap file on live networks using new TCP connections
  • tcpreplay-edit - replays & edits pcap files at arbitrary speeds onto the network
  • tcpbridge - bridge two network segments with the power of tcprewrite
  • tcpcapinfo - raw pcap file decoder and debugger

 

 

  官网

http://tcpreplay.synfin.net/

 

 

 

 

 

 

 

 

  在CentOS里安装tcpreplay,总的来说,有如下两种安装方法。

 

  第一种安装方法:(推荐)

  直接yum -y install tcpreplay即可。

[root@datatest ~]# yum -y install tcpreplay

 

 

 

复制代码

[root@datatest ~]# tcpreplay -V
tcpreplay version: 4.2.5 (build git:v4.2.5)
Copyright 2013-2017 by Fred Klassen <tcpreplay at appneta dot com> - AppNeta
Copyright 2000-2012 by Aaron Turner <aturner at synfin dot net>
The entire Tcpreplay Suite is licensed under the GPLv3
Cache file supported: 04
Not compiled with libdnet.
Compiled against libpcap: 1.4.0
64 bit packet counters: enabled
Verbose printing via tcpdump: enabled
Packet editing: disabled
Fragroute engine: disabled
Injection method: PF_PACKET send()
Not compiled with netmap
[root@datatest ~]# 

复制代码

 

 

 

 

 

  第二种安装方法:

在Centos中安装TCPReplay

 

 

 

 

Tcpreplay的初步使用

  1、查看Tcpreplay里的tcpreplay的帮助文档命令

复制代码

[root@datatest ~]# tcpreplay -h
tcpreplay (tcpreplay) - Replay network traffic stored in pcap files
Usage:  tcpreplay [ -<flag> [<val>] | --<name>[{=| }<val>] ]... <pcap_file(s)>

   -q, --quiet                Quiet mode
安静模式

  -a
精确的时间(使用高速 cpu 发包)
  
  -d
输出调试信息(0-5,默认 0)


   -T, --timer=str            Select packet timing mode: select, ioport, gtod, nano
       --maxsleep=num         Sleep for no more then X milliseconds between packets
   -v, --verbose              Print decoded packets via tcpdump to STDOUT
可选参数,每发送一个报文都以 tcpdump 风格打印对应信息



   -A, --decode=str           Arguments passed to tcpdump decoder
可选参数,在使用 tcpdump 风格打印输出信息时,同时再调用 tcpdump 中的参数


   -K, --preload-pcap         Preloads packets into RAM before sending

  -c
双网卡回放报文必选参数,后跟文件名


   -C, --cachefile=str        Split traffic via a tcpprep cache file
把报文存在内部缓存中

  -N 
获得网络接口和出口


   -2, --dualfile             Replay two files at a time from a network tap
   -i, --intf1=str            Client to server/RX/primary traffic output interface
双网卡回放报文必选参数,指定从接口
  -I, --intf2=str Server to client/TX/secondary traffic output interface
      --listnics List available network interfaces and exit
双网卡回放报文必选参数,指定主接口

  -l, --loop=num Loop through the capture file X times
      --loopdelay-ms=num Delay between loops in milliseconds 
     --pktlen Override the snaplen and use the actual packet len
可选参数,指定循环次数

  -S
制定包长度




   -L, --limit=num            Limit the number of packets to send
       --duration=num         Limit the number of seconds to send
限制发包数量


  


   -x, --multiplier=str       Modify replay speed to a given multiple
   -p, --pps=str              Replay packets at a given packets/sec
可选参数,指定每秒发送报文的个数。制定该参数,其他速率相关的参数被忽略,
打印信息不会有速率和每秒发送报文的统计


   -M, --mbps=str             Replay packets at a given Mbps
以 Mbps(兆字节每秒)发送报文

  -m
可选参数,指定一个倍数值,比默认发送速度快多少倍发送报文


   -t, --topspeed             Replay packets as fast as possible
以最快的速度回放报文



   -o, --oneatatime           Replay one packet at a time for each user input
       --pps-multi=num        Number of packets to send for each time interval
       --unique-ip            Modify IP addresses each loop iteration to generate unique flows
       --unique-ip-loops=str  Number of times to loop before assigning new unique ip
       --no-flow-stats        Suppress printing and tracking flow count, rates and expirations
       --flow-expiry=num      Number of inactive seconds before a flow is considered expired
一次回放一个报文


   -P, --pid                  Print the PID of tcpreplay at startup
       --stats=num            Print statistics every X seconds, or every loop if '0'
可选参数,表示在输出信息中打印 PID 信息,用于单用户和单账户模式下暂停和重
启程序


   -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.
tcpreplay is a tool for replaying network traffic from files saved with
tcpdump or other tools which write pcap(3) files.

Please send bug reports to:  <tcpreplay-users@lists.sourceforge.net>
[root@datatest ~]# 

复制代码

 

  Tcpreplay 根据 cach 文件来回放 pcap 文件中的数据。

 

 

   tcpreplay小例子

[root@datatest ~]#  tcpreplay --intf1=eth1 --intf2=eth0 –t --cachfile=cach_test.cach http_rewrite_pcap

  

  --intf1=eth1 是指主接口是 eth1, 服务器-> 客户端的数据包通过这个接口发送。

      服务器和客户端的区分是从 tcpprep 的处理结果 cach_test.cach 中得到的。
  --intf2=eth0 是指从接口是 eth0,客户端->服务器的数据包通过这个接口发送。
  --cachfile=cach_test_cach 是指 tcpreplay 用 下面的tcpprep 的处理结果--cach_test.cach 来区分方向。
  http_rewrite.pcap 是指 tcpreplay 发送的是来自 http_rewrite.pcap 这个文件中的数据包 。

 

[root@datatest ~]#  tcpreplay –i eth1 –I eth0 –c ceshiftp.cach ceshiftp.pcap

   -i, --intf1这是数据重放的时候,的从接口。     -I, --intf2这是数据重放的时候,的主接口。  –c是双网卡回放报文必选参数,后跟文件名

 

 

 

  在linux下, 用ifconfig命令可以获得接口的名字。

  但在cygwin下必须用下面的命令获得接口的名字。
  在cygwin下获得接口的名字:

$ tcpreplay --listnics

 

  假设在windows下的cygwin里安装的tcpreplay

复制代码

$ tcpreplay --listnics
|Available network interfaces:
|Alias   Name    Description
|%0      \Device\NPF_GenericDialupAdapter
|        Adapter for generic dialup and VPN capture
|%1      \Device\NPF_{6B508B29-B3E3-4D0B-892F-02914AC9A668}
|    Intel(R) 82566DM Gigabit Network Connection (Microsoft's Packet
|    Scheduler)
|%2      \Device\NPF_{CBCE38CA-1FAD-4AEB-89DF-FD2D8EF861FA}
|    D-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C)
|    (Microsoft's Packet Scheduler)
|%3      \Device\NPF_{ABB813FE-3C51-49A3-8146-16CD2C4507C3}
|    D-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C)
|    (Microsoft's Packet Scheduler)

复制代码

 

 

   从中可以看出这台机器有两块网卡, 一块叫做%1, 另一块叫做%2. 下面就可以指定网卡重发包了:
  用tcpreplay发包:

[root@datatest ~]#  tcpreplay -c mgcp.cach -i %1 -I %2 out.pcap

   这条命令是把out.pcap包, 按照mgcp.cach里划分的主机包和客户端包的方式, 将主机包从网卡%1发出去, 将客户端包从网卡%2发出去.
 

  注:修改目的IP的MAC地址的时候,MAC地址不是目的机网卡物理地址,而是源机器所连接的交换机MAC地址。

 

 

 

 

 

 

 

2、查看Tcpreplay里的tcprewrite的帮助文档命令

 

复制代码

[root@datatest ~]# tcprewrite -h
tcprewrite (tcprewrite) - Rewrite the packets in a pcap file.
Usage:  tcprewrite [ -<flag> [<val>] | --<name>[{=| }<val>] ]...

   -r, --portmap=str          Rewrite TCP/UDP ports
重写 tcp/udp 端口


   -s, --seed=num             Randomize src/dst IPv4/v6 addresses w/ given seed
随机改写 IP 地址


   -N, --pnat=str             Rewrite IPv4/v6 addresses using pseudo-NAT
通过伪 NAT 重写 ip 地址


   -S, --srcipmap=str         Rewrite source IPv4/v6 addresses using pseudo-NAT



   -D, --dstipmap=str         Rewrite destination IPv4/v6 addresses using pseudo-NAT
   -e, --endpoints=str        Rewrite IP addresses to be between two endpoints
在最后 2 个点之间重写 ip 地址
   -b, --skipbroadcast        Skip rewriting broadcast/multicast IPv4/v6 addresses
不重写广播/多播 IP 地址


   -C, --fixcsum              Force recalculation of IPv4/TCP/UDP header checksums
强制重新计算 TP/RCP/UDP 校验和



   -m, --mtu=num              Override default MTU length (1500 bytes)
       --mtu-trunc            Truncate packets larger then specified MTU
指定 MTU



   -E, --efcs                 Remove Ethernet checksums (FCS) from end of frames
       --ttl=str              Modify the IPv4/v6 TTL/Hop Limit
       --tos=num              Set the IPv4 TOS/DiffServ/ECN byte
       --tclass=num           Set the IPv6 Traffic Class byte
       --flowlabel=num        Set the IPv6 Flow Label
删除以太网最后一帧的校验和(删除最后 2 个字节)




   -F, --fixlen=str           Pad or truncate packet data to match header length
       --fuzz-seed=num        Fuzz 1 in X packets.  Edit bytes, length, or emulate packet drop
       --fuzz-factor=num      Set the Fuzz 1 in X packet ratio (default 1 in 8 packets)
       --skipl2broadcast      Skip rewriting broadcast/multicast Layer 2 addresses
       --dlt=str              Override output DLT encapsulation
       --enet-dmac=str        Override destination ethernet MAC addresses
       --enet-smac=str        Override source ethernet MAC addresses
       --enet-subsmac=str     Substitute MAC addresses
       --enet-mac-seed=num    Randomize MAC addresses
       --enet-mac-seed-keep-bytes=num Randomize MAC addresses
       --enet-vlan=str        Specify ethernet 802.1q VLAN tag mode
       --enet-vlan-tag=num    Specify the new ethernet 802.1q VLAN tag value
       --enet-vlan-cfi=num    Specify the ethernet 802.1q VLAN CFI value
       --enet-vlan-pri=num    Specify the ethernet 802.1q VLAN priority
       --hdlc-control=num     Specify HDLC control value
       --hdlc-address=num     Specify HDLC address
       --user-dlt=num         Set output file DLT type
       --user-dlink=str       Rewrite Data-Link layer with user specified data

填充或截取包的数据以匹配包头长度



   -i, --infile=str           Input pcap file to be processed
处理输出 pcap 文件



   -o, --outfile=str          Output pcap file
输出 pcap 文件



   -c, --cachefile=str        Split traffic via tcpprep cache file
使用 tcpprep cach 文件分离流量





   -v, --verbose              Print decoded packets via tcpdump to STDOUT
tcpdump 风格打印对应信息




   -A, --decode=str           Arguments passed to tcpdump decoder
       --skip-soft-errors     Skip writing packets with soft errors
可选参数,在使用 tcpdump 风格输出信息时,同时再调用 tcpdump 中的参数





   -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.

Please send bug reports to:  <tcpreplay-users@lists.sourceforge.net>
[root@datatest ~]# 

复制代码

 

   简单地说, tcprewrite 就是改写 pcap 包里的报文头部, 包括 2 层, 3 层, 4 层,即 MAC 地址、IP 地址和PORT 等。tcpreplay 只保证能把包送出去, 至于包真正能到达的地址, 我认为还是根据原来的包的 IP 和 mac,

如果是在同一网段,可能需要把 mac 地址改成测试设备的 mac,如果需要经过网关, 就得将 IP 地址改为测试设备的 IP 以及端口号 。

 

 

  tcpreplay只保证能把包送出去, 至于包真正能到达的地址, 我认为还是根据原来的包的IP和mac. 如果是在同一网段, 可能需要把mac地址改成测试设备的mac, 如果需要经过网关, 就得将IP地址改为测试设备的IP以及端口号。
  tcprewrite的基本格式是(请注意命令中是没有换行符的, 只为了阅读的方便添加了换行符): 详请可以用tcprewrite ?命令查询详情。

[root@datatest ~]#   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。
 

 

 


 

 

 

 

 




  举个小例子

[root@datatest ~]# tcprewrite --enet-smac=11:22:22:22:22:22,22:22:22:22:22:22  \
--enet-dmac=FF:FF:FF:FF:FF:FF   \
--endpoints=192.168.0.1:192.168.0.11    \
--portmap=5070:5061,9060:5060    \
-i success.pcap -o out.pcap -c success.cach

  该命令将修改后的包的

  主机端的二层, 三层, 四层头分别为: 11:22:22:22:22:22,192.168.0.1,5061,

  客户端包的二层, 三层, 四层头分别为: 22:22:22:22:22:22,192.168.0.11, 5060。
 

 

 

 

[root@datatest ~]#  tcprewrite --seed=6 -i success.pcap -o out.pcap -c success.cach

  该命令将根据数字 6 按特征算法生成一个新的 server_ip 和 client_ip。

 

 

 

 

[root@datatest ~]#  tcprewrite --pmap=192.168.0.0/16:10.77.0.0/16,172.16.0.0/12:10.1.0.0/24    \
-i success.pcap -o out.pcap -c success.cach

  该命令将把主机端和客户端 192.168.0.0/16、172.16.0.0/12 网段的 ip 地址分别改为 10.77.0.0/16、10.1.0.0/24。
 

 

 

[root@datatest ~]#   tcprewrite --srcipmap=192.168.0.0/16:10.77.0.0/16   \
-i success.pcap -o out.pcap -c success.cach

  该命令将把主机端和客户端的源 ip 为 192.168.0.0/16 网段改为 10.77.0.0/16 网段

 

 

 

[root@datatest ~]#   tcprewrite --dstipmap=172.16.0.0/12:10.1.0.0/24
-i success.pcap -o out.pcap -c success.cach

  该命令将把主机端和客户端的目的 ip 为 192.168.0.0/16 网段改为 10.77.0.0/16 网段。

 

 

 

   修改2层头

    1) 修改MAC地址
    如果不指定cache文件, 将把所有包的源mac地址和目的mac地址都改写成00:44:66:FC:29:AF和00:55:22:AF:C6:37:

[root@datatest ~]#  tcprewrite --enet-dmac=00:55:22:AF:C6:37 --enet-smac=00:44:66:FC:29:AF --infile=input.pcap --outfile=output.pcap

 

  指定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@datatest ~]#  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=input.cache --infile=input.pcap --outfile=output.pcap

 


 

  2) 修改802.1q VLAN
  经常客户的抓包带有VLAN头域, 这些包如果不去掉VLAN头是没有办法在自己的交换机上replay的, tcprewrite提了去掉或添加VLAN的方法:
    去掉vlan很简单:

[root@datatest ~]#  tcprewrite --enet-vlan=del --infile=input.pcap --outfile=output.pcap

  

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

[root@datatest ~]#  tcprewrite --enet-vlan=add --enet-vlan-tag=40 --enet-vlan-cfi=1 --enet-vlan-pri=4 --infile=input.pcap --outfile=output.pcap

 

 

  3) 修改二层协议名:
  好像是将Ethernet协议头转成Cisco HDLC或其它二层协议? 这部分没有真正用过, 需要的
人自行参考tcpreplay官方网站: http://tcpreplay.synfin.net/wiki/manual

 

 

 

   修改3层头
  从版本3.4.2开始, tcprewrite开始支持ipv6协议, tcpreplay升级蛮快。 tcprewrite修改IP地址后会自动帮你计算校验和, 这点还是蛮周到的。

  命令行传入IPv6地址的时候要使用方括号, 例如: [2001::dead:beef]或[2001::/16]


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

[root@datatest ~]#  tcprewrite --endpoints=10.10.1.1:10.10.1.2 --cachefile=input.cache --infile=input.pcap --outfile=output.pcap --skipbroadcast

 


  2)修改IP地址的网络部分
    注: 2)和3)没有验证过。

    众所周知, IP地址同网络部分和主机部分组成, 下面的命令可以将子网地址为10.0.0.0/8或192.168.0.0/16的IP改成子网为172.16.0.0/12:

[root@datatest ~]#  tcprewrite --pnat=10.0.0.0/8:172.16.0.0/12,192.168.0.0/16:172.16.0.0/12 --infile=input.pcap --outfile=output.pcap --skipbroadcast

 

  下面的命令是基于client包或server包修改子网地址:

[root@datatest ~]#   tcprewrite --pnat=10.0.0.0/8:192.168.0.0/24 --pnat=10.0.0.0/8:192.168.1.0/24 --cachefile=input.cache --infile=input.pcap --outfile=output.pcap --skipbroadcast

 

 

  3) 修改IP头的其它部分:
  

  修改IPv4头的TOS为50

[root@datatest ~]#  tcprewrite --tos=50 --infile=input.pcap --outfile=output.pcap

 

  将IPv6头Traffic Class值改为33

[root@datatest ~]#  tcprewrite --tclass=33 --infile=input.pcap --outfile=output.pcap

 

 

  修改Flow Label field:

[root@datatest ~]#  tcprewrite --flowlabel=67234 --infile=input.pcap --outfile=output.pcap

 

 

 

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

 

  1) 修改端口号
    将80端口号改为8080, 22改为8022:

[root@datatest ~]#  tcprewrite --portmap=80:8080,22:8022 --infile=input.pcap --outfile=output.pcap

 

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

[root@datatest ~]#  tcprewrite --fixcsum --infile=input.pcap --outfile=output.pcap

 

 

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

 

 

 

 

 

 

 

 

3、查看Tcpreplay里的tcpprep的帮助文档命令

 

复制代码

[root@datatest ~]# tcpprep -h
tcpprep (tcpprep) - Create a tcpreplay cache cache file from a pcap file.
Usage:  tcpprep [ -<flag> [<val>] | --<name>[{=| }<val>] ]...

   -a, --auto=str             Auto-split mode
一般情况下都需要的参数,表示按模式自动分离通信流量生成 cach 文件 

   -c, --cidr=str             CIDR-split mode
可选参数, 表示分离流量时采用 CIDR(无类别域间路由选择,是一个在 internet
上创建附加地址的方法,这些地址提供给服务提供商,再由服务提供商分配给客户。
CIDR 将路由集中起来,使一个 IP 地址代表主要骨干提供商提供的几千个 IP 地址,
从而减轻 internet 路由器的负担) 

   -r, --regex=str            Regex-split mode
可选参数,表示使用 regex 模式分离通信流量,有点类似于 CIDR 模式,但是它匹
配的是服务器源 IP 

   -p, --port                 Port-split mode
可选参数,基于目的端口来分离通信流量,它区分的依据是任何 0-1023 端口都是
服务器的端发出的报文,其他的端口都是客户端发出的报文 

   -e, --mac=str              Source MAC split mode
表示基于服务器源 MAC 地址分离通信流量 

       --reverse              Matches to be client instead of server

   -C, --comment=str          Embedded cache file comment
可选参数,表示在 cach 文件中嵌入注释内容,用于注释说明 cach 文件的内容。使用位置不要放在最后,生成 cach 后可以使用-P 查看写入的内容。


       --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
可选参数,是-x 的取反

   -o, --cachefile=str        Output cache file

   生成 cach 文件必带参数,后跟 cach 后缀的文件名,表示这个输出的 cach 文
件以这个文件名命名

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

  生成 cach 文件必带参数,后跟 pcap 文件名,表示这个 pcap 文件需要处理

-P, --print-comment=str    Print embedded comment in the specified cache file
可选参数,表示查看 cach 文件的内容

   -I, --print-info=str       Print basic info from the specified cache file
表示打印 cach 文件的基本信息


   -S, --print-stats=str      Print statistical information about the specified cache file
表示打印 cach 文件的统计信

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

  表示从服务器端口下载服务文件

-N, --nonip                Send non-IP traffic out server interface
表示从服务器端口发送无 IP 流量


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

  可选参数,一个比例值。服务器端发起的连接数和客户端发起的连接数的比例,值
大于 2 就视为服务器端

-m, --minmask=num          Minimum network mask length in auto mode
可选参数,在选用 router 模式时使用,表示最小掩码,掩码默认是 30


   -M, --maxmask=num          Maximum network mask length in auto mode
可选参数,在选用 router 模式时使用,表示最大掩码,默认是 8


   -v, --verbose              Print decoded packets via tcpdump to STDOUT
可选参数,显示 tcpprep 生成 cach 文件的处理过程。信息的随时大于


   -A, --decode=str           Arguments passed to tcpdump decoder
可选参数,在实验 tcpdump 风格打印输出信息时,同时再调用 tcpdump 中的参数


   -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.

Please send bug reports to:  <tcpreplay-users@lists.sourceforge.net>
[root@datatest ~]# 

复制代码

 

 

   tcpprep 是一个在 tcprewrite 和 tcpreplay 之前使用的 pcap 文件的处理程序。使用 tcpprep 的目的就是建立一个 cach 文件,用于分离通信流量中的两方(通常叫做 主要的/次要的 或者 客户端/服务器),为 tcprewrite 和 tcpreplay 处理与发送报文做准备。

  如果你正打算在两块网卡上使用 tcpreplay 的话,那么 tcpprep 就是用来决定每一个报文(packet)从哪一个接口发出。通过使用这样一个分离的程序来建立一个 cach 文件,tcpreplay 就可以根据这个 cach 文件通过自身的计算来分离流量,高速率的发送报文。cach 文件的作用主要是加速报文的发送,cach 文件中存放着 pcap 文件中每个帧的编号和时间戳等信息,以达到 tcpreplay 回放时可以更加快速的发送报文的目的。 

  举个例子, 如果你用 wireshark 或者ethereal抓了一个 pcap 文件,里面可能既有 A 地址发给 B 地址的包,也有 B地址发给 A 址的包,用 tcpprep 工具可以指定从 A 到 B 的包从主网卡发出, 从 B 到 A 的包从次网卡发出。 
 


  
  tcpprep 用法举例 
1、根据报文源 IP 确定 client/server 报文

[root@datatest ~]#  tcpprep -c 172.22.64.2/24 -i mgcp.pcap -o mgcp.cach 

  上面的命令指定所有源 IP 为 172.22.64.2/24 的包, 都将从主网卡发出, 其它的从次网卡发出 。输入文件是mgcp.pcap, 输出文件为mgcp.cach。

 

2、使用自动模式确定 client/server 报文 

 [root@datatest ~]#  tcpprep -a client -i mgcp.pcap -o mgcp.cach

  上面的命令采用自动/client 模式指定分包模式。

  自动模式这里按我的理解解释一下:
  tcpprep 在自动模式下认为有下面行为的 IP 为 client 端:

    1、发 TCP SYN 包的一方

    2、发 DNS 包的一方

    3、 收入到 ICMP-Port Unreachable 的一方;

      认为有下面行为的一方为 server 端:

    1、发 TCPSyn/Ack 的一方

    2、发 DNS 应答的一方

    3、发 ICMP-Port Unreachable 的一方

  而被认定为 server 的那一方发的那些包, 将从主网卡发出, 被认定为 client 的包则从次网卡发出. 而自动/client 模式将所有没有认出的包都归为 client, 同理自动/server 模式将没有认出的包都归为 server.这种模式貌似不如按 IP 地址分类的方式好用 。

 

 



 

 

 


  

 

 

 

 

 

 

 

 

 

 

 

 

4、查看Tcpreplay里的tcpreplay-edit的帮助文档命令

 

复制代码

[root@datatest ~]# tcpreplay-edit -h
tcpreplay (tcpreplay) - Replay network traffic stored in pcap files
Usage:  tcpreplay-edit [ -<flag> [<val>] | --<name>[{=| }<val>] ]... <pcap_file(s)>

   -r, --portmap=str          Rewrite TCP/UDP ports
   -s, --seed=num             Randomize src/dst IPv4/v6 addresses w/ given seed
   -N, --pnat=str             Rewrite IPv4/v6 addresses using pseudo-NAT
   -S, --srcipmap=str         Rewrite source IPv4/v6 addresses using pseudo-NAT
   -D, --dstipmap=str         Rewrite destination IPv4/v6 addresses using pseudo-NAT
   -e, --endpoints=str        Rewrite IP addresses to be between two endpoints
   -b, --skipbroadcast        Skip rewriting broadcast/multicast IPv4/v6 addresses
   -C, --fixcsum              Force recalculation of IPv4/TCP/UDP header checksums
   -m, --mtu=num              Override default MTU length (1500 bytes)
       --mtu-trunc            Truncate packets larger then specified MTU
   -E, --efcs                 Remove Ethernet checksums (FCS) from end of frames
       --ttl=str              Modify the IPv4/v6 TTL/Hop Limit
       --tos=num              Set the IPv4 TOS/DiffServ/ECN byte
       --tclass=num           Set the IPv6 Traffic Class byte
       --flowlabel=num        Set the IPv6 Flow Label
   -F, --fixlen=str           Pad or truncate packet data to match header length
       --fuzz-seed=num        Fuzz 1 in X packets.  Edit bytes, length, or emulate packet drop
       --fuzz-factor=num      Set the Fuzz 1 in X packet ratio (default 1 in 8 packets)
       --skipl2broadcast      Skip rewriting broadcast/multicast Layer 2 addresses
       --dlt=str              Override output DLT encapsulation
       --enet-dmac=str        Override destination ethernet MAC addresses
       --enet-smac=str        Override source ethernet MAC addresses
       --enet-subsmac=str     Substitute MAC addresses
       --enet-mac-seed=num    Randomize MAC addresses
       --enet-mac-seed-keep-bytes=num Randomize MAC addresses
       --enet-vlan=str        Specify ethernet 802.1q VLAN tag mode
       --enet-vlan-tag=num    Specify the new ethernet 802.1q VLAN tag value
       --enet-vlan-cfi=num    Specify the ethernet 802.1q VLAN CFI value
       --enet-vlan-pri=num    Specify the ethernet 802.1q VLAN priority
       --hdlc-control=num     Specify HDLC control value
       --hdlc-address=num     Specify HDLC address
       --user-dlt=num         Set output file DLT type
       --user-dlink=str       Rewrite Data-Link layer with user specified data
   -q, --quiet                Quiet mode
   -T, --timer=str            Select packet timing mode: select, ioport, gtod, nano
       --maxsleep=num         Sleep for no more then X milliseconds between packets
   -v, --verbose              Print decoded packets via tcpdump to STDOUT
   -A, --decode=str           Arguments passed to tcpdump decoder
   -K, --preload-pcap         Preloads packets into RAM before sending
   -c, --cachefile=str        Split traffic via a tcpprep cache file
   -2, --dualfile             Replay two files at a time from a network tap
   -i, --intf1=str            Client to server/RX/primary traffic output interface
   -I, --intf2=str            Server to client/TX/secondary traffic output interface
       --listnics             List available network interfaces and exit
   -l, --loop=num             Loop through the capture file X times
       --loopdelay-ms=num     Delay between loops in milliseconds
       --pktlen               Override the snaplen and use the actual packet len
   -L, --limit=num            Limit the number of packets to send
       --duration=num         Limit the number of seconds to send
   -x, --multiplier=str       Modify replay speed to a given multiple
   -p, --pps=str              Replay packets at a given packets/sec
   -M, --mbps=str             Replay packets at a given Mbps
   -t, --topspeed             Replay packets as fast as possible
   -o, --oneatatime           Replay one packet at a time for each user input
       --pps-multi=num        Number of packets to send for each time interval
       --unique-ip            Modify IP addresses each loop iteration to generate unique flows
       --unique-ip-loops=str  Number of times to loop before assigning new unique ip
   -!, --no-flow-stats        Suppress printing and tracking flow count, rates and expirations
   -", --flow-expiry=num      Number of inactive seconds before a flow is considered expired
   -P, --pid                  Print the PID of tcpreplay at startup
   -#, --stats=num            Print statistics every X seconds, or every loop if '0'
   -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.
tcpreplay is a tool for replaying network traffic from files saved with
tcpdump or other tools which write pcap(3) files.

Please send bug reports to:  <tcpreplay-users@lists.sourceforge.net>
[root@datatest ~]# 

复制代码

 

   tcpreplay-edit 实时修改包数据并回放,它是将 tcprewrite 和 tcpreplay 用一条命令实现。其好处是修改包数据不会新生成 pcap 文件。如果是需要不断的改写一个包文件并回放建议使用 tcpreplay-edit,如果是需要一次改写一个包文件并多次回放建议使用 tcprewrite 和 tcpreplay 的结合,这样具有更好的回放速率。 


  tcpreplay-edit小例子

  编写脚本,不断改写包文件的 IP 地址并回放: 

  比如,你自己写个test.sh脚本,然后赋予chmod 777 test.sh。执行就是

for i in {1..255}
do
tcpreplay-edit --endpoints=1.1.2.$i:1.1.1.2 -t -i eth2 -I eth1 -c edit.cach edit.pcap
done

 

 

 

 

 

 

 

 

 

5、查看Tcpreplay里的tcpliveplay的帮助文档命令

复制代码

[root@datatest ~]# tcpliveplay -H
tcpliveplay (tcpliveplay) - Replays network traffic stored in a pcap file on live networks using new TCP connections
Usage:  tcpliveplay [ -<flag> [<val>] | --<name>[{=| }<val>] ]... \
        <eth0/eth1> <file.pcap> <Destinatin IP [1.2.3.4]> <Destination mac [0a:1b:2c:3d:4e:5f]> <'random' dst port OR specify dport #>

   -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
                - disabled as '--no-load-opts'
                - may appear multiple times

Options are specified by doubled hyphens and their name or by a single
hyphen and the flag character.
This program, 'tcpliveplay' replays a captured set of packets using new TCP
connections with the captured TCP payloads against a remote host in order
to do comprehensive vulnerability testings.

The following option preset mechanisms are supported:
 - reading file /usr/bin/.tcpliveplayrc
The basic operation of tcpliveplay is it rewrites the given pcap file in a
scheduled event format and responds with the apporiate packet if the remote
host meets tcp protocal's SEQ/ACK expectation.  Once expectations are met,
then the local packets are sent with the same payload except with new tcp
SEQ & ACK numbers meeting the response from the remote hose.

The inputted pcap file are rewritten to start at the first encounter of the
SYN packet for correct operation making this packet be the first action in
the event schedule of local host doing the replay.

For more details, please see the Tcpreplay Manual at:
http://tcpreplay.appneta.com
[root@datatest ~]# 

复制代码

 

 

 

 

 

 

6、查看Tcpreplay里的tcpbridge的帮助文档命令

复制代码

[root@datatest ~]# tcpbridge -h
tcpbridge (tcpbridge) - Bridge network traffic across two interfaces
Usage:  tcpbridge [ -<flag> [<val>] | --<name>[{=| }<val>] ]...

   -r, --portmap=str          Rewrite TCP/UDP ports
   -s, --seed=num             Randomize src/dst IPv4/v6 addresses w/ given seed
   -N, --pnat=str             Rewrite IPv4/v6 addresses using pseudo-NAT
   -S, --srcipmap=str         Rewrite source IPv4/v6 addresses using pseudo-NAT
   -D, --dstipmap=str         Rewrite destination IPv4/v6 addresses using pseudo-NAT
   -b, --skipbroadcast        Skip rewriting broadcast/multicast IPv4/v6 addresses
   -C, --fixcsum              Force recalculation of IPv4/TCP/UDP header checksums
   -m, --mtu=num              Override default MTU length (1500 bytes)
       --mtu-trunc            Truncate packets larger then specified MTU
   -E, --efcs                 Remove Ethernet checksums (FCS) from end of frames
       --ttl=str              Modify the IPv4/v6 TTL/Hop Limit
       --tos=num              Set the IPv4 TOS/DiffServ/ECN byte
       --tclass=num           Set the IPv6 Traffic Class byte
       --flowlabel=num        Set the IPv6 Flow Label
   -F, --fixlen=str           Pad or truncate packet data to match header length
       --fuzz-seed=num        Fuzz 1 in X packets.  Edit bytes, length, or emulate packet drop
       --fuzz-factor=num      Set the Fuzz 1 in X packet ratio (default 1 in 8 packets)
       --skipl2broadcast      Skip rewriting broadcast/multicast Layer 2 addresses
       --dlt=str              Override output DLT encapsulation
       --enet-dmac=str        Override destination ethernet MAC addresses
       --enet-smac=str        Override source ethernet MAC addresses
       --enet-subsmac=str     Substitute MAC addresses
       --enet-mac-seed=num    Randomize MAC addresses
       --enet-mac-seed-keep-bytes=num Randomize MAC addresses
       --enet-vlan=str        Specify ethernet 802.1q VLAN tag mode
       --enet-vlan-tag=num    Specify the new ethernet 802.1q VLAN tag value
       --enet-vlan-cfi=num    Specify the ethernet 802.1q VLAN CFI value
       --enet-vlan-pri=num    Specify the ethernet 802.1q VLAN priority
       --hdlc-control=num     Specify HDLC control value
       --hdlc-address=num     Specify HDLC address
       --user-dlt=num         Set output file DLT type
       --user-dlink=str       Rewrite Data-Link layer with user specified data
   -i, --intf1=str            Primary interface (listen in uni-directional mode)
   -I, --intf2=str            Secondary interface (send in uni-directional mode)
   -u, --unidir               Send and receive in only one direction
       --listnics             List available network interfaces and exit
   -L, --limit=num            Limit the number of packets to send
   -M, --mac=str              MAC addresses of local NIC's
   -x, --include=str          Include only packets matching rule
   -X, --exclude=str          Exclude any packet matching this rule
   -P, --pid                  Print the PID of tcpbridge at startup
   -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.
tcpbridge is a tool for selectively briding network traffic across two
interfaces and optionally modifying the packets in between

Please send bug reports to:  <tcpreplay-users@lists.sourceforge.net>
[root@datatest ~]# 

复制代码

 

 

 

 

 

7、查看Tcpreplay里的tcppcpinfo的帮助文档命令

复制代码

[root@datatest ~]# tcpcapinfo -h
/usr/bin/tcpcapinfo: illegal option -- h
tcpcapinfo (Tcpreplay Suite) - Pcap file dissector for debugging broken pcap files
Usage:  tcpcapinfo [ -<flag> [<val>] | --<name>[{=| }<val>] ]... <pcap_file(s)>

   -V, --version              Print version information
   -H, --help                 display extended usage information and exit
   -!, --more-help            extended usage information passed thru pager

Options are specified by doubled hyphens and their name or by a single
hyphen and the flag character.
tcpcapinfo is a tool for decoding the structure of a pcap(3) file with a
focus on finding broken pcap files and determining how two related pcap
files might differ.

Please send bug reports to:  <tcpreplay-users@lists.sourceforge.net>
[root@datatest ~]# 

复制代码

 

 

 

 

 

 

 

 Tcpreplay总结 (以下只是一个小例子来完整跑一遍)

  通过 Tcpreplay 来修改、转发通信流量需要考虑的一共需要考虑以下 3 点:
    1、 确定哪有数据包是从客户端到服务器端的,哪有是从服务器端到客户端的
    2 、确定新的 MAC、IP、Port
    3、确定回放速率、循环次数、执行方式 

  第一步:
    用 tcpreplay 分离源/目的端口的流量。

tcpprep --port --cachfile=example.cach --pcap=example.pcap

  这种情况下,认为所有目的端口小于1024 的,将被视为客户端->服务器的包。

        认为所有目的端口大于1024 的,否则视为服务器->客户端的包。

  该信息被存储在 tcpprp 的一个名叫 example.cach 的文件夹中。
  --port 根据端口号区分数据包的流向。
  --cachfile 指定输出的 cach 文件的名字,即在这里要输出为example.cach
  --pcap 指定要处理的数据包文件,即在这里要处理的是example.pcap。
  其实。tcpprep 支持许多的其他的模式,分离端口模式是其中的一种 。也就是说,第一步,大家自行选择。

 

 

  第二步:
  使用 tcprewrite 更改 ip 地址到本地网络:

$ tcprewrite --endpoints=172.16.0.1:172.16.5.35   --cachfile=example.cach --infile=example.pcap --outfile=new.pcap

  这个例子里,我们想要所有的流量来自于 172.16.0.1 和 172.16.5.35。我们想要一个 IP 是“客户端”,一个 IP 是“服务器端 。
 

   tcprewrite 改写数据包:
    --endpoints 指定数据包的 client、server 端的 ip 地址
    --cachfie 上一步预处理的输出文件,即example.cach
    --infile 输入 pcap 文件,即example.pcap。
    --outfile 改写后的 pcap 文件 ,即new.pcap。

 

 

 

 

 

  第三步:用 tcpreplay,发送流量通过服务提供商

tcpreplay --intf1=eth0 --intf2=eth1 --cachfile=example.cach new.pcap

  因为我们要分离 2 个接口(eth0 和 eth1)之间的通信,我们使用第一步中创建的 cach 文件,第二步中创建的 new.pacp。
  然后使用 tcpreplay 重发数据包。

 

 

 

 

 

  如果大家还是不明白,我就再详细的讲个案例。
  见

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值