2019年11月18日月曜日

並列実行のNetFlowシミュレーターを実現するには?

今回はUbuntuで利用出来るパッケージを駆使して、並列実行で動作するNetFlowシミュレーターを実現したというお話をしたいと思います。

文:ジュピターテクノロジー よしひろ


単一スレッドの試験では、ソフトウェアを十分に評価したとは言い切れません。実環境で1台のルーターからのみNetFlowを受信するといったケースもあるでしょうが、メーカーが言っていることを鵜呑みにせず、手元で何パターンか試験してリリースしたいところです。今回の検証イメージは図1のようになっております。単純にサーバー、クライアント構成ですね。サーバー側のフローコレクターにはNetVizura NetFlow Analyzer(NetVizura NFA)をインストールしております。

図1 検証図

そして、マルチスレッドのNetFlowシミュレーターの実現ステップは以下の通りです。
マルチスレッドNetFlowシミュレーターの実現ステップ: 
  1. tcpreplayのインストール
  2. NetFlowパケットのキャプチャ
  3. parallelのインストール
  4. tcpreplayの実行
  5. サーバー(フローコレクター)側での受信確認

1. tcpreplayのインストール

tcpreplayは、tcpdump/Wiresharkで保存したパケットを再送出来るソフトウェアです。しかも速度を調整する、付属のtcpreplay-editでパケットを編集して再送といったことも出来る素晴らしいソフトウェアです。このソフトウェアを使って、キャプチャしたNetFlowをフローコレクターに再送してあげれば性能測定に利用できるといったコンセプトが本ブログ記事です。tcpreplayをUbuntu18.04.3 LTSにインストールするには、以下のコマンドを実行するだけです。

$ sudo apt-get install tcpreplay

2. NetFlowパケットのキャプチャ

ルーター実機から実際にNetFlowを設定し送信・キャプチャするでも良いですが、実機環境がない方もいらっしゃると思います。そういった方は、solarwinds社のFlow Tool Bundleを利用してください。Flow Tool BundleのNetFlow Generatorから25fpsのNetFlowをキャプチャしたもの(ファイル名:SW_25fps_10012flows_5006packets.pcap, パケット数5006, flow数10,012のキャプチャファイル)を今回利用します。※NetFlow Generatorからキャプチャしたパケットは、1パケットに2flows含まれています。よって、送信したパケット数の倍がflow数となります。なおFlow Tool Bundleについては、本記事では説明を省きますが、別記事にて紹介したいと思います。

3. parallelのインストール

Gnu parallelはシェル上で並列実行を実現するソフトウェアです。今回は本ソフトウェアを利用して並列実行を実現します。Ubuntu18.04.3 LTSへのインストール手順は、以下のコマンドを実行するだけです。

$ sudo apt-get install parallel

4. tcpreplayの実行

NetVizura NFA側でのグラフ表示を分割し、送信したNetFlowに抜けがないかを判別する為に送信元IPアドレス編集して送信しました。その為、tcpreplay-editを利用しています。
実行コマンドは以下の通りです。※1スレッドの例となります

$ date ; time seq 1 1 |  sudo parallel --jobs 1 'sudo tcpreplay-edit --srcipmap=0.0.0.0/0:192.168.44.{}/32 --dstipmap=0.0.0.0/0:192.168.91.128/32 -i ens3 -p 25 ./SW_25fps_10012flows_5006packets.pcap'
Tue Nov 12 17:11:35 JST 2019
[sudo] password for demo:
Academic tradition requires you to cite works you base your article on.
When using programs that use GNU Parallel to process data for publication
please cite:

  O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
  ;login: The USENIX Magazine, February 2011:42-47.

This helps funding further development; AND IT WON'T COST YOU A CENT.
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.

To silence this citation notice: run 'parallel --citation'.

Actual: 5006 packets (811124 bytes) sent in 200.20 seconds
Rated: 4051.5 Bps, 0.032 Mbps, 25.00 pps
Flows: 1 flows, 0.00 fps, 5006 flow packets, 0 non-flow
Statistics for network device: ens3
        Successful packets:        5006
        Failed packets:            0
        Truncated packets:         0
        Retried packets (ENOBUFS): 0
        Retried packets (EAGAIN):  0

real    3m23.612s
user    3m20.300s
sys     0m0.142s

Successful packetsをみると5,006パケットとなっていますのでFlow Tool Bundleから受信したパケットを全て送信していることを確認出来ます。また、実行時間が200.20秒かかっているので1秒あたり25パケット投げています。こちらは、tcpreplay-editの-pオプション(packets/sec)を25と設定している為です。前述の記載通りNetFlow Genratorで収集したパケットは、1パケットあたり2flows含んでいます。従ってこのシミュレーター1スレッドあたり、50fpsのNetFlowをNetVizura NetFlow Analyzerに送信していることになります。今回、tcpreplay-editのオプション"--jobs 1"で実行していますので、50fps * 1 = 50fps となっていれば正しくフローの送受信が行われたということになります。ただし、単発で投げると上記の通り3分ほどで終了してしまいます。NetVizura NFAのグラフは直近5分間のデータを丸めて表示しますので少なくとも10分間以上投げ続けると奇麗な50fpsのグラフが表示されるはずです。それでは、tcpreplay-editのオプション-l(ループ数)を指定して再度実行してみましょう。

$ date ; time seq 1 1 |  sudo parallel --jobs 1 'sudo tcpreplay-edit  -l 10 --srcipmap=0.0.0.0/0:192.168.44.{}/32 --dstipmap=0.0.0.0/0:192.168.91.128/32 -i ens3 -p 25 ./SW_25fps_10012flows_5006packets.pcap'
Tue Nov 12 18:12:35 JST 2019
[sudo] password for demo:
Academic tradition requires you to cite works you base your article on.
When using programs that use GNU Parallel to process data for publication
please cite:

  O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
  ;login: The USENIX Magazine, February 2011:42-47.

This helps funding further development; AND IT WON'T COST YOU A CENT.
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.


To silence this citation notice: run 'parallel --citation'.

Actual: 50060 packets (8111240 bytes) sent in 2002.36 seconds
Rated: 4050.8 Bps, 0.032 Mbps, 25.00 pps
Flows: 1 flows, 0.00 fps, 500600 flow packets, 0 non-flow
Statistics for network device: ens3
        Successful packets:        50060
        Failed packets:            0
        Truncated packets:         0
        Retried packets (ENOBUFS): 0

        Retried packets (EAGAIN):  0

Tue Nov 12 17:29:45 JST 2019

real    33m23.055s
user    33m22.198s

sys     0m0.335s

上記の通り、-lオプションで10回ループさせていますので、総送信パケット数は5,006 * 10 = 50,060となっております。また、時間も30分を超えていますね。それでは、NetVizura NetFlow Analyzerのfpsを表示出来る画面を見てみましょう。


5. サーバー(フローコレクター)側での受信確認


上図の通り、最大50fpsに到達しています。シミュレーターが送信したfpsとサーバー側で受信したfpsが一致したことになります。

最後に20スレッドで-pオプション(packets/sec)を13を指定して試験してみましょう。到達予想fpsは、20 * 13 * 2 = 520fpsとなります。13packet/secですと、5,006/13=約385秒です。30分以上実行したいので、1800秒/385秒=約4.7。-lオプションは5を指定すればよさそうです。では、実際に実行してみましょう。

$ date ; time seq 1 20 |  sudo parallel --jobs 20 'sudo tcpreplay-edit -l 5 --srcipmap=0.0.0.0/0:192.168.11.{}/32 --dstipmap=0.0.0.0/0:192.168.91.128/32 -i ens3 -p 13 ./SW_25fps_10012flows_5006packets.pcap'

Actual: 25030 packets (4055620 bytes) sent in 1925.31 seconds
Rated: 2106.4 Bps, 0.016 Mbps, 13.00 pps
Flows: 1 flows, 0.00 fps, 125150 flow packets, 0 non-flow
Statistics for network device: ens3
        Successful packets:        25030
        Failed packets:            0
        Truncated packets:         0
        Retried packets (ENOBUFS): 0
        Retried packets (EAGAIN):  0
Actual: 25030 packets (4055620 bytes) sent in 1925.32 seconds
Rated: 2106.4 Bps, 0.016 Mbps, 13.00 pps
Flows: 1 flows, 0.00 fps, 125150 flow packets, 0 non-flow
Statistics for network device: ens3
        Successful packets:        25030
        Failed packets:            0
        Truncated packets:         0
        Retried packets (ENOBUFS): 0
        Retried packets (EAGAIN):  0
Actual: 25030 packets (4055620 bytes) sent in 1925.30 seconds
Rated: 2106.4 Bps, 0.016 Mbps, 13.00 pps
Flows: 1 flows, 0.00 fps, 125150 flow packets, 0 non-flow

Statistics for network device: ens3
      ・

      ・
    (続く)


計算通り、520fpsに到達しておりますね。また、しっかりとマルチスレッドで受信出来ているかはNetVizura NetFlow AnalyzerのNetFlowモジュール→Exportersタブで確認することが出来ます。


192.168.11.1~192.168.11.20のエクスポータからフローを受信しているようにちゃんと見えています。本検証で、送信側と受信側のfpsカウントの同期がとれたことになり、かつ並列実行でのフローコレクターの試験が出来たことになります。

弊社では、フローコレクターNetVizura NetFlow Analyzerを販売しております。



主な特長としては、
  1. 軽量で低スペックサーバーでも動作
  2. サブスクリプションによる柔軟なライセンス契約
  3. 特定トラフィック・特定ユーザーの監視に適している
  4. ネットワークが遅い!の調査に使えるお手軽フローコレクター
となります。評価版(Free Editionへは、30日経過後に移行可能)、マニュアルを無償で提供しておりますので、NetVizura NetFlow Analyzerをこの機会に是非お試しください。









92.168.81.121 port 2055