一 tcpreplay介绍
tcpreplay是一种pcap包的重放工具, 包括(tcpprep、tcprewrite、tcpreplay和tcpbridge),它可以将用ethreal, wireshark工具抓下来的包原样或经过任意修改后重放回去. 它允许你对报文做任意的修改(主要是指对2层, 3层, 4层报文头), 指定重放报文的速度等, 这样tcpreplay就可以用来复现抓包的情景以定位bug, 以极快的速度重放从而实现压力测试。
官网: http://tcpreplay.appneta.com/
二 tcpreplay安装
Ubuntu环境下安装tcpreplay工具
sudo apt update
sudo apt install tcpreplay
查看安装是否成功:
tcpreplay -V
安装成功界面如下:
三 tcpreply工具的使用
直接执行以下命令重放.pcap文件
sudo tcpreplay -i s1-eth1 -t extract.pcap
-i 后面为重放端口,-t后面为需要重放的.pcap文件,其中 .pcap文件 是用wireshark或者tcpdump抓取的流量包。
重放成功如下图所示:
使用tcpprep工具修改.pcap文件中的源IP地址和目的IP地址
准备数据:
(1)被修改文件:extract.pcap
(2)修改后文件名:extract.cach
(4)源IP:10.0.1.1
(5)目的IP:10.0.2.2
生成一个中间文件
tcpprep -p --pcap=extract.pcap --cachefile=extract.cach
使用tcprewrite将中间文件另存为.pcap文件
tcprewrite -i extract.pcap -o output.pcap --cachefile=extract.cach -e 10.0.1.1:10.0.2.2
如果你改的IP会话顺序不正确,要注意端口的设置:
tcpprep --regex=\在port模式下,用端口号来区分server 和client.默认情况下,0—1024端口为server端所有.1024以外为client所有.当然.你也可以在自己/etc/services中划分服务器端口.
对比修改前和修改后:
使用receive.py来查看端口接受的流量情况
#!/usr/bin/env python3
import os
import sys
from scapy.all import TCP, get_if_list, sniff
def get_if():
ifs=get_if_list()
iface=None
for i in get_if_list():
if "eth0" in i:
iface=i
break;
if not iface:
print("Cannot find eth0 interface")
exit(1)
return iface
cnt=0
def handle_pkt(pkt):
global cnt
cnt += 1
print("got a packet sum={}".format(cnt))
# pkt.show2()
# hexdump(pkt)
# print "len(pkt) = ", len(pkt)
sys.stdout.flush()
def main():
ifaces = [i for i in os.listdir('/sys/class/net/') if 'eth' in i]
iface = "s1-eth2"
print("sniffing on %s" % iface)
sys.stdout.flush()
sniff(iface = iface,
prn = lambda x: handle_pkt(x))
if __name__ == '__main__':
main()