へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)! #vZkt8fc6J

Jmeterを使ったDDoS的な負荷試験のやりかた

jmeter-serverを使って、jmeterクライアントから「これで動かして〜〜」という旨を、いろんなクライアントに送り、最終的にDDoS的な攻撃ができる。

注意

jmeter4.0だとリモートで動かなったりする。RMIのNotSerializableExceptionとかが出る(´・ω・`) なぜかは不明。

3.3をインストールするとあっけなく使えるので3.3推奨。

jmeterそのものの使い方は知っている前提で書くので、普通のjmeterの使い方の範疇に入るような、自明なことは特に説明しない。

また、通読にはインフラエンジニアの初歩的な知識を要求する。

概要

コンピュータをたくさん使う。

構成は、Master/Slave構成というか、1クライアント+複数サーバという構成

Jmeterクライアントから、複数のJmeterサーバに「こういう感じで試験やってよ」という指令を送り、Jmeterサーバは、ターゲット犠牲者に対してリクエストを送る

Jmeterサーバ、Jmeterクライアントでそれぞれ設定が必要。けっこうセンシティブなので、雑なコンフィグだとすぐにエラーをはいてくれる。

サーバとクライアントが一体化しているので、jmeterをインストールしたらサーバ機能もクライアント機能も入っている。

クライアントとサーバの通信はRMIとかいうJavaのリモートプロシージャコール(RPC)的なのを使う。そのためのポートは自由に指定できる。ちなみにぼくはRPCをよくわかってない。誰か教えてください。

この人の説明がわかりやすい(英語) ↓

https://www.artofsoftwaredevelopment.com/performance/performance-testing-in-the-cloud-with-jmeter-aws

↑の記事と、この記事で疑問点はほぼ解消されると思う(たぶん)

やることの順番

・インスタンスを複数用意(クライアント用1つとサーバ用複数)
・それぞれに同じバージョンのjmeterをインストール。Javaも同じ必要がある(らしい。別に違ってもいけるときとかあるし)
・jmeterサーバの設定をする(全サーバ同じでいい)
・jmeterクライアントの設定をする
・jmeterサーバの起動
・jmeterクライアントから負荷試験の指令を送る

いきなり100台たてて全部設定とかしてるとサーバ費用で死ねるので、まずはローカルで試して、おkそうならサーバを2台立てて試し、その後3台にして、そのあとで100台でやるとかの方がいいと思われる。

jmeterのインストール

ここから3.3をもってくる。4.0はカッコいいけど動かない。普通に動かす分にはよさげ。インストールは、zipとかtgzを展開するだけ。

https://archive.apache.org/dist/jmeter/binaries/

インスタンスjavajmeterをインストール

java8とかjava9がいいらしいぞ

↓ Ubuntu16.4だとこんなん

How to Install Oracle Java 8 / 9 in Ubuntu 16.04, Linux Mint 18

設定

ここにする。サーバ側の設定もクライアント側の設定もここでするので、間違えないようにする。

$ vim apache-jmeter-3.3/bin/jmeter.properties

サーバ側の設定

ポート番号に大した理由はない。自由に設定していいけど、この番号で設定していることを前提に話を進めるので変えたい人はそこに注意。デフォルトは1099だけど使いたくない。

server_port=24001
server.rmi.localport=26001

クライアント側で結果を受け取るための設定をする

設定しないとデータを受け取るためのポート番号がランダムに変わる(なんだその仕様・・・)

こちらもポート番号に大した理由はない。自由に設定し(ry

client.rmi.localport=25000

ポートについて

AWSでやる場合は、これらのポートをもとにしたセキュリティグループをつけたりして、上記のポート番号を許可しないと途中でとまる(あたりまえ)

本当はセキュリティグループは22番だけにして、SSHトンネリングをしたほうがセキュアなのでいい(めんどくさいけど)

SSHトンネリングはするとhostnameで判定するため、127.0.0.1とか10.0.255.238とかlocalhostとかいろいろややこしくてめんどくさくなる。特に複数あるとSSHトンネリングだけでしんどい。

ぶっちゃけ一瞬ポート開けたぐらい大丈夫だし、しかも仮に乗っ取られてもすぐインスタンス停止するから大丈夫だろとか思ったりとかもしない。

でもセキュアにしたい場合はSSHトンネリングしたり、めんどかったらAWSのセキュリティグループでプライベートIP指定したりする。後者の方が楽。

jmeterサーバの起動

これを複数のサーバで実行する。別に ./jmeter -s でもいいけど、どっちでもいい。

$ ./jmeter-server

SSHトンネリングとかするために、ホスト名を入れる場合はこんなかんじで。

$ ./jmeter-server -Djava.rmi.server.hostname=localhost

jmeterクライアントから負荷試験の指令を送る

こんなかんじ。jmxファイルは、jmeterで保存したテストプランのファイル。詳細はぐぐれ。

-R を使うと、通信先を指定できる。カンマで区切って複数指定する。

$ ./jmeter -n -t 【GUIのJmeterで保存したテストプランのファイル(拡張子は.jmx)】 -l 【出力ファイル(csv形式で出力される)】 -R 10.0.255.238:24001,10.0.255.237:24001

オプションの意味に関しては $ ./jmeter -\? で見れるので、そちらを参考に。

コマンドラインで複数指定したくない場合は、クライアントの jmeter.properties

remote_hosts=10.0.255.238:24001,10.0.255.237:24001

のように書いて、

./jmeter -n -t 【GUIのJmeterで保存したテストプランのファイル(拡張子は.jmx)】 -r -l 【出力ファイル(csv形式で出力される)】

でよい。

SSHトンネリングなどしてホスト名がある場合はやはり -Djava.rmi.server.hostname=localhost をつける。

これで終わり。

リファレンス

keystoreの設定方法

Apache JMeter - User's Manual: Remote (Distributed) Testing

keystoreのパスワードがおかしいとか言われた

java - keytool error Keystore was tampered with, or password was incorrect - Stack Overflow

SSHトンネルする

How to run jmeter over ssh tunnel | ionel's codelog

やり方について

Performance Testing in the Cloud with JMeter & AWS

marshalexceptionについて

(ロシア語) azure - Jmeter MarshalException: аргументы сортировки ошибок - Qaru

azure - Jmeter MarshalException: error marshalling arguments - Stack Overflow

サーバがビジーって言われたら

Killすればおk

distributed - JMeter: JMeter remote test fails with error as "Engine is busy, Please try later" - Stack Overflow

SSHトンネリングに使いそうなスクリプト

# sh tunneling.sh [localport] [target-ip]
second_localport=$(($1 + 2000))
echo "$1 port is used and target ip is $2"
ssh -L $1:localhost:24001 -R 25000:localhost:25000 -L $second_localport:localhost:26001 -N ubuntu@$2 -i ~/.ssh/jmeter-stress-test.pem -f

まとめ

これでインスタンスの数だけリクエストを送りまくれる。

50万リクエスト/秒とか飛ばして人のサーバをぶっつぶせるので楽しい!タノシイ!タノシイ!

誰かのクレカさえ奪えれば気軽にDDoSできる世の中すごい怖い。

ちなみに攻撃ツールとしては指令が失敗した場合止まるのであんまり役に立たないと思います。

たのしい負荷試験ライフを!

免責

免責があります。