2020-09-08

tcpdump  tcprewrite  tcpreplay(tcpprep)基本使用

一 tcpdump

1.tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信息。

2.关键字:(host net port)(src dst)(fddi ip arp rarp tcp udp)(gateway、broadcast、 less、 greater)

3.选项介绍:

-c:抓取指定数目的包

-i:指定监听的网络接口。

-n:显示ip,而不是主机名

-nn:显示port,而不是服务名

-w<数据包文件>:直接将包写入文件中,并不分析和打印出来

-r<数据包文件>:从指定的文件中读取包(这些包一般通过-w选项产生)

-vv 输出详细的报文信息

-l:如果没有使用 -w 选项,就可以将报文打印到 标准输出终端(此时这是默认)

-q:快速输出,仅列出少数传输协议信息

3.操作实例

 

二 tcprewrite

1.格式

tcprewrite [-flag [value]]... [--opt-name [[=| ]value]]...

  所有参数均为选项。

Tcprewrite是一个改写pcap文件报文的工具。可以将修改后的报文通过 tcpreplay重新发送出去。

2.选项介绍

-r string, --portmap=string

    将匹配端口修改成指定端口,匹配的端口之间由逗号分割,冒号后边跟着要修改成的指定端口号

    示例:

    --portmap=80:8000 --portmap=8080:80    # 80->8000 and 8080->80
    --portmap=8000,8080,88888:80           # 3 different ports become 80
    --portmap=8000-8999:80                 # ports 8000 to 8999 become 80

-N string, --pnat=string

    改写 IPv4/v6 地址,该选项不能跟 srcipmap 选项混合使用

    IPv4 示例:
                  --pnat=192.168.0.0/16:10.77.0.0/16,172.16.0.0/12:10.1.0.0/24

-i string, --infile=string
 指定要处理的 pcap 文件

-o string, --outfile=string
 输出 pcap 文件

-c string, --cachefile=string

    通过 tcpprep 的 cache 文件划分流量,通过 tcpprep 的cache 文件区分客户端

-S string, --srcipmap=string

    工作原理跟 --pnat 选项类似,但是只影响IPv4/v6 源IP地址

-D string, --dstipmap=string

    工作原理跟 --pnat 类型,但是只影响 IPv4/v6 的目的 IP 地址

-e string, --endpoints=string

    对点修改IP地址,该选项只能出现一次。该选项必须跟 --cachefile 选项联合使用

    [实例操作发现就是指定了servier address : client address,将pcap文件中的所有客户端、服务器都改成这一对IP地址]

              IPv4 示例:
                  --endpoints=172.16.0.1:172.16.0.2

3.操作实例

三 tcpreplay

1.tcpreplay用于重放保存在pcap文件中的网络流量,它支持按照捕获pcap文件时数据包的速度、或者指定速度去重放网络流量,只要在硬件承受的范围内即可

格式:tcpreplay [-flags] [-flag [value]] [--option-name[[=| ]value]] <pcap_file(s)>

2.选项介绍

-i 客户端到服务器主要流量输出接口。用于发送所有流量  或被tcpprep标记为“主要”流量的必需网络接口。主要流量通常是khial虚拟接口上的客户端到服务器

-I 服务器到客户端辅助流量输出接口。发送被tcpprep标记为“辅助”流量的可选网络接口。辅助流量通常是khial虚拟接口上的服务器到客户端。将此选项与--cachefile一起使用才有意义。

-t 尽可能快地重放数据包

-l number, --loop=number

循环捕获文件次数。此选项将整数作为输入参数。 number的值被限制为:大于或等于0,此选项的默认输入number为:1

-K, --preload-pcap 此选项在开始发送之前将指定的pcap加载到RAM中,以便提高启动性能,进而提高重放性能。

-M string--mbps=string 以给定的Mbps重放数据包。此可为tcpreplay设定其发送数据包的Mbps速率,该值可以指定为浮点值

-t--topspeed 尽可能快地重放数据包

-c string 通过tcpprep缓存(cache)文件拆分流量。此选项必须与以下选项一起使用:intf2
如果你有一个pcap文件,你想用它来通过一个设备(防火墙,路由器,IDS等)发送双向流量,然后使用tcpprep可以创建一个缓存文件,tcpreplay将用它来分割两个网络接口的流量。

3.操作实例

四 tcpprep

1.Tcpprep 通过用户定义的一系列规则处理 pcap 文件,生成cache文件,通过cache文件tcpreply可以确定单个报文是否发送以及通过哪个接口发送

   格式:tcpprep [ -<flag> [<val>] | --<name>[{=| }<val>] ]...

2.选项介绍

-a string, --auto=string

能使报文自动区分,Tcpprep 会通过捕获的报文推测对应 IP 地址是服务器还是客户端,可用的参数为:

bridge : Bridge模式处理每个报文,尽量去判断该报文的发送者是client还是server。处理完所有报文之后,结果会根据比率(--ratio)调整。如果存在不能正确分类的报文,程序会退出。

router : Router模式跟Bridge工作模式工作方式类似。报文根据比率调整之后,tcpprep会调整掩码(从minmask到            maxmask),直到不能正确识别的地址跟到某个客户端或者服务器落入同一网段中。Router模式有很大几率成功区分client、  server,但不百分之百保证。

client : client模式跟bridge模式工作方式类似,不能正确分类的报文会被认为是客户端。client模式应该一直成功

server : Server模式跟bridge工作方式类似,不能正确分类的报文会被认为为servers。server模式应该一直成功

first : First 模式该通过查看每个IP地址首先在SRC中出现还是在DST中出现。如果IP地址首先在SRC域中出现,IP被认为是客户端,如果IP地址首先在DST域中出现,IP地址被识别为服务器。该模式一直能执行成功

-c string, --cidr=string

指定一系列通过逗号分割的网段,每个报文的源IP地址跟该网段匹配,能匹配到的报文即为服务器端。

 IPv4 示例:
      --cidr=192.168.0.0/16,172.16.0.0/12,10.0.0.0/8

-r string, --regex=string    

指定正则表达式取匹配每个报文的源IP地址,匹配成功的报文被认为是服务器。 

-p, --port

特定的TCP、UDP报文可以通过报文头部的目的端口区分client、server

示例:

指定源ip: tcpprep -c 192.168.10.1/32 -i tcp_sample.pcap -o tcp_sample.cache

使用自动判断模式: tcpprep -a client -i tcp_sample.pcap -o tcp_sample.cache

3.操作实例

# ping服务器,然后在服务器上抓包(这样抓到的包是一去一返的)

tcpdump -i eno1 -c 6 -w 111.pcap

tcpdump -r 111.pcap -q -nn

tcpprep -c 192.168.10.100 -i 111.pcap -o 111.cache   #用ip指定s和c,192.168.10.100是s

tcpreplay -i eno1 -I eno2 -c 111.cache 111.pcap

用网线分别连接client与server的两个网络接口,用wireshark分别监听eno1 与 eno2(选择监听以太网)

 

 

 

 

 

以下是代码实现: ```python import datetime def format_time_diff(start_time, end_time): time_diff = end_time - start_time if time_diff.days > 365: return end_time.strftime("%Y年%m月") elif time_diff.days > 30: return end_time.strftime("%Y年%m月%d日") elif time_diff.days > 0: return f"{time_diff.days}天前" elif time_diff.seconds > 3600: return f"{int(time_diff.seconds/3600)}小时前" elif time_diff.seconds > 60: return f"{int(time_diff.seconds/60)}分钟前" elif time_diff.seconds > 0: return f"{time_diff.seconds}秒前" else: return "未来时间" start_time = datetime.datetime(2018, 3, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 1, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 8, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 20) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 50) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 30, 40) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") ``` 输出结果为: ``` 2018-03-01 09:00:00 -> 2020-02-29 09:30:30: 2018年03月 2020-01-01 09:00:00 -> 2020-02-29 09:30:30: 2020年01月01日 2020-02-01 09:00:00 -> 2020-02-29 09:30:30: 28天前 2020-02-29 08:00:00 -> 2020-02-29 09:30:30: 1小时前 2020-02-29 09:29:20 -> 2020-02-29 09:30:30: 1分钟前 2020-02-29 09:29:50 -> 2020-02-29 09:30:30: 40秒前 2020-02-29 09:30:40 -> 2020-02-29 09:30:30: 未来时间 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值