ASA NetFlow NSELの集計
- ベータ版だが, 正しい集計値が出ないためnfdump-1.6.14-b2を使用.
- https://github.com/phaag/nfdump/archive/v1.6.14-b2.tar.gz
- nfdump-nselは1.5系にNSELを追加したもの. 1.6系も上記バージョンなら正しく集計値が出るようになった.
- ASA側の設定
- flow-export destination コレクタのいるインターフェース コレクタのIP コレクタのポート
- flow-export template timeout-rate 1
- NetFlow v9 のテンプレートを送信するタイミング. コレクタに早期にフォーマットを理解させるため,タイムアウトを短くしている.
- flow-export active refresh-interval 1
- UPDATEの出力されるタイミング. 1は最小値
- クラス定義 class-map flow_export は match any を設定. 全ての通信を対象に集計する.
- policy-map global_policy 内のクラス指定 class flow_export は flow-export event-type all destination でコレクタのIP を指定
- service-policy global_policy global でポリシーを割り当て.
- nfcapd を起動する. nfcapd -b 待ち受けIP -4 -l ログディレクトリ -S 2 -T all -t 300 -w 2>&1
- nfdumpによりログを集計する
- nfdump -a -N -q -R $dir -o 'fmt:%ts %te %sa %da %pr %sp %dp %ibyt %obyt %td %in %out %nfc %xsa %xda %xsp %xdp' '( asa event 1 ) or ( asa event 5 )'
- -aが集計, -Nが数値をM,Gなどの単位にせずそのまま出力, -Rがログを収納したディレクトリ, -o fmt:がログの出力フォーマット
- フィルタasa event 5でASAのNSEL出力のうち,CREATE と UPDATEを対象にする.
- %bytは%ibytと同じ, %ibyt %obytの集計ではない.
- byt の値はフィルタの要件として使用できるが, ibyt obytはできない. bytes 0 は ibytが0 と同じ.
- %出力はスペースでパディングされている.
- %nfc はコネクション番号, %x?? はNAT変換後のアドレス.NSELに固有の指定.
- DELETEを対象に入れると, 最終集計であるDELETE出力と中間集計であるUPDATE出力が重複し, 通信量が倍近くカウントされてしまう.
- CREATE,DELETEのみを対象にしてしまうと, 通信終了時にまとめて集計結果がカウントされるため, 通信量が終了時に偏り正確に出ない.
- syslogにはDELETEの結果しか報告されない. syslog level 6(infomational)以下の設定でないと報告自体が出ない.
- ヘッダ情報はバイト数としてカウントされていないため, キャプチャした場合より少ない量になる.
- NSELにパケット数の項目はない.
- CREATEのバイト数のカウントはすべて0. 開始時刻の正確性向上のため集計に繰り入れている.
- 全てのレコードのfirst,lastの時刻は同じ値. 最初と最後のパケットの到達時間ではない. CREATEとDELETEのfirst,lastも全て同じ値.
- durationはレコード時刻の差を取っているため, 短い時間の通信時間が正確に測定されていない.
- %msec というNSEL拡張のイベント発生時間の差を取った方が正確か?
- 送受信0バイトのUPDATEレコードが,実際の通信終了よりもかなり遅れて記録されることがある. DELETEと同時に来るものらしい.
- 通信終了の理由などは拡張イベントとして%xevtの値で設定されるらしい. 2000以上が終了コードで, 奇数ばかりだが, Ciscoの文書でも記述が省略されている.
- UPDATEのバイト数に4GB近い異常な値が出ることがある. このときibyt+obytは 4294967295 = 2^32-1になっている. DELETEイベント後にDENYイベント(No SYN)が起きるときの現象?