Dmitri Tikhanski is a Contributing Writer to the BlazeMeter blog.

Become a JMeter and Continuous Testing Pro

Start Learning
Slack

Test Your Website Performance NOW!

arrow Please enter a URL with http(s)
Jun 09 2015
En

JMeter で IP スプーフィングを使用してさまざまな IP アドレスからのリクエストをシミュレートする

現在のアプリケーションではフェールオーバと回復力の両方が重要なポイントであるため、今どき単一ノードのシステムを見つけることは容易ではありません。そのため、システムのロード テストを行う必要がある場合、テストの対象はクラスタになる可能性が高くなります。

 

クラスタの発想は、アプリケーションを障害から保護することです。1 つのノードに障害が発生した場合、残りのノードが受信リクエストを継続して処理します。一般的に、ロード バランサ ハードウェアまたはソフトウェアは単一のエントリ ポイントとして動作し、すべての受信リクエストを調整したうえで適切なバックエンド サーバに送信します。

 

ロード バランサに複数の IP アドレスがある状況についてはすでに説明しました。また、すべてのロード バランサ エンドポイントを対象にするように JMeter を設定する方法も確認済みです。再確認する場合は、「The DNS Cache Manager: The Right Way To Test Load Balanced Apps (DNS Cache Manager: ロード バランシングされたアプリのテストを行う正しい方法)」のガイドを参照してください。

 

持続性の課題

ロード バランサの主な機能の 1 つに「持続性」または「永続性」があります。これは、ロード バランサを介してクライアントを 1 つのバックエンド ノードに接続し、リクエストを送受信できるようにするメカニズムです。たとえば、アプリケーションが cookie をベースにした認証を使用していて、ユーザがバックエンド ノードの 1 つにログインした場合、ユーザはセッションのキャッシュをレプリケートするために必要な時間だけ認証されます(即時ではありません)。これは持続性の理由の 1 つです。

 

 

JMeter でシミュレートされたリクエストはロード バランサを経由してサーバ A に到達し、Cookie を取得します。それに続くリクエストがサーバ B に送られた場合、そのリクエストは認証されません。なぜなら、その時点では、このユーザについて知っているのはサーバ A だけであり、サーバ A がリクエストの Cookie を受け取ります(ただし、ローカル キャッシュが共有キャッシュにレプリケートされている場合はこの限りではありません)。

 

HTTP 以外のプロトコルが使用されている場合も同様の状況が発生します。FTP 経由で通信する場合は、JMeter Server A の間でのリクエストの送受信を 1 つのセッションの範囲内で行うことが必須になります。

 

さまざまな IP アドレスからの JMeter テストへのリクエストのシミュレート

 

上記のすべてが発生したとすると、JMeter から送信されたリクエストすべてが、サーバ A だけに送られ、サーバ B がロードを受け取らない状況になる可能性があります。その結果、アプリケーションが正しくスケーリングされているかどうかを確実に判断することができず、ロード テストの結果があいまいなものになります。では、異なる複数の IP アドレスから発生するリクエストを JMeter テストでシミュレートする方法を見てみましょう。

 

HTTP Request Sampler の下部(必要に応じて下にスクロールしてください)を見ると、「Source Address」の入力が見つかります。

 

 

この入力を IP スプーフィングに使用して、IP アドレス、ホスト名またはネットワーク インターフェース名を入力し、指定したソースからのリクエストが JMeter で送信されるようにします。ドロップダウンの選択肢は次のとおりです。

 

  • IP/Hostname
  • Device
  • Device IPv4
  • Device IPv6

 

通常、ロード ジェネレータであるコンピュータに複数のネットワーク インターフェースはないため、[IP/Hostname]について説明します。最初に、オペレーティング システム レベルでいくつかの IP アドレスを追加する必要があります。

 

Microsoft Windows ファミリの場合、2 とおりの追加方法があります。

 

GUI モード

 

Windows ディストリビューションに応じて、コントロール パネルで[ネットワーク接続]ウィンドウを探し、インターフェースを右クリックして[プロパティ]を選択します。

 

windows_network_properties.png

 

このウィンドウを開く別の方法として、Windows + R キーを押し、「ncpa.cpl」と入力して Enter キーを押す方法もあります。

 

次のウィンドウで[インターネット プロトコル バージョン 4]を選択し、もう一度[プロパティ]をクリックします。

 

windows_connection_properties.png

 

クリックすると、次のウィンドウが開きます。

windows_ip_properties.png

 

[IP アドレスを自動的に取得する]をオフにして、IP アドレス、ネットマスク、ゲートウェイ、および DNS サーバを手動で設定してください。DHCP で割り当てられるアドレスの場合、IP エイリアス機能は使用できず、ネットワーク アダプダに IP アドレスを追加することはできません。

 

手動の IP アドレスを設定したら、[詳細設定]ボタンをクリックします。[TCP/IP 詳細設定]ウィンドウが表示されます。このウィンドウで[追加]ボタンをクリックし、メインの IP アドレスに加えて必要な数だけ IP アドレスを追加できます。

 

windows_advanced_ip_configuration.png


 

ご覧のように、IP アドレス 10.20.30.40 を追加しました。ネットマスク「255.255.255.0」には追加 IP アドレスを 253 個(256 個からブロードキャスト アドレス、ネットワーク アドレス、プライマリ IP を引いた数)設定できますが、その数を実際に制限するのは、ゲートウェイの設定、RAM、テスト シナリオの詳細、そして発想力だけです。理論的には、単一のネットワーク インターフェースで 4,294,967,294 個の IP アドレスをシミュレートすることが可能です。私の経験では、インターフェースあたり 2000 個の IP を設定しても問題に遭遇したことはありません。

 

コマンド ライン モード

 

もっと手早く(私の意見ですが)効率的なオプションは、Windows コマンド プロンプトでnetsh add コマンドを使用する方法です。次のように簡単に 1 個の IP アドレスを追加できます。

 

netsh interface ipv4 add address “Wi-Fi” 10.20.30.40 255.255.255.0

 

Windows シェル スクリプトを使用すると、IP アドレスの範囲全体を 1 つのコマンドで一度に追加できます。

 

FOR /L %A IN (40,1,50) DO netsh interface ipv4 add address "Wi-Fi" 10.20.30.%A 255.255.255.0


 

このコマンドは、10.20.30.40 から 10.20.30.50 までの(両端を含む) 11 個の IPv4 アドレスを「Wi-Fi」インターフェースに追加します。パフォーマンス テストにはイーサネットを使用する方が論理的な準拠性が向上すると考えられるため、実際のネットワーク インターフェース名は異なります。[ネットワーク接続]ウィンドウをチェックして、例の「Wi-Fi」を実際のネットワーク接続名に置き換えてください。

 

(Linux と MacOSX システムは同様の機能をサポートしています。この投稿では IP スプーフィングを中心的に取り上げているため、これらのシステムについての説明は省略します。しかし、使用しているオペレーティング システム用のコマンドやテスト シナリオについて正確な情報が必要な場合は、この投稿の最後にあるコメント セクションから要請してください。私自身か他の誰かがお手伝いします。)

 

では、JMeter に戻りましょう。

 

概念実証として、Apache Tomcat を使用します。Tomcat には追加設定なしで使用できる Web ページがあり、受信リクエストの IP アドレスをアクセス ログに記録できます。ポート 8080 で稼働するデフォルトのままの展開環境が私のコンピュータにインストールされているので、Tomcat に単一の HTTP リクエストを送信し、どうなるかを見てみましょう。

 

JMeter 設定は次のとおりです。

 

  • スレッド グループは 1 スレッド、1 ループ
  • HTTP リクエスト
  • サーバ名: localhost
  • ポート番号: 8080
  • View Results Tree リスナ

 

jmeter_default.png

 

これはデフォルト設定のままの[View Results Tree]リスナ出力で、サンプルの開始時間、ローカル時間、本文サイズ、応答ヘッダなどが含まれています。

 

次に Tomcat アクセス ログを見てみましょう。このログは Tomcat インストール先の /logs フォルダにあり、デフォルトで「localhost_access_log」にタイムスタンプが付いた名前になります。

 

access_log_default.png

 

アクセス ログで次の情報を確認できます。

 

  • 応答本文サイズ(11418 バイト)
  • 応答コード(200)
  • プロトコル(HTTP)
  • メソッド(GET)
  • タイムスタンプ
  • 最重要ビット: ソース IP アドレス(127.0.0.1)


 

次に、IP アドレスを先ほど追加した 10.20.30.40 に設定してみましょう。そのためには、HTTP Request Sampler の[Source Address]に IP を入力するだけです。

 

jmeter_single_ip.png

 

では、もう一度アクセス ログを見てみましょう。

 

access_log_single_ip.png

 

発信元の IP アドレスが 10.20.30.40 になっています。

 

次に、Tomcat サーバにそれぞれが異なる IP アドレスを持つ 10 個のスレッドを送信してみます。[CSV Data Set Config]を使用してファイルから IP アドレスを読み取ります。

 

次のように 10.20.30.41 から 10.20.30.50 までの IP アドレスを .csv ファイルに保存しましょう。

 

ip_csv.png

 

CSV Data Set Config 要素をテスト プランに追加し、.csv ファイルのフル パスと任意の変数名(ここでは IP とします)を指定して、ファイルを読み取るように設定します。

 

csv_data_set.png


 

次にスレッドの数を 10 に設定します。

 

jmeter_threads_number.png

 

また、[Source Address]を動的変数 ${IP} に設定します。

jmeter_dynamic_ip.png

 

では、もう一度テストを実行して、どうなるかを見てみましょう。

access_log_multiple.png

 

アクセス ログからわかるように、すべてのリクエストがおおよそ同時に送信され、各スレッドにそれぞれの IP アドレスが使用されています。以上で完了です。

 

BlazeMeter Cloud でのテストの実行に関して、BlazeMeter は分散型の設計になっているため、IP スプーフィングについてさほど気にする必要はありません。また、任意の数の JMeter エンジンを設定して開始することもできます。

 

blazemeter_engines.png

 

さらに、BlazeMeter サーバの hosts ファイルを制御できます。hosts.txt と呼ばれるファイルを .jmx スクリプトやその他のファイルと共に用意するだけで十分です。そのファイルは自動的に適用されます。

 

このガイドが役に立てば幸いです。いつものように、不明な点があれば遠慮なく質問してください。また、以下のディスカッションのセクションから任意の形式でフィードバックをお寄せください。

 

一対一のデモセッションを予約いただくと、BlazeMeter の機能について説明を受けることができます。

 

詳細情報
 

経験豊富な JMeter ユーザは、オンデマンドの Web キャスト「How to Create Advanced Load Testing Scenarios with JMeter (JMeter による高度な負荷テスト シナリオの作成方法)」をご覧ください。

 

 

JMeter を使ったことがなく、詳細を知りたい場合は、無料のオンライン JMeter トレーニング コースにサインアップしてください。


 

リソースのすべての JMeter リストを必ず参照してください。

 

 

 

     
arrow Please enter a URL with http(s)

You might also find these useful:

Interested in writing for our Blog?Send us a pitch!