IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> IPS性能测试实践一 -> 正文阅读

[系统运维]IPS性能测试实践一

Linux网络性能评估工具iperf、CHARIOT、tomahawk测试网络吞吐量

目前商用的据说ixia和spirent都还行,主要是太贵,开源的也就iperf和trex,trex功能丰富,什么吞吐、新建、并发、时延都能测,目前日常使用的还是iperf,尽管只能测吞吐,也没那么简单。

tomahawk是一款用于测试入侵防御系统(IPS)的工具,工作在OSI模型的第二层,只能测试网桥型网络设备。它通过分析截获的网络数据包文件(需要有一个完整的TCP连接,包括三次握手包和四次分手包),分辨出其中的Client和Server端,再通过指定的两个网卡发送出去,不同于TCPReplay的是,它对接收到的包进行分析,对于顺序发送的数据包只有前一个接收到,后一个才会发送,这样保证了对捕获数据包的真实回放。运行环境为Linux,用C编写。

网络性能评估主要是监测网络带宽的使用率。将网络带宽利用最大化是保证网络性能的基础、但是由于网络设计不合理、网络存在安全漏洞等原因,都会导致网络带宽利用率不高。要找到网络带宽利用率不高的原因.就需要对网络传输进行监控,此时就需要用到一些网络性能评估工具,而lperf就是这样一款网络带宽测试工具,本节将详细介绍一下lperf的使用。

1、lperf能做什么

lperf是一款基于TCP/IP和UDP/P的网络性能测试工具,它可以用来测量网络带宽和网络质量,还可以提供网络延迟抖动、数据包丢失率、最大传输单元等统计信息。网络管理员可以根据这些信息了解并判断网络性能问题。 从而定位网络瓶颈 解决网终故暗.

下面介绍lpert的主要功能。

(1)TCP方面q测试网络带宽。

支持多线程,在客户端与服务端支持多重连接。

报告MSS/MTU值的大小。

支持TCP窗口值自定义并可通过套接字缓冲。

(2)UDP方面

可以设置指定带宽的UDP数据流

可以测试网络抖动值、丢包数

支持多播测试

支持多线程,在客户端与服务端支持多重连接。

二、Iperf的安装与使用

iperf何以运行在任何IP网络上,包括本地以太网、接入因特网、Wi-Fi网络等。在工作模式上,iperf运行于服务器、客户端模式下其服务器端主要用于监听到达的测试请求,而客户端主要用于发起连接会话,因此要使用iperf,需要两台服务器,一台运行在服务器模式下,另一台运行在客户端模式下。

虚拟机配置需要能上网,虚拟机桥接到真实电脑物理网卡上网。

VMWare默认使用的是AMD PCnet Fast79C971百兆网卡,在这里我们提供一种方法,通过编辑虚拟机配置文件(.vmx),让VMWare虚拟机拥有Intel千兆网卡。

编辑虚拟机配置文件(.vmx),找到网卡选项,如:

ethernet0.present = "TRUE"

在其下面追加一项条目:

ethernet0.virtualDev = "e1000"
多块网卡以此类推,这样虚拟机就拥有可Intel芯片的千兆铜缆网卡-VMWare 82545EM Gigabit Ethernet Controller(Copper)。

1.安装iperf

1.官网
https://iperf.fr/iperf-download.php
2.windows 64位
https://iperf.fr/download/windows/iperf-3.1.3-win64.zip
3.ubuntu
sudo apt-get install iperf3
4.iperf源码
https://github.com/esnet/iperf
5.iperf下载链接
链接地址:https://iperf.fr/iperf-download.php#fedora

[root@ networkserver ~]# tar zxvf iperf-3.0.tar.gz

[root② networkserver ~]# cd iperf

[root@ networkserver iperf]#./configure

[root@ networkserver iperf]# make

[root@ networkserver iperf]# make install

这样,iperf就安装完成了。

2. iperf参数介绍

在完成inerf安装后。执行"iperf3 -h即可显示iperf的详细用法。iperf的命令行选项共分为一类。分别是客户端与服务器端公用选项、服务器端专用选项和客户端专用选项,下面对常用的选项进行介绍。

服务器端专用选项的含义。

命令行参数含义描述

-s?将iperf以server模式启动,例如∶ iperf3 -s,iperf3默认启动的监听端口为5201,可以通过"-p"选项修改默认监听端口

-D?将iperf作为后台守护进程运行,例如∶ iperf3 -s -D

客户端专用选项的含义。

命令行参含义描述

-c 以client模式启动 例如∶iperf3 -c 192.168.12.168,其中192.168.12.168是server端的IP地址

-u 指定使用UDP协议

-b 指定UDP模式使用的带宽,单位bits/sec。此选项与"-u"选项相关。默认值是1 Mbit/sec [K|M|G]

-t 指定传输数据包的总时间。iper将在指定的时间内,重复发送指定长度的数据包。默认是10秒钟

-n指定传输数据包的字节数,例如;iperf3 -c 192.168.12.168 -n 100M [K|M|G]

-l 指定读写缓冲区的长度。TCP方式默认大小为8KB.UDP方式默认大小为1470字节

-P 指定客户端与服务端之间使用的线程数。默认是1个线程。需要客户端与服务器端同时使用此参数

-R 切换数据发送接收模式,例如默认客户端发送.服务器端接收,设置此参数后,数据流向变为客户端接收、服务器端发送w指定套接字缓冲区大小,在TCP方式下,此设置为TCP窗口的大小。在UDP方式下,此设置为接受UDP数据包的缓冲区大小,用来限制可以接收数据包的最大值。

-B 用来绑定一个主机地址或接口,这个参数仅用于具有多个网络接口的主机。在UDP模式下,此参数用于绑定和加入一个多播组

-M 设置TCP最大信息段的值

-N 设置TCP无延时

客户端与服务器端公用选项的含义所示。

命令行参数 含义描述

指定带宽输出单位。"[k|mlgIK|MIG]分别表示以Kbits,Mbits,Gbits,KBytes,MBytes,GBytes显示输出结果,默认以Mbits为[klmlg|K|M|G]单位,例如∶ iperf3 -c 192.168.12.168 -f M

-p 指定服务器端使用的端口或客户端所连接的端口。

例如∶iperf3 -s -p 9527;

iperf3 -c 192.168.12.168 -p 9527

-i 指定每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为1。

例如∶iperf3 -c 192.168.12.168 -i 2

-F 指定文件作为数据流进行带宽测试。

例如∶ iperf3-c 192.168.12.168 -F web-ixdba.tar.gz

案例:

在服务端

iperf3 -s -p 9001                    ##由于公司端口限制,这里指定端接口为9001

执行以上命令后,服务端就可以和客户端建立连接

2)在客户端

iperf3 -c ip -b 2300M -n 5G -p 9001               
##-c        表示指定服务器ip
##-b        表示指定带宽
##-n        表示文件大小
##-p        表示端口
如上代码段,这样即可与指定ip建立连接

结果分析

从上图可以看出
测试的时间间隔为18.71s,下载的文件大小为5G,测试出的带宽为2.30G/s。
更多的参数可以使用以下指令查看

iperf3 –h
常用参数
-s:服务器
-c:用户端+服务端的ip
-p:端口号
-i:时间间隔
-t:测试次数

lperf应用实例

iperf测吞吐有两种方法,一种是tcp的,另一种是udp的。?

要使用iperf首先要启用一个服务端,这里假定服务端的IP地址为192.168.12.168.在此服务器上运行"iperf3 -s"即可开启iperf的服务器模式。在默认情况下,iperf3将在服务端打开一个5201监听端口,此时就可以将另一台服务器作为客户端执行iperf功能测试了。

1.测试TCP吞吐量

为了确定网卡的最大吞吐量。可以在任意客户端运行iperf命令,iperf附尝试从客户端尽可能快地向服务端发送数据请求,并且会输出发送的数据量和网卡平均带宽值。图1是一个最简单的带宽测试命令。

tcp的可以这样,服务端,iperf -s,客户端,iperf -c x.x.x.x -t 60 -i 10,

客户端的效果是:

图1通过iperf测试网络带宽利用率

从图1可以看出,iperf默认的运行时间是10秒钟,每隔一秒钟输出一次传输状态.同时还可以看到每秒钟传输的数据量在112MB左右,刚好与"Bandwidth"列的值对应起来,网卡的带宽速率维持在941Mbits/sec左右,而测试的服务器是千兆网卡,这个测试值也基本合理。在输出的最后,iperf还给出了总的数据发送、接收量,并给出了带宽速率平均值,通过这些值,基本可以判断网络带宽是否正常,网络传输状态是否稳定。

iperf提供很多参数,可以多角度、全方位地测试网络带宽利用率、例如,要改变iperf运行的时间和输出频率、可以通过"T和"-i参数来实现如图2所示。

图2 添加"-t"和"-i"参数后的iperf输出

从图2 可以看出。输出状态的间隔变为每5秒钟一次。总共执行测试时间为20秒。测试的带宽速率仍然保持在941Mbits/sec左右。唯一变化的是失败重传次数增加了。

为了模拟大量的数据传输,也可以指定要发送的数据量,这可以通过"-n"参数来实现。在指定"-n"参数后,"t参数失效,iperf在传输完毕指定大小的数据包后、自动结束,如图3所示。

图3 iperf客户端通过"-n"参数指定要传输的数据量

图3的例子是指定发送一个5GB左右的数据包,并且每隔10秒钟输出一次传输状态,从这个输出可以看出,当失败重传次数较多时,传输速率急速下降。

有时候,为了模拟更真实的TCP应用,iperf客户端允许从一个特定的文件发送数据,这可以通过"-F"参数实现,如图4所示。图4 iperf客户端通过"-F"参数指定文件来发送数据

在图4的例子中,通过"-F"参数指定了一个webdata.tar.gz文件作为iperf要传输的数据,在使用此参数时,需要同时指定一个"-t"参数来设置要测试传输的时间,这个时间尽量设置长一些,因为在默认传输时间10秒内,这个文件可能还没有传完。

在使用iperf进行网络带宽测试时如果没有指定发送方式,iper客户端只会使用一个单一的线程,而perf是支持多线程的,可以使用iperf提供的"-P"参数来设置多线程的数目,通过使用多线程,可以在一定程度上增加网络的吞吐量。

下面通过两个例子进行简单对比,图5是iperf使用单线程传输1.86GBytes数据所消耗的时间和带宽使用情况。为了速率单位统一,这里使用"-f"参数将输出结果都通过MBytes来显示。

图5 iperf在单线程模式下的传输时间和传输速率

从图5中可以看出,传输1.86GBytes的数据消耗了17秒的时间.平均带宽速率为112MByes/sec(注意单位)下面再看看使用多线程后,iper传输同样大小数据量所消耗的时间和平均带宽速率、如图6所示。

图6 iperf使用多线程后的数据传输状态

这里通过"-P"参数开启了2个多线程,从传输时间上看,传输1.86GBytes的数据,消耗时间为10.79秒,比之前单线程的传输时间少了近7秒钟,在平均带宽速率上,从之前单线程的112MBytes/sec提高到177MBytes/sec,从这个结果可以看出,多线程对网络传输性能的提高不小。

2.测试UDP丢包和延迟

iperf也可以用于UDP数据包吞吐量、丢包率和延迟指标.但是由干UDP协议是一个非面向连接的轻量级传输协议并目不提供可靠的数据传输服务,因此对UDP应用的关注点不是传输数据有多快,而是它的丢包率和延时指标。通过iperf的"-u"参数即可测试UDP应用的传输性能。

udp的可以这样,服务端,iperf -s -u,客户端,iperf -c x.x.x.x -u -t 60 -i 10 -b 10000M,

图7测试的是在iperf客户端传输10000MB的UDP数据包的输出结果∶

?图7 iperf传输100MB的UDP数据包的输出结果

在图7中,重点关注虚线下的一段内容,在这段输出中,"Jitter列表示抖动时间,或者称为传输延迟,"Lost/Total"列表示丢失的数据报和总的数据报数量,后面的0.33%是平均丢包的比率,"Datagrams"列显示的是总共传输数据报的数量。

这个输出结果过于简单,要了解更详细的UDP丢包和延时信息,可以在iperf服务端查看,因为在客户端执行传输测试的同时,服务端也会同时显示传输状态,如图8所示。

图8 iper服务端显示的UDP传输状态

在这个输出中,详细记录了在传输过程中,每个阶段的传输延时和丢包率,在UDP应用中随着传输数据的增大,丢包率和延时也随之增加。对于延时和丢包可以通过改变应用程序来缓解或修复,例如视频流应用,可以通过缓存数据的方式而可以容忍更大的延时。

为啥两者测出来的吞吐性能不一样呢,咱们来抓包看看。

用tcp测试时,服务端收到的很多都是3万多字节的超大包,而用udp测试时,服务端收到的所有都是1512字节的包。

如果你在硬件防火墙时代根据rfc2544测过性能,应该知道吞吐量一般采用udp进行测试,这样看来,在虚拟化环境内,用upd测试也是靠谱的,能把pps的准确性能测试出来,这样在不同包长下的吞吐直接算就可以了。

那么上面测试的ESXi的pps是否就是udp 800M时的数呢,非也,经过验证,需要开17个这样的打流窗口,才能把这台ESXi单VSS的pps性能测出来,结果是,800M * 17 / 1512 / 8 = 1.12M pps。

利用IXCHARIOT进行网络测速

Chariot由两部分组成∶控制端Console和远端Endpoint.两者都可安装在普通PC或者服务器上,控制端安装在Windows操作系统上,Endpoint支持各种主流的操作系统。

控制端为该广品的核心部分,控制界面(也可采用命令行方式)、测试设计界面、脚本选择及编制、结果显示、报告生成以及AP接口等都由控制端提供。Endpoint可根据实际测试的需要安装在单个或者多个终端处。负责从控制端接收指令、完成测试并将测试数据上报到控制睾。

Chario通过内置的脚本,由控制端控制远端相互主动发包,对设备进行功能、压力和性能等测试,测试结果包括吞吐量、时延、抖动、丢包、错包等等,它能够得到定量的数据并提供详尽的测试报告,从而使得用户可以主动地把握设备的性能状况,并及时地发现问题并采取措施。

Chario通过各种机制可以仿真任意的应用。首先,通过内置的脚本,Chariot发送不同的数据流.可以模拟现在常见的125种应用.而目这种数据流是双向的,真正与协议栈进行交互。Chariot对各种应用的支持是基于在Endpoint之间发送的多种数据流,数据流的传送可基于多种协议,包括TCP、UDP、RTP、SPX、IPX和SNA.目前也已经支持IPy6。Chariot还支持Multicast、OoS等多种先进技术.而目将一直保持同步。另外,在出现新的或者特殊的应用的时候,通过工具套件Application Scanner能够生成可以供Chariot使用的脚本。Chariot允许对脚本进行定制,改变数据流的各种参数.比如起始的启动间隔、发送窗口、接受窗口的大小.发送文件的大小.发送的速率、发送的比特流类型、使用端口等等。而目这些参数不但可以是一个由用户指定的典型数值.而目还能选用在最大、最小值之间符合平均分布、正态分布、泊松分布或者指数分布的随机值、从而真正地仿真网络中各种特定的数据流。全面地测试网络或者网络设备在复杂的网络环境下的性能。现代网络的一个特点是呈分布式发展,在对网络性能测试的过程中,可能要涉及到很多的节点。采用Chariot软件,则可以直接在中央控制端轻点几.下鼠标就完成对全网的测试。Chariot的远端可以直接在NetIO公司网站上下载或者通过中央控制端远程安装到所需要的节点机器上去,Chariot最多可支持10000个远端的协同测试,而远端软件则可任意按照需要安装,在测试的时候即可被唤醒。

由于Chariot在无线产品性能测试领域也已成为事实上的业界标准,WECA采用该产品作为给厂家发放W-Fi标志的工具。对于制造商,Chariot可应用于实验室测试、设备性能展示、网络现场性能测试及故障定位等方面,比如信息产业部通信计量公司就采用Chariot产品对其无线产品的应用层性能进行测试。

作为应用层性能测试的标准工具,Chariot由于其网络环境方面的特点,能够为运营商提供多种其它工具不可替代的服务,具体有以下几个方面的应用∶设备选型、基准性能测试、压力测试、功能测试、网络调整、网络性能展示、确定SLA以及性能瓶颈定位及排除等。在网络出现故障时,使用Chariot进行故障定位,判断是网络的问题还是服务器的问题,如果是网络的问题,再利用该工具进行定位。此外,它还用于与客户进行SLA的协商和测试标准制定。

网络测试工具tomahawk

下载和英文介绍文章可以从以下两个站点获得:
1.http://www.tomahawktesttool.org/?--介绍的比较详细,以前还有一些典型的测试工具
2.Tomahawk Test Tool?--sf主站

第一次接触tomahawk缘于一次IPS产品测试,以前的对此类产品的测试方法是通过扫描,即在产品未接入的情况下,使用扫描器(如X-Scan)对计算机进行一次扫描记录结果,再将产品以串联方式接入重新扫描,通过比较两次的扫描结果和察看产品的相应报警日志以判断产品是否具备阻断攻击的功能。这种方法通过人工完成,只能定性的判断IPS的阻断功能具备与否,更无法产生大流量的网络数据。
安装环境为Linux redhat 9.0,其介绍上说需要三块网卡,其中两块为千兆,可以产生300M左右的流量,另外一块用于远程管理使用,其实两块也是可以的,软件方面gcc不用说了,还需要 libnet-1.0.2a.tar.gz、libpcap-0.8.1.tar.gz两个库,
1.将tomahawk1.0.tar.gz、libnet-1.0.2a.tar.gz、libpcap-0.8.1.tar.gz三个文件拷入同一文件夹中,使用tar xzvf *分别解压
2.进入Libnet?目录

chmod 777 configure
./configure
make

3.进入libpcap目录

chmod  777  configure
./configure
make

4.进入??? tomahawk

make
make install --该命令将tomahawk拷入/usr/local/bin,以便以后在任何目录下都可以运行。

如果tomahawk的make不成功,需察看Makefile文件中Libnet 和libpcap的路径设置是否正确,如下:

PCAPDIR         =  .. / libpcap
PCAPINCS     =   - I$(PCAPDIR)
PCAPLIBS     =  $(PCAPDIR) / libpcap.a
PCAPDEP         =  $(PCAPDIR) / pcap.h $(PCAPDIR) / libpcap.a

LNETDIR         =  .. / Libnet
LNETINCS     =   - I$(LNETDIR) / include
LNETLIBS     =  $(LNETDIR) / lib / libnet.a
LNETDEP         =  $(LNETDIR) / include / libnet.h $(LNETDIR) / libnet.a

?在tomahawk目录下运行

 tomahawk  - l  1   - f test.pcap 

如果结果为

Beginning test

Completed  1  loop of trace test.pcap (hid:  1 )

Finished  1  loops of trace test.pcap Completed:  1 , Timed  out :  0
Retrans:  0
Sent:  9
Recv:  9

则安装成功! ?

下面介绍几个常用的参数
-N 5 ? ? 并发5个
-i eth0 从eth0发client
-j eth1 从eth1发server
-l 5 ? ? ?重复5次
-f ?file ?pcap包文件
-A 0 不改变PCAP包中的IP地址
-A 1 改变PCAP包中的IP地址
-R 1-1000 限制为1M-1000M的流量, 0.1表示100k
-a 10.0.0.1 以10.0.0.1 攻击,此时不用使用 -A 1参数了

在实际使用中,往往使用到多个攻击包文件,仅仅通过查看sent和recv无法判断到底哪个攻击被阻断,在tomahawk提供的样本攻击包中还有一个attack脚本

 # !/ bin / bash
 if  [ $#  ==   1  ]; then
  loops = $ 1
 else
  loops = 1
fi

 #export PATH = $PATH:.. / bin
cd  / home / tomahawk / tomahawk / pcap
echo  " running 16 attacks $loops times (each attack) "
tomahawk  - i eth0  - j eth1  - m  200   - r  10   - t  100   - n  2   - a  202 .202.202.202  - l $loops 
         - f pcap.backdoor_novargA_infection 
         - f pcap.ftp_realpath_buffer_overflow_exploit 
         - f pcap.H225_source_address_dialedDigits_length_anomaly 
         - f pcap.http_apache_openSSL_slapper_worm 
         - f pcap.http_code_red_II_worm 
         - f pcap.http_IIS_printer_buffer_overflow 
         - f pcap.http_nimda_attack_cmd_exe 
         - f pcap.http_yahoo_audio_conferencing_activeX_control_buffer_anomaly 
         - f pcap.kazaa_file_download_upload 
         - f pcap.ms_rpc_DCOM_ISystemActivator_overflow 
         - f pcap.ms_sql_slammer_sapphire_worm 
         - f pcap.mySQL_authentication_bypass 
         - f pcap.smb_bugearB_worm_network_propagation 
         - f pcap.smb_SMBdie_exploit 
         - f pcap.smtp_bugbear_worm_email_propagation 
         - f pcap.telnet_SGI_buffer_overflow_exploit  |  grep  ' ^Finish '   |  
        sed  - e  ' s/^F.*trace *// '   - e  ' s/,// '   - e  ' s/Completed/Permitted/g '  
             - e  ' s/Timed *out/Blocked/g '   |  column  - t

运行attack

pcap.ms_sql_slammer_sapphire_worm                                  Permitted:   1   Blocked:   0
pcap.http_nimda_attack_cmd_exe                                     Permitted:   1   Blocked:   0
pcap.http_yahoo_audio_conferencing_activeX_control_buffer_anomaly  Permitted:   1   Blocked:   0
pcap.ms_rpc_DCOM_ISystemActivator_overflow                         Permitted:   1   Blocked:   0
pcap.H225_source_address_dialedDigits_length_anomaly               Permitted:   1   Blocked:   0
pcap.http_IIS_printer_buffer_overflow                              Permitted:   1   Blocked:   0
pcap.mySQL_authentication_bypass                                   Permitted:   1   Blocked:   0
pcap.http_code_red_II_worm                                         Permitted:   1   Blocked:   0
pcap.smb_SMBdie_exploit                                            Permitted:   1   Blocked:   0
pcap.telnet_SGI_buffer_overflow_exploit                            Permitted:   1   Blocked:   0
pcap.backdoor_novargA_infection                                    Permitted:   1   Blocked:   0
pcap.ftp_realpath_buffer_overflow_exploit                          Permitted:   1   Blocked:   0
pcap.smtp_bugbear_worm_email_propagation                           Permitted:   1   Blocked:   0
pcap.kazaa_file_download_upload                                    Permitted:   1   Blocked:   0
pcap.smb_bugearB_worm_network_propagation                          Permitted:   1   Blocked:   0
pcap.http_apache_openSSL_slapper_worm                              Permitted:   1   Blocked:   0

从上面可以清楚地看到被阻断的攻击(Blocked)
如本文一开始所提到的,tomahawk是一款二层设备测试工具,在平时的检测工作中经常会遇到三层的IPS,如现在的防火墙或多或少都带了一点IPS的功能以保护DMZ区的服务器不被攻击。

仅仅涉及为了将其修改为可以测试三层设备的部分

代码文件清单:

Tomahawk1.1包括以下文件

alloc.c 
alloc.h
eventloop.c
eventloop.h 
packetutil.c 
packetutil.h    //定义了两个重要的结构:trace和handle及其相关操作
test.pcap        //一个用于测试的数据包文件(不是攻击)
tomahawk.c  //主要发包收包程序

具体代码

要看懂tomahawk,一定要理解其中两个重要的结构:trace和handle

? ? ? ? trace:

包括多个包文件的内容,是一个链表结构,包括发送次数等信息,也就是一次命令可以定义的一个发送过程。该结构由函数LoadTrace装载,但LoadTrace中(前段)并未初始化数据报(trace->pkt = NULL;),只是记录了文件名;包文件内容由LoadPacket导入到trace->pkt中,LoadPacket函数判断源和目的IP地址,并且修改MAC(在此可加入网关mac功能)

? ? ? ?注:LoadPacket在1.1版中作了CanRewrite检查,即只处理TCP/UDP/ICMP数据包

? ? ? ? handle:

由createHandle创建,是一个链表结构,完成一次发送过程(一个数据包一次发送为一个handle)。其中主要函数:

? ? ? ?CreatePacketSendGroup 查找包文件中独立的包(不依赖接收到的包就可以发送的那些,放入group中) ? ? ? ??

? ? ? ?SendPackets 其中修改了源和目的IP地址将包发送出去,此函数还被RecvPacket,RetrySendPackets,ResendPackets调用;

? ? ? ?RecvPacket中会根据收到数据报的handleID判断是否为发出的包。

? ? ? ? 如何判断收到的包

关键判断函数GetHandler,如果返回值不为null则numRecv++

? ? ? ?GetHandler(const u_char *packetData, int len, int modAddrs, unsigned char startId, unsigned char endId)

? ? ? ?如果modAddrs则ip的第二位为handleID(如192.22.1.1中22即为handle ID),如果handleID不在startId和endId之间也返回null.

? ? ? ?如果没有modAddrs则返回startId的handle.

? ? ? ?有一个activehandle[]数组记录了所有激活的handle

代码修改

3.1?参数修改

添加了几个参数

-g GW1's MAC    Interface1 gateway MAC Address @New!@

 -G GW2's MAC    Interface2 gateway MAC Address @New!@

 -k GW1's IP     Interface1 gateway IP Address @New!@

 -K GW2's IP     Interface2 gateway IP Address @New!@

 -S StudyMode    Mode for gateway to study ARP @New! @

这几个参数分别指定了网关1、2的IP和MAC地址,-S参数是为了让网关学习到模拟出的IP地址的MAC地址,一般在测试时先运行一次:

tomahawk –S –k a.b.c.d –K e.f.g.h –g x:x:x:x:x:x –G x:x:x:x:x:x –l 251 –f test.pcap

这样受测设备将会学习到所有a.1.*.*~a.251.*.*和e.1.*.*~e.251.*.*的mac地址,也就是安装了tomahawk的机器的两个网卡的mac地址。

3.2代码修改

修改loadpacket中关于mac地址的内容为:

if (pkt->iface)  {
        if (useGate) {
            //fprintf(stderr, "[info] mac1  ");
            ph->ether_shost[0] = if1.eaddr[0];
            ph->ether_shost[1] = if1.eaddr[1];
            ph->ether_shost[2] = if1.eaddr[2];
            ph->ether_shost[3] = if1.eaddr[3];
            ph->ether_shost[4] = if1.eaddr[4];
            ph->ether_shost[5] = if1.eaddr[5];
            ph->ether_dhost[0] = mac1[0];
            ph->ether_dhost[1] = mac1[1];
            ph->ether_dhost[2] = mac1[2];
            ph->ether_dhost[3] = mac1[3];
            ph->ether_dhost[4] = mac1[4];
            ph->ether_dhost[5] = mac1[5];
        }else{
            ph->ether_shost[0] = if1.eaddr[0];
            ph->ether_shost[1] = if1.eaddr[1];
            ph->ether_shost[2] = if1.eaddr[2];
            ph->ether_shost[3] = if1.eaddr[3];
            ph->ether_shost[4] = if1.eaddr[4];
            ph->ether_shost[5] = if1.eaddr[5];
            ph->ether_dhost[0] = if2.eaddr[0];
            ph->ether_dhost[1] = if2.eaddr[1];
            ph->ether_dhost[2] = if2.eaddr[2];
            ph->ether_dhost[3] = if2.eaddr[3];
            ph->ether_dhost[4] = if2.eaddr[4];
            ph->ether_dhost[5] = if2.eaddr[5];            
        }        
    }  else  {
        if (useGate){    
            //fprintf(stderr, "[info] mac2  ");
            ph->ether_dhost[0] = mac2[0];
            ph->ether_dhost[1] = mac2[1];
            ph->ether_dhost[2] = mac2[2];
            ph->ether_dhost[3] = mac2[3];
            ph->ether_dhost[4] = mac2[4];
            ph->ether_dhost[5] = mac2[5];
            ph->ether_shost[0] = if2.eaddr[0];
            ph->ether_shost[1] = if2.eaddr[1];
            ph->ether_shost[2] = if2.eaddr[2];
            ph->ether_shost[3] = if2.eaddr[3];
            ph->ether_shost[4] = if2.eaddr[4];
            ph->ether_shost[5] = if2.eaddr[5];;
        }else {
            ph->ether_dhost[0] = if1.eaddr[0];
            ph->ether_dhost[1] = if1.eaddr[1];
            ph->ether_dhost[2] = if1.eaddr[2];
            ph->ether_dhost[3] = if1.eaddr[3];
            ph->ether_dhost[4] = if1.eaddr[4];
            ph->ether_dhost[5] = if1.eaddr[5];
            ph->ether_shost[0] = if2.eaddr[0];
            ph->ether_shost[1] = if2.eaddr[1];
            ph->ether_shost[2] = if2.eaddr[2];
            ph->ether_shost[3] = if2.eaddr[3];
            ph->ether_shost[4] = if2.eaddr[4];
            ph->ether_shost[5] = if2.eaddr[5];
        }
}

修改ReadPacket函数,使其在-S模式下可以发送arp学习包

 if (ARPStudyMode) {
        if (memcmp(x1,arp,6)){
        }else{
            memcpy (&arp_r, buffer, 42);
            //ip4p.s_addr    = arp_r.arp_tpa;    
            //fprintf(stderr, "[info] find arp %s", inet_ntoa(ip4p)); 
            //fprintf(stderr, "[info] find arp %s", arp_r.arp_tpa); 
            //fprintf(stderr, "[info] IP %x:%x:%x:%x  ", arp_r.arp_tpa[0],arp_r.arp_tpa[1],arp_r.arp_tpa[2],arp_r.arp_tpa[3]); 
            //for (k=0; k<42; k++){            
            //    fprintf(stderr, "%x:", arp_r.eh_dst[k]);     
            //}            
            if ((( arp_r.arp_tha[6]  & 0xFF) == firstByte1) && (!strncmp(interface->device, interface1, 4))){
            for (k=0; k<4; k++){
                arp_s1.arp_spa[k]=arp_r.arp_tpa[k];
            }
                memset(sendbuf, 0, sizeof(sendbuf));
                memcpy(sendbuf, &arp_s1, 42);
                //fprintf(stderr, "on interface 1 ");             
            }
            if ((( arp_r.arp_tha[6]  & 0xFF) == firstByte2) && (!strncmp(interface->device, interface2, 4))){
            for (k=0;k<4;k++){
                arp_s2.arp_spa[k]=arp_r.arp_tpa[k];
            }
                memset(sendbuf, 0, sizeof(sendbuf));
                memcpy(sendbuf, &arp_s2, 42);
                //fprintf(stderr, "on interface 2 ");             
            }                            
            sendto(interface->fd, sendbuf, 42, 0, (struct sockaddr *)NULL, 0);
            //WriteInterface(interface, sendbuf, 42);    
        }
    }

修改Sendpackets函数,使其在发送数据包时将IP改为同网关IP的第一位相对应

if (t->modAddrs)  {
        if (useGate){
            if (p[pktId].iface == IFACE_I){
                iph.saddr = GetWireIP(h->id, p[pktId].wireSrc, p[pktId].saddr, firstByte1);
                iph.daddr = GetWireIP(h->id, p[pktId].wireDst, p[pktId].daddr, firstByte2);
            }else{
                iph.saddr = GetWireIP(h->id, p[pktId].wireSrc, p[pktId].saddr, firstByte2);
                iph.daddr = GetWireIP(h->id, p[pktId].wireDst, p[pktId].daddr, firstByte1);
            }
        }else{
            iph.saddr = GetWireIP(h->id, p[pktId].wireSrc, p[pktId].saddr, firstByte);
            iph.daddr = GetWireIP(h->id, p[pktId].wireDst, p[pktId].daddr, firstByte);
        }

至此,修改完毕。

在下图所示的测试环境中:

tomahawk?-S?-g?00:13:72:77:EA:FC?-G?00:05:5D:29:0F:91?-k?3.0.0.254?-K?4.0.0.254?-l?251?-f?test.pcap

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:26:09  更:2022-06-25 18:30:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 18:35:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码