いつも負荷試験等でお世話になっているhping3についての記事です。
※攻撃ツールとして利用することは厳禁であり、必ず管理下にあるノードに対してのみ実行しましょう。
hping3は非常に強力なツールで、TCP/IPパケットの生成、送信などができネットワークの診断やセキュリティテストなど幅広く利用されていると思います。ただ負荷試験については場合によってですが、そのままの利用ができないパターンもあります。
その一つとして、hping3には時刻データを含むパケットを送信する機能がありません。そのため、時系列データを伴う負荷試験にhping3を利用するのは難しくなります。
※もちろん、JMeterとかGatlingを使うという方法もありますが、時系列データのテストにDummyデータ送りたいだけの場合とか、わざわざ新しいツール覚えるより手っ取り早くhping3のみで負荷試験して時間短縮したいですよね?
そこで、今回はあるデータを大量に送信しつつも、送信タイミングの日時をデータ内のタイムスタンプフィールドに設定するという事をやってみました。(※コンマ何秒という世界までは考慮できていませんがそれでもある程度、時系列データのDummyデータとして役に立ってくれそうです。)
前提
OS:CentOS7.9(3.10.0-1160.108.1.el7.x86_64)
hping3: hping version 3.0.0-alpha-1 ($Id: release.h,v 1.4 2004/04/09 23:38:56 antirez Exp $)
python3: Python 3.10.2
1. ログファイルの準備
送りたいログを準備します。送りたいデータには以下のような日時データを含む想定としています。
2024/06/22 13:00:00
2. ツールの準備
まずは日付を変更するためのスクリプトを準備します(これはpythonで作成しました。)
#update.py
import sys
import re
import time
from datetime import datetime
# ログファイルのパス
LogPath = f"/opt/DummyTools/data/" + sys.argv[1]
# 現在のタイムスタンプとフォーマットされた日時を取得
CurrentDatetime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# ログ読込み
with open(LogPath, 'r') as file:
LogData = file.read()
# 日時置換え
LogData = re.sub(r'\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}', CurrentDatetime, LogData)
# 更新されたログファイル書込み
with open(LogPath, 'w') as file:
file.write(LogData)
続いて、データ送信するためのShellScriptを作成します。
このShellScriptは先ほどのpythonスクリプト(update.py)に準備したデータを渡しつつ、2000パケットを準備するために0.1ミリ秒(u100)を指定し、さらに送信元IPを偽装してデータ送信させるためのスクリプトになります。※このu100などはそれぞれのシステムで調整が必要かもしれません。
# SendUdpPackets.sh
#!/bin/bash
TARGET_IP="xx.xx.xx.xx" #データ送信先サーバのIP
TARGET_PORT=xxxx #データ送信先サーバの待ち受けPort
LOG_FILE="/opt/DummyTools/data/$1" #送りたいデータが格納されているデータ
COUNT=10000000 #送りたいデータ個数
INTERVAL=0.5
for ((i=0; i<COUNT; i++))
do
python3 /opt/DummyTools/data/update.py $1
hping3 --udp -p $TARGET_PORT -d $2 -E $LOG_FILE -i u100 -c 2000 -a $3 $TARGET_IP
sleep $INTERVAL
done
3. ツール実行
実行には引き数を3つ渡します。
引き数1: 送信したいデータファイル名
引き数2: 送信したいデータファイルのサイズ(Byte) #ls -lなどでサイズ調べておく。
引き数3: 送信元IPアドレス
では実行してみます。
# 実行例
cd /opt/DummyTools/data/ #ファイル保存場所、実行パスなどは適宜変更してください。
SendUdpPackets.sh test.txt 620 xx.xx.xx.xx
Sending packet with updated log file content
HPING xx.xx.xx.xx (ens192 xx.xx.xx.xx): udp mode set, 28 headers + 620 data bytes
[main] memlockall(): Success
Warning: can't disable memory paging!'
--- 10.2.0.31 hping statistic ---
2000 packets transmitted, 0 packets received, 100% packet loss
round-trip min/avg/max = 0.0/0.0/0.0 ms
Sending packet with updated log file content
HPING xx.xx.xx.xx (ens192 xx.xx.xx.xx): udp mode set, 28 headers + 620 data bytes
[main] memlockall(): Success
Warning: can't disable memory paging!
※以下繰り返し。
これで秒間2000パケットのデータ(日時変更済み)が宛先に飛びます。
Portを変更したり、宛先を変更・日次の正規表現をログ仕様に合わせることで色々なログフォーマットにも対応できると思いますし、この大量のdummyにひっそりと意味のあるデータを手動で混ぜ込ませて検知できるか?っと言った用途にも利用できると思います。
同じく負荷試験などでお困りの方のお役に立てれば幸いです。