(1)由于现在绝大多数的服务器出于安全考虑会对同一IP地址做过滤,例如:Jira系统的报工接口会对短时间内发出大量请求的IP封禁一段时间。所以如果想要达到正常的压测效果,我们需要在发请求时伪造出不同的IP地址。
(2)我们在做压力测试时,有这样的场景和需求,希望模拟的批量用户来自不同的IP地址。
(1)内网压测:针对内网压测的情况,IP欺骗是找一些没有被使用过的ip地址,然后以这些IP地址发送请求过去,使得服务端接收到请求的IP地址都是你局域网内的IP,这样就达到了模拟其他IP的目的。
(2)外网压测:外网压测,针对服务端部署在外网上,使用局域网内的未使用的IP进行压测是无效的,因为公司中的每个运营商的整个网络出口都是一样的,每个运营商只有一个外网IP;或者是一个内网IP范围映射一个外网IP。
使用IP欺骗功能必须得本地有多个可用IP,通常普通的PC机只有一个物理网卡,这就需要我们手工设置多IP绑定同一网卡:
(1)开始菜单 -> 控制面板 -> 网络共享中心 -> 更改适配器设置 -> 本地链接
(2)右键本地链接 -> 属性,选择Internet 协议版本4(双击打开窗口),如果是采用自动获取IP,得通过手工设置IP
(3)在属性窗口中选择高级按钮,选择IP设置,点击添加,输入新的IP地址(须要注意在局域网内不要有IP冲突,可以事先ping一下找没有使用的IP,如图2-1-1),但子网掩码必须一致,如图2-1-2所示。


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

(2)在jmeter的测试计划中添加csv数据文件设置,配置IP参数,如图2-2-2所示
(3)对所用进行IP欺骗的http请求进行调整,如图2-2-3
(4)测试验证,添加BeanShell取样器内容如下:log.info("${ips}"),(不要存在空行)验证请求的IP如图2-2-4。

以下为Pyhton脚本以及编译后文件的压缩包。(本次使用的Python解释器版本为Python 3.9.10),关于压缩包中的各文件做以下说明。(不打包的话直接运行add_virtual_ips.py即可)
pythonimport 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)
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',
)
python192.168.55.88
192.168.55.80

ipconfig进行验证
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脚本所在的目录结构如下。

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


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


3. 对所用进行IP欺骗的http请求进行调整,如图3-2-3
4. 测试验证,添加BeanShell取样器内容如下:log.info("${ips}"),(不要存在空行)验证请求的IP如图3-2-4。

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