ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

OpenWRT:softflowd + Ubuntu:nfdumpでnetflowの実験

[technology] Ubuntu上でnfdump(nfcapd)を動かし、netflow情報を収集する

下記の記事の続きです。
rc30-popo.hatenablog.com
rc30-popo.hatenablog.com

さて、Ubuntu 18.04 LTS上でnfdumpをビルドし動かせる様になったのでOpenWRT上で起動させたsoftflowd(netflow exporter)が吐き出すフロー情報をUbuntu上のnfdumpに拾わせてみます。
以下の説明でIPアドレスは以下の通りです。

IPアドレスノードnetflowソフトウェア
192.168.11.254OpenWRT機softflowd(netflow exporter)
192.168.11.252Ubuntu 18.04 LTS: netflow collectornfdump,nfcapd(netflow collector)
OpenWRT機ではPrivoxyというオープンソースproxyサーバーが稼働しておりWebアクセスやhttp/httpsを使うスマフォアプリの通信はほとんどこのマシンを通る様に運用しています。
  1. OpenWRT側でsoftflowdを起動

    まず/etc/config/softflowdを下記の様に設定します。
    host_portに書かれた9995はUbuntu側で動かすnfcapd(netflow collector)のデフォルト受信ポートです。
    (nfcapd側のオプションで変更可能)

    # cat /etc/config/softflowd
    config softflowd
    	option enabled        '1'
    	option interface      'br-lan'
    	option pcap_file      ''
    	option timeout        'maxlife=60'
    	option max_flows      '8192'
    	option host_port      '192.168.11.252:9995'
    	option pid_file       '/var/run/softflowd.pid'
    	option control_socket '/var/run/softflowd.ctl'
    	option export_version '5'
    	option hoplimit       ''
    	option tracking_level 'full'
    	option track_ipv6     '0'
    	option sampling_rate  '1'

    設定ファイルを作成したら

    # /etc/init.d/softflowd start

    で起動します。

  2. Ubuntu側でnfcapd起動

    下記の通り、収集したフロー情報をファイルに書くためのディレクトリを作成し、そのディレクトリ名を指定してnfcapdを起動します。

    $ mkdir netflow
    $ nfcapd -w -D -l ~/netflow -t 600
    • w: ファイルに書き出す
    • D: デーモンモードで起動
    • l: 書き込み先のディレクトリを指定
    • t: 書き込み先のファイルをローテートする時間(デフォルト300sec)

    上記設定では10分毎に~/netflow下にnfcapd.yyyymmddHHMMといった感じのファイルが増えていきます。

    $ ls ~/netflow
    nfcapd.201902241240  nfcapd.201902241300  nfcapd.current.27001
    nfcapd.201902241250  nfcapd.201902241310

  3. 収集したフロー情報をダンプ

    nfcapdで収集されたデータはバイナリフォーマットで、そのままでは人間には読めないため、nfdumpコマンドを使います。
    とりあえず1ファイルをヒューマンリーダブルなデータにするには-rオプションで対象ファイルを指定します。

    $ nfdump -r ~/netflow/nfcapd.201902241300
    Date first seen          Duration Proto      Src IP Addr:Port          Dst IP Addr:Port   Packets    Bytes Flows
    2019-02-24 13:08:15.760    63.357 TCP      192.168.11.13:43802 ->   192.168.11.254:22          70     4576     1
    2019-02-24 13:08:15.760    63.357 TCP     192.168.11.254:22    ->    192.168.11.13:43802       51     5480     1
    2019-02-24 13:08:52.549    64.810 TCP      107.23.96.251:443   ->   192.168.11.254:40740        6      990     1
    2019-02-24 13:08:52.549    64.810 TCP     192.168.11.254:40740 ->    107.23.96.251:443          7     2307     1
    2019-02-24 13:08:52.706    64.652 TCP      192.168.11.13:43466 ->   192.168.11.254:8118         7      925     1
    2019-02-24 13:08:52.706    64.652 TCP     192.168.11.254:8118  ->    192.168.11.13:43466        7     1180     1
    2019-02-24 13:08:29.728    11.328 TCP      192.168.11.13:44086 ->   192.168.11.254:22        1129    1.6 M     1
    2019-02-24 13:08:29.728    11.328 TCP     192.168.11.254:22    ->    192.168.11.13:44086      166    12758     1
    Summary: total flows: 8, total bytes: 1.6 M, total packets: 1443, avg bps: 126920, avg pps: 14, avg bpp: 1117
    Time window: 2019-02-24 13:08:15 - 2019-02-24 13:09:57
    Total flows processed: 8, Blocks skipped: 0, Bytes read: 568
    Sys: 0.003s flows/second: 2392.3     Wall: 0.003s flows/second: 2535.7    

    ほとんどプライベートセグメント上のやり取りですが、proxyからのamazonawsへのアクセスが見えています。
    複数ファイル纏めて見たい場合は-Rオプションを使います。

    $ nfdump -R netflow/nfcapd.201902241240:nfcapd.201902241310 > nfdata.txt

    こんな感じにすると、nfcapd.201902241240〜nfcpad.201902241310までを纏めてテキスト表示に変換してくれます。

    出力フォーマットを変えてみます。デフォルトだと情報量が少ないので、下記の様に-o extendedを付けてみます。
    TCPセッションだとTCPのflag情報が出てきます。Tosマーキングについても情報が出てきます。

    $ nfdump -r ~/netflow/nfcapd.201902241300 -o extended
    Date first seen          Duration Proto      Src IP Addr:Port          Dst IP Addr:Port     Flags Tos  Packets    Bytes      pps      bps    Bpp Flows
    2019-02-24 13:08:15.760    63.357 TCP      192.168.11.13:43802 ->   192.168.11.254:22    ...AP...   0       70     4576        1      577     65     1
    2019-02-24 13:08:15.760    63.357 TCP     192.168.11.254:22    ->    192.168.11.13:43802 ...AP...   0       51     5480        0      691    107     1
    2019-02-24 13:08:52.549    64.810 TCP      107.23.96.251:443   ->   192.168.11.254:40740 ...AP...   0        6      990        0      122    165     1
    2019-02-24 13:08:52.549    64.810 TCP     192.168.11.254:40740 ->    107.23.96.251:443   ...AP...   0        7     2307        0      284    329     1
    2019-02-24 13:08:52.706    64.652 TCP      192.168.11.13:43466 ->   192.168.11.254:8118  ...AP...   0        7      925        0      114    132     1
    2019-02-24 13:08:52.706    64.652 TCP     192.168.11.254:8118  ->    192.168.11.13:43466 ...AP...   0        7     1180        0      146    168     1
    2019-02-24 13:08:29.728    11.328 TCP      192.168.11.13:44086 ->   192.168.11.254:22    ...AP..F   0     1129    1.6 M       99    1.1 M   1402     1
    2019-02-24 13:08:29.728    11.328 TCP     192.168.11.254:22    ->    192.168.11.13:44086 ...AP..F   0      166    12758       14     9009     76     1
    Summary: total flows: 8, total bytes: 1.6 M, total packets: 1443, avg bps: 126920, avg pps: 14, avg bpp: 1117
    Time window: 2019-02-24 13:08:15 - 2019-02-24 13:09:57
    Total flows processed: 8, Blocks skipped: 0, Bytes read: 568
    Sys: 0.004s flows/second: 1847.6     Wall: 0.003s flows/second: 2452.5 
    

さて、これでOpenWRTベースのProxyサーバーに仕掛けたnetflow exporterからフロー情報を収集可能になりました。
1時間くらいフロー収集してみたので、このデータをjubatusに放り込んでアノマリ検知出来るか?とか試してみたいと思います。一応普通のWebアクセスやスマフォアプリに混ぜてnmapでのOpenWRTに対するポートスキャンを掛けてみたのですが...果たして(続け...)


nfdump/nfcapdの使い方については下記を参照。
github.com

softflowdに関しては下記。
github.com