2025-04-29
jmeter基础
00
请注意,本文编写于 235 天前,最后修改于 157 天前,其中某些信息可能已经过时。

目录

一、前言
1.为什么要伪装与欺骗
2.伪装和欺骗的适用场景
二、Windows系统的实现手段
1.准备工作
2.配置实施
3.使用Python脚本编译后的exe可执行文件用来为Windows系统批量的添加虚拟IP与删除虚拟IP。
addvirtualips.py
addvirtualips.spec
ipstoadd.txt
注意事项
三、MAC系统的实现手段
1.准备工作:
runaddvirtual_ips.sh
runremovevirtual_ips.sh
2.配置实施:

一、前言

1.为什么要伪装与欺骗

(1)由于现在绝大多数的服务器出于安全考虑会对同一IP地址做过滤,例如:Jira系统的报工接口会对短时间内发出大量请求的IP封禁一段时间。所以如果想要达到正常的压测效果,我们需要在发请求时伪造出不同的IP地址。
(2)我们在做压力测试时,有这样的场景和需求,希望模拟的批量用户来自不同的IP地址。

2.伪装和欺骗的适用场景

(1)内网压测:针对内网压测的情况,IP欺骗是找一些没有被使用过的ip地址,然后以这些IP地址发送请求过去,使得服务端接收到请求的IP地址都是你局域网内的IP,这样就达到了模拟其他IP的目的。
(2)外网压测:外网压测,针对服务端部署在外网上,使用局域网内的未使用的IP进行压测是无效的,因为公司中的每个运营商的整个网络出口都是一样的,每个运营商只有一个外网IP;或者是一个内网IP范围映射一个外网IP。

二、Windows系统的实现手段

1.准备工作

使用IP欺骗功能必须得本地有多个可用IP,通常普通的PC机只有一个物理网卡,这就需要我们手工设置多IP绑定同一网卡:
(1)开始菜单 -> 控制面板 -> 网络共享中心 -> 更改适配器设置 -> 本地链接
(2)右键本地链接 -> 属性,选择Internet 协议版本4(双击打开窗口),如果是采用自动获取IP,得通过手工设置IP
(3)在属性窗口中选择高级按钮,选择IP设置,点击添加,输入新的IP地址(须要注意在局域网内不要有IP冲突,可以事先ping一下找没有使用的IP,如图2-1-1),但子网掩码必须一致,如图2-1-2所示。

image.png

image.png

2.配置实施

(1)对上述准备工作中的IP进行参数化处理(包括本机的真实IP),本次添加的虚拟IP地址为77、80和81如图2-2-1所示

image.png
(2)在jmeter的测试计划中添加csv数据文件设置,配置IP参数,如图2-2-2所示

image.png (3)对所用进行IP欺骗的http请求进行调整,如图2-2-3

image.png (4)测试验证,添加BeanShell取样器内容如下:log.info("${ips}"),(不要存在空行)验证请求的IP如图2-2-4。

image.png

3.使用Python脚本编译后的exe可执行文件用来为Windows系统批量的添加虚拟IP与删除虚拟IP。

以下为Pyhton脚本以及编译后文件的压缩包。(本次使用的Python解释器版本为Python 3.9.10),关于压缩包中的各文件做以下说明。(不打包的话直接运行add_virtual_ips.py即可)

add_virtual_ips.py

python
import subprocess import os import logging # 设置日志记录配置 logging.basicConfig(filename='add_virtual_ips.log', level=logging.INFO, format='%(asctime)s %(levelname)s:%(message)s') def add_virtual_ip(interface, ip, mask='255.255.255.0'): """ 添加虚拟IP地址到指定接口。 参数: interface (str): 网络接口名称。 ip (str): 要添加的IP地址。 mask (str): 子网掩码,默认为 '255.255.255.0'。 """ command = f'netsh interface ip add address "{interface}" {ip} {mask}' logging.info(f'Executing command: {command}') # 添加日志记录,显示正在执行的命令 result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) logging.info(f'Command stdout: {result.stdout}') # 添加日志记录,显示标准输出 logging.info(f'Command stderr: {result.stderr}') # 添加日志记录,显示标准错误 if result.returncode == 0: logging.info(f'Successfully added IP {ip} to interface {interface}.') else: logging.error(f'Failed to add IP {ip} to interface {interface}. Error: {result.stderr}') def batch_add_virtual_ips(interface, ip_list, mask='255.255.255.0'): """ 批量添加虚拟IP地址到指定接口。 参数: interface (str): 网络接口名称。 ip_list (list of str): 要添加的IP地址列表。 mask (str): 子网掩码,默认为 '255.255.255.0'。 """ for ip in ip_list: add_virtual_ip(interface, ip, mask) def read_ips_from_file(file_path): """ 从文件中读取IP地址列表。 参数: file_path (str): 包含IP地址的文件路径。 返回: list of str: IP地址列表。 """ with open(file_path, 'r') as file: ip_list = [line.strip() for line in file if line.strip()] return ip_list if __name__ == "__main__": current_dir = os.path.dirname(os.path.abspath(__file__)) interface_name = "以太网" # 将接口名称修改为“以太网” ip_file_path = os.path.join(current_dir, "ips_to_add.txt") ip_addresses = read_ips_from_file(ip_file_path) batch_add_virtual_ips(interface_name, ip_addresses)

add_virtual_ips.spec

python
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( ['add_virtual_ips.py'], pathex=[], binaries=[], datas=[('ips_to_add.txt', '.')], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='add_virtual_ips', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, ) coll = COLLECT( exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='add_virtual_ips', )

ips_to_add.txt

python
192.168.55.88 192.168.55.80

注意事项

  1. 无论是运行 pyinstaller remove_virtual_ips.spec命令,还是运行 pyinstaller add_virtual_ips.spec命令均需要进入被编译文件所在的目录中
  2. 编译时一定要进入exe文件所要运行的windows电脑的pycharm终端编译
  3. ip_to_add.txt文件与ip_to_remove.txt文件中的ip一定不要与内网中实际ip产生冲突 打包后的目录结构如下

image.png

  1. Laboratory文件夹中\add_ips\dist\add_virtual_ips\add_virtual_ips.exe文件为添加虚拟IP的可执行文件,\remove_ips\dist\remove_virtual_ips\remove_virtual_ips.exe文件为清除虚拟IP的可执行文件,该文件的运行需要以管理员权限运行。
  2. Laboratory\add_ips\dist\add_virtual_ips_internal\ips_to_add.txt文件为添加虚拟IP的配置文件,在该文件中的IP为添加Windows电脑中的虚拟IP。
  3. Laboratory\remove_ips\dist\remove_virtual_ips_internal\ips_to_remove.txt文件为清除虚拟IP的配置文件,在该文件中的IP为要清除Windows电脑中的虚拟IP。
  4. Laboratory\add_ips\dist\add_virtual_ips\add_virtual_ips.log文件与Laboratory\remove_ips\dist\remove_virtual_ip\remove_virtual_ips.log文件为记录删除与添加虚拟IP是否成功的日志文件。也可使用cmd命令ipconfig进行验证

image.png

三、MAC系统的实现手段

1.准备工作:

Mac系统通过命令sudo ifconfig en0 alias 192.168.55.11 192.168.55.255 -->上述命令的意思是以管理员权限在en0网口添加虚拟IP与广播地址。
删除虚拟IP的命令为:sudo ifconfig en0 -alias 192.168.55.11 -->为实现批量的添加虚拟IP 在Windows系统中批量添加虚拟IP我们是通过exe程序实现,在Mac系统中我们可以通过sh脚本来实现,批量添加与删除虚拟IP的sh脚本所在的目录结构如下。

image.png

run_add_virtual_ips.sh

bash
#!/bin/bash # 从文件读取虚拟IP数组 IP_FILE="XXXXX/add_virtual_ips.txt" if [ ! -f "$IP_FILE" ]; then echo "IP file does not exist: $IP_FILE" exit 1 fi # 子网掩码和广播地址(根据你的网络配置进行调整) NETMASK="255.255.255.0" BROADCAST_BASE="192.168.55.255" # 读取文件中的虚拟IP VIRTUAL_IPS=($(cat "$IP_FILE")) # 网络接口名称 INTERFACE="en0" # 添加每个虚拟IP for IP in "${VIRTUAL_IPS[@]}"; do sudo ifconfig $INTERFACE alias $IP netmask $NETMASK broadcast $BROADCAST_BASE echo "Added virtual IP: $IP" done echo "All specified virtual IPs have been added."

run_remove_virtual_ips.sh

bash
#!/bin/bash # 从文件读取虚拟IP数组 IP_FILE="XXXXXX/remove_virtual_ips.txt" if [ ! -f "$IP_FILE" ]; then echo "IP file does not exist: $IP_FILE" exit 1 fi # 读取文件中的虚拟IP VIRTUAL_IPS=($(cat "$IP_FILE")) # 网络接口名称 INTERFACE="en0" # 删除每个虚拟IP for IP in "${VIRTUAL_IPS[@]}"; do if ifconfig $INTERFACE | grep -q "$IP"; then sudo ifconfig $INTERFACE -alias $IP echo "Removed virtual IP: $IP" else echo "IP not found: $IP" fi done echo "All specified virtual IPs have been processed."
  1. 其中值的注意的是添加虚拟IP的sh脚本中的广播地址一定要正确通过命令nano /run_add_virtual_ips.sh进入文件查看,如图3-1-1标红出为广播地址,可通过终端的ifconfig en0命令查看。
  2. add_virtual_ips.txt文件为run_add_virtual_ips.sh依赖的配置文件该文件中的IP地址为要添加Mac系统的虚拟IP(内网中未使用的IP地址),remove_virtual_ips.txt文件run_remove_virtual_ips.sh依赖的配置文件该文件中的IP地址为要从Mac系统中移除的IP地址。
  3. 进入sh脚本的目录中,执行脚本命令./run_add_virtual_ips.sh,执行移除虚拟IP的sh脚本同理运行,运行成功后如图3-2-1。

image.png
4. 验证虚拟IP是否添加成功的命令:ifconfig en0,出现如图3-3-1内容表示虚拟IP成功添加。

image.png

2.配置实施:

  1. 对上述压缩包中add_virtual_ips.txt文件中的IP进行参数化处理(包括本机的真实IP),本次添加的虚拟IP地址1如图3-2-1所示
  2. 在jmeter的测试计划中添加csv数据文件设置,本次示例是将add_virtual_ips.txt文件复制到jmx脚本目录中重命名为ips.txt配置IP参数,也可以使用绝对路径,如图3-2-2所示

image.png 3. 对所用进行IP欺骗的http请求进行调整,如图3-2-3

image.png 4. 测试验证,添加BeanShell取样器内容如下:log.info("${ips}"),(不要存在空行)验证请求的IP如图3-2-4。

image.png

本文作者:精卫

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!