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をよくわかってない。誰か教えてください。
この人の説明がわかりやすい(英語) ↓
↑の記事と、この記事で疑問点はほぼ解消されると思う(たぶん)
やることの順番
・インスタンスを複数用意(クライアント用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/
各インスタンスにjavaとjmeterをインストール
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
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できる世の中すごい怖い。
ちなみに攻撃ツールとしては指令が失敗した場合止まるのであんまり役に立たないと思います。
たのしい負荷試験ライフを!
免責
免責があります。