Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Softflowd_49.7d_20160723

484 views

Published on

wrong time recorded when converting from pcap to netflow.

Published in: Internet
  • Be the first to comment

  • Be the first to like this

Softflowd_49.7d_20160723

  1. 1. softflowdでPCAPからNetFlowに exportする(変換する)と 約49.7⽇単位でフローの開始終 了時刻がずれる原因と対策 2016/07/24修正 梅野 崇
  2. 2. 背景(1) • NetFlow v5, v9いずれも以下のような時間管理を⾏っている。 • 現在のUnixtime(1970/01/01 UTC 0:00:00)からの秒数 • 起動時刻から現在時刻までの時間をunsigned int 32bitでミリ秒単位で 保持 • 各フローの開始時間、終了時間は起動時からのunsigned int 32bitでミ リ秒単位で保持 • unsigned int 32bitでミリ秒単位で最⼤保持可能な時間は • →2^32-1 ミリ秒=4294967295ミリ秒=約49.7⽇ • 起動時から現在までの時間や各フローの開始時間、終了時間は unsigned int のため正の値しかとれない。(負の値はとれない)
  3. 3. 背景(2) • リアルタイムでNetFlowのフローのデータをexportする(変換す る)際には問題にならない。 • システム起動からの時間、フロー開始時間、フロー終了時間に⼤差が ない • また、システム起動前にフローが開始、終了することもありえない。 (システム起動時間を基準にするとマイナスの時間にフローが開始、 終了されることがありえない)
  4. 4. 問題例1 • softflowd動作環境の起動時刻前に採取されたPCAPファイルか らNetFlowに変換する場合に誤った時刻が記録される。 • 問題例1 JST(UTC+9) Unixtime (1970/01/01 00:00:00 UTCからの経過秒数) 現在時刻 2016/07/03 12:00:00.000 1467514800 起動時刻 2016/07/02 12:00:00.000 1467428400 フロー開始時刻 2016/07/01 12:00:00.000 1467342000 フロー終了時刻 2016/07/01 12:00:01.000 1467342001
  5. 5. 問題例1の原因(1) • 問題例1 • 時刻はいずれもJST(UTC+9) • 現在時刻 2016/07/03 12:00:00.000→起動からの経過時間 86400000ms • 起動時刻 2016/07/02 12:00:00.000→Unixtime 1467428400秒 • フロー開始時刻 2016/07/01 12:00:00.000 →起動からの経過時間 -86400000ms • 起動からの経過時間 -86400000msと⾔いたいが、 • 0から2^32-1ms(= 4294967295ms)しか扱えない。 32bitでは-86400000 =0xFAD9A400 • unsigned int 32bitとして扱うと0xFAD9A400= 4208567296ms • フロー開始時刻が起動時刻2016/07/02 12:00:00.000 + 4208567296ms 、 つまりUnixtime 1467428400秒 + 4208567.296秒= 1471636967.296秒 →2016/08/20 05:02:47.296 に⾒えてしまう。 • 同様にフロー終了時刻は 2016/08/20 05:02:48.296に⾒えてしまう
  6. 6. 問題例1の原因(2) • 結果としてNetFlowで下記の誤ったフロー開始時刻、フロー終 了時刻が記録される。 JST(UTC+9) Unixtime (1970/01/01 00:00:00 UTCからの経過秒数) 現在時刻 2016/07/03 12:00:00.000 1467514800 起動時刻 2016/07/02 12:00:00.000 1467428400 誤ったフロー開始時刻 2016/08/20 05:02:47.296 1471636967.296 誤ったフロー終了時刻 2016/08/20 05:02:48.296 1471636968.296
  7. 7. 問題例1の対策(1) • NetFlowのcollectorのfluent-plugin-netflow (Fluentdのplugin) で2^32/1000 秒(約49.7⽇)単位でフロー開始時刻、フロー終了 時刻を過去に遡って記録する。 • 1471636967.296(誤ったフロー開始時刻) ‒ 1467342000(正しいフロー 開始時刻) = 4294967.296 = 2^32 / 1000 • 1471636968.296(誤ったフロー終了時刻) ‒ 1467342001(正しいフロー 修正時刻) = 4294967.296 = 2^32 / 1000
  8. 8. 問題例1の対策(2) • 結果としてNetFlowで下記の修正された正しいフロー開始時刻、 フロー終了時刻が記録される。 JST(UTC+9) Unixtime (1970/01/01 00:00:00 UTCからの経過秒数) 現在時刻 2016/07/03 12:00:00.000 1467514800 起動時刻 2016/07/02 12:00:00.000 1467428400 フロー開始時刻(修正済) 2016/07/01 12:00:00.000 1471636967.296 -4294967.296 =1467342000 フロー終了時刻(修正済) 2016/07/01 12:00:01.000 1471636968.296 -4294967.296 =1467342001
  9. 9. 問題例2 • softflowd動作環境の起動時刻から約49.7⽇より前に採取された PCAPファイルからNetFlowに変換する場合に誤った時刻(実際 のフロー開始終了時刻より約99.4⽇後の時刻)が記録される。 • 問題例2 JST(UTC+9) Unixtime (1970/01/01 00:00:00 UTCからの経過秒数) 現在時刻 2016/07/03 12:00:00.000 1467514800 起動時刻 2016/07/02 12:00:00.000 1467428400 フロー開始時刻 2016/05/10 12:00:00.000 1462849200 フロー終了時刻 2016/05/10 12:00:01.000 1462849201
  10. 10. 問題例2の原因(1) • 問題例2 • 時刻はいずれもJST(UTC+9) • 現在時刻 2016/07/03 12:00:00.000→起動からの経過時間 86400000ms • 起動時刻 2016/07/02 12:00:00.000→Unixtime 1467428400秒 • フロー開始時刻 2016/05/10 12:00:00.000→-4579200000ms • 起動からの経過時間-4579200000msと⾔いたいが、 • 0から2^32-1ms(= 4294967295ms)しか扱えない。 また、32bitでは最上位桁があふれる。 下位32bitは0xEF0EF400 • unsigned int 32bitとして扱うと0xEF0EF400 = 4010734592ms • フロー開始時刻が起動時刻2016/07/02 12:00:00.000 + 4010734592ms 、 つまりUnixtime 1467428400秒 + 4010734.592秒= 1471439134.592秒 →2016/08/17 22:05:34.592 に⾒えてしまう。 • 同様にフロー終了時刻は 2016/08/17 22:05:35.592 に⾒えてしまう
  11. 11. 問題例2の原因(2) • 結果としてNetFlowで下記の誤ったフロー開始時刻、フロー終 了時刻が記録される。 JST(UTC+9) Unixtime (1970/01/01 00:00:00 UTCからの経過秒数) 現在時刻 2016/07/03 12:00:00.000 1467514800 起動時刻 2016/07/02 12:00:00.000 1467428400 誤ったフロー開始時刻 2016/08/17 22:05:34.592 1471439134.592 誤ったフロー終了時刻 2016/08/17 22:05:35.592 1471439135.592
  12. 12. 問題例2の対策(1) • NetFlowのcollectorのfluent-plugin-netflow (Fluentdのplugin) で(2^32/1000)*2 秒(約99.4⽇)単位でフロー開始時刻、フロー 終了時刻を過去に遡って記録する。 • 1471439134.592(誤ったフロー開始時刻) ‒ 1462849200(正しいフロー 開始時刻) = 8589934.592 = (2^32 / 1000)*2 • 1471439135.592誤ったフロー終了時刻) ‒ 1462849201(正しいフロー 修正時刻) = 8589934.592 = (2^32 / 1000)*2
  13. 13. 問題例2の対策(2) • 結果としてNetFlowで下記の修正された正しいフロー開始時刻、 フロー終了時刻が記録される。 JST(UTC+9) Unixtime (1970/01/01 00:00:00 UTCからの経過秒数) 現在時刻 2016/07/03 12:00:00.000 1467514800 起動時刻 2016/07/02 12:00:00.000 1467428400 フロー開始時刻(修正済) 2016/05/10 12:00:00.000 1471439134.592 -8589934.592 =1462849200 フロー終了時刻(修正済) 2016/05/10 12:00:01.000 1471439135.592 -8589934.592 =1462849201
  14. 14. まとめ • NetFlowのcollectorのfluent-plugin-netflow (Fluentdのplugin) で2^32/1000 秒(約49.7⽇)*nだけ時刻をマイナスして記録する オプションを作成する。 • システム起動時刻からPCAPファイルの採取時刻を⽐較する。 • システム起動時刻よりPCAPファイルが0から約49.7⽇古い場合、n=1 をオプションに指定 • システム起動時刻よりPCAPファイルが約49.7⽇から約99.4⽇古い場合、 n=2 をオプションに指定 • システム起動時刻よりPCAPファイルが約99.4⽇から約149.1⽇古い場 合、 n=3 をオプションに指定
  15. 15. 参考⽂献 • softflowd • http://www.mindrot.org/projects/softflowd/ • NetFlow Export Datagram Format • http://www.cisco.com/c/en/us/td/docs/net_mgmt/netflow_collecti on_engine/3-6/user/guide/format.html • NetFlow v9 Export Format • http://www.cisco.com/c/en/us/td/docs/ios/12_0s/feature/guide/n fexpfv9.html • fluent-plugin-netflow • https://github.com/repeatedly/fluent-plugin-netflow • Netflowコレクターを無償のFluend+ElasticSearch+Kibanaで 構築する • http://komeiy.hatenablog.com/entry/2014/09/26/212000

×