400 likes | 584 Views
分散システム特論 RFC3954 Cisco Systems NetFlow Services Export Version 9. システム情報科学府 情報工学専攻 修士 1 年 原田 義明. 概要. RFC3954 とは? Netflow version9 のフォーマットについて書かれている Netflow ネットワーク管理者に対して、データネットワーク上での IP フローに関するデータを提供 ネットワーク構成要素 ( ルータやスイッチ ) からフローデータを収集し、コレクタにエクスポートする 柔軟かつ詳細な計測結果を提供する. 管理者. ネットワーク
E N D
分散システム特論RFC3954Cisco Systems NetFlow Services Export Version 9 システム情報科学府 情報工学専攻 修士1年 原田 義明
概要 • RFC3954とは? • Netflow version9 のフォーマットについて書かれている • Netflow • ネットワーク管理者に対して、データネットワーク上でのIPフローに関するデータを提供 • ネットワーク構成要素(ルータやスイッチ)からフローデータを収集し、コレクタにエクスポートする • 柔軟かつ詳細な計測結果を提供する 管理者 ネットワーク 構成要素 Netflowコレクタ
概要 • フローとは • ネットワーク機器を通過した、ある共通した特性を持つ単一方向のパケットの列 • IPアドレス、パケット数、バイト数、タイムスタンプ、ToS(Type of Service)、アプリケーションが使用するポート番号、入出力インターフェースなど
準備 • フロー抽出のタイミング • エクスポーターがフローの終わりを検出した場合 • TCPコネクションのFINもしくはRSTbitの検出など • フローが一定時間非アクティブだった場合 • 一定時間パケットが観測されなかったフロー • 長寿命のフローに関して、一定時間毎に抽出 • タイムアウト時間は設定可能 • エクスポーターに何かしらの内部的な制約が発生した場合 • メモリ不足やカウンターが折り返してしまう場合
NetFlow export version 9 • バージョン9は、エクスポートフォーマットにテンプレートを使用している • IPパケットのフローを柔軟性が高く、拡張性に富んだ方法で観測することができる • エクスポートする情報のフォーマットの構造を変更せずに、新しいフィールドをNetFlowのレコードに追加できる • 必要なデータのみをエクスポートできるので、ネットワーク負荷を軽減できる
準備 • エクスポートされるフローセットの種類 • データ・フローセット • フローデータ・レコード • エクスポートされたフローのデータ部分 • オプション・データ・レコード • NetFlowの処理設定など、フロー以外の要求された情報 • テンプレート・フローセット • 何をエクスポートするのかを定義したフローセット • オプション・テンプレート・フローセット • 何をエクスポートするのかを定義したフローセット • フロー自体ではなく、NetFlowの処理設定や処理固有のデータを提供するために利用される
NetFlowのやり取り テンプレート フローセット データ フローセット コレクター エクスポーター これから送信するエクスポートデータの フォーマットを送信する テンプレート フローセット データ フローセット フローデータ 受け取ったデータフローセットの テンプレートは、コレクター側で保持 エクスポーターは、データ・フローセットを送信する コレクターは、 送られてきたデータ・フローセットと 過去に受け取ったテンプレートを比較 (それぞれのフローセットのIDを利用) テンプレートがあれば、 フローデータを作成できる
エクスポートパケット • エクスポートパケットは、ヘッダに続く1つ以上のフローセットから構成される • テンプレート、データ、オプションテンプレートのいずれか • フローセットにはそのフローセットのタイプを識別するためにIDが割り振られている • IDが256より小さいものは、テンプレートやオプションといった特別なフローセットのために予約されている パケット ヘッダ テンプレート フローセット データ フローセット オプション テンプレート フローセット ・・・・・・
エクスポートパケット • テンプレート、データ、オプションテンプレートが入り混じっている場合 • 新しく作られたテンプレートを、できる限り早くエクスポートするケース • テンプレートやオプションテンプレートがスペース上の都合により、入り混じって配置されていく パケット ヘッダ テンプレート フローセット データ フローセット データ フローセット オプション テンプレート フローセット ・・・・・・
エクスポートパケット • データパケットのみにより構成 • 適切なテンプレートレコードが定義され、Netflowコレクター機器に送信された後 • 大部分のエクスポートパケットはデータフローセットのみで構成される パケット ヘッダ データ フローセット データ フローセット データ フローセット ・・・・ ・・・・ ・・・・ ・・・・
エクスポートパケット • テンプレート、及びオプションテンプレートのみで構成 • エクスポーターは、テンプレート、及びオプションテンプレートを含むパケットを定期的にNetFlowコレクターに送信する • フローデータレコードの正しい定義を保持するために行われる パケット ヘッダ テンプレート フローセット オプション テンプレート フローセット テンプレート フローセット ・・・ ・・・
パケット・フォーマット パケットヘッダのフォーマット
パケットフォーマット • バージョン情報 • エクスポートに使用されているフローレコードフォーマットのバージョン番号 • 最新のバージョンは9 • カウント • エクスポート・パケットに含まれるレコード数 • オプション・フローセット・レコード、テンプレート・フローセット・レコード、データ・フローセット・レコードの合計数 • sysUpTime • 機器がブートしてから経過した時間をミリ秒で示したもの
パケットフォーマット • UNIX Secs • エクスポートパケットがエクスポーターから創出された時刻を “0000 UTC 1970” を起点とした経過秒数で示したもの • シーケンス番号 • エクスポーターが観測ドメインから送信した全てのエクスポートパケットにつけられたシーケンス番号(昇順) • コレクターがエクスポートパケットの取りこぼしが無いか判断するときに使用 • ソースID • 観測ドメインを特定するための32bitの値 • コレクターは、ソースIDと送信元IPアドレスの組み合わせで、異なるエクスポートストリームを区別する
テンプレート・フローセット テンプレート・フローセットのフォーマット
テンプレート・フローセット • フローセットID • テンプレート・フローセットはID=0が割り振られている • 長さ • フローセット全体の長さ • テンプレートフローセットの数が可変であるため、記述しなければならない • テンプレートID • テンプレートレコードに割り振られる、一意なテンプレートID • 生成した観測ドメイン内で、一意性は保障される • IDは、0~255まではテンプレートフローセット、オプション・フローセット、及び将来定義されるフローセットのために予約
テンプレート・フローセット • フィールド数 • テンプレートレコードに含まれるフィールド数 • この値から、次のテンプレートレコードまでの区切りを判断する • フィールドタイプ • フィールドのタイプを表す数値 • フィールド長 • フィールドのタイプに対応した、バイト数を示す
データ・フローセット データ・フローセットのフォーマット
データ・フローセット • フローセットID • フローセットごとにIDが割り振られている • このフローセットが流れる以前に生成されているテンプレートIDと対応付けられている • 長さ • 本フローセットに含まれる全てのフローレコードの長さ • レコード N – フィールド値 M • フローデータ・レコードの並び • N個のフローレコードと、テンプレートIDで示されたフィールドのタイプと数のデータを含む • パディング • 4バイトごとに区切られるように、0で埋められたパディング
データ・フローセット オプション・テンプレート・フローセットのフォーマット
データ・フローセット • フローセットID • オプション・テンプレートには ID = 1 が予約 • 長さ • オプション・テンプレート・フローセット全部の長さ • テンプレートID • 256以上の値が入っており、このオプション・テンプレートのIDを示す • オプション・スコープ長 • オプション・テンプレート・レコードに含まれているスコープ・フィールドの長さ
データ・フローセット • オプション長 • オプション・テンプレート・レコード中のフィールド定義のバイト数 • スコープN フィールドタイプ • オプション・テンプレート・レコードが示しているエクスポーターやNetFlow処理部の指定 • スコープ・フィールドは必ずオプションフィールドの前に来る 1 : システム 2 : インターフェース 3 : ラインカード 4 : キャッシュ 5 : テンプレート
データ・フローセット • スコープN フィールド長 • スコープ・フィールドのバイト長 • オプションM フィールド・タイプ • オプション・テンプレートの中にフィールドの型を指定 • オプションM フィールド長 • オプションフィールドのバイト長 • パディング • 4バイトごとの境界で区切れるように0でパディング
オプション・フローセット データ・フローセット・フィールドの オプション・データ・レコードの説明
オプション・フローセット • フローセットID • データフローセットに対応するテンプレートのID • 長さ • このフローセット全体の長さ • レコードN – オプション・フィールド値 • スコープとオプションフィールド値の長さや種類は、テンプレートにより定義されており、そのデータ部分 • パディング
テンプレートの管理 • テンプレートの管理 • テンプレート・レコードとフローデータ・レコードは同じエクスポートパケットに表れてもよい • 必ずしもエクスポートパケットはテンプレートレコードを含む必要はないが、コレクタはテンプレートレコードを保持しなければならない • テンプレートがないと、フローデータを解釈できない • エクスポーター側で何か変更(再起動や時計の変更)がなされた場合は、既存のテンプレートは全て破棄する • 新しいテンプレートレコードには、未使用のテンプレートIDがふられる
エクスポーターの動作 • 次の場合に(オプション)テンプレートが送信される • NetFlow処理部分が再起動した場合 • データ・フローセットと同時か、またそれ以前にテンプレート・フローセットを送信しなければならない • 設定が変更された場合 • できる限り速やかにテンプレート・フローセットを送信する必要がある 早急にテンプレートを送信しなければならないため、 この2つの場合はデータ・フローセットを含まずに パケットをエクスポートしてもよい
エクスポーターの動作 • テンプレート情報のリフレッシュ • 定期的に全ての(オプション)テンプレート・レコードを送信しなければならない • テンプレートには、一定の寿命を設定する • 一定個数のエクスポートパケット毎 • 時間ベースの寿命(○○分毎) • 時刻設定の変更時 • できる限りすばやくテンプレート定義を送信する必要がある
コレクタ側の動作 • コレクタ側の動作 • テンプレートが無いフローレコードを受け取った場合 • 保存しておき、テンプレートが届き次第デコードを行う • エクスポーターで時刻の設定が変更になった時 • そのエクスポーターに関連するテンプレートを全て破棄する必要がある • 新しいテンプレートを受け取った場合 • ただちに過去のテンプレートを上書きする
セキュリティ上の考慮点 • NetFlow v9は、エクスポーターとコレクターが単一のプライベートネットワーク上に存在すると過程 • 秘匿性や整合性、認証といった要求はプロトコルに課されていない • 現在、IPFIX(IP Flow Information eXport) というプロトコルが開発されている • NetFlow v9 のセキュリティ上の問題を考慮しているプロトコル • RFC3917参照
疑問点 • いくつかデータ長が可変のものがあったが、受信の際にサイズが違ったらどうなるのか? • 送信元MACアドレスは6バイト、など • エクスポーター側で時間設定が変更された場合、関連するテンプレートは全て破棄する必要がある • コレクターはそのタイミングをどうやって知るのか?
使用したプログラム • nfdump-1.5.2 • NetFlow のversion 5,7,9に対応 • NetFlowコレクタ • netflow_v9.c(nftdumpのnetflowのヴァージョン9への対応が書かれている部分)
データ長が違う場合は? • タイプごとに設定はされているが、テンプレートにデータ長も載せるため、別に違ってもそのまま受け付ける • 可変長のデータと、固定長のデータの扱いに差は無い for(i=0; i<count; i++ ) { field_type = ntohs(template->record[i].type) & 0x007f; // make sure field < 128 field_length = ntohs(template->record[i].length); input_template[field_type].offset = offset; input_template[field_type].length = field_length; offset += field_length;
参考にしたプログラム • エクスポーター側から送信される、時間に関するデータはSysUptimeとunix_secsの2つだけであるが、この二つに関する比較や操作は行われていなかった typedef struct netflow_v9_header { uint16_t version; uint16_t count; uint32_t SysUptime; uint32_t unix_secs; uint32_t sequence; uint32_t source_id; } netflow_v9_header_t;
テンプレートのリフレッシュ • では、テンプレートのリフレッシュのタイミングは? • エクスポートパケット数と時間の2種類があった if ( (record_count & 0xFFF) == 0 ) { // every 4096 flow records // terminate the current data flowset data_flowset = NULL; ・・・ ・・・ if ( now - template->time_sent > MAX_LIFETIME ) { // refresh template is needed ・・・ ・・・
テンプレートのリフレッシュ • エクスポーター側で時間設定が変更された場合、関連するテンプレートは全て破棄する必要がある • これは、テンプレート情報(エクスポーターIDや観測ドメイン情報など)を更新できるようにするため、とRFCには書かれている • エクスポーターIDの更新は、テンプレートを受け取る時(のみ)に毎回行われている
テンプレートのリフレッシュ void Process_v9_templates(exporter_domain_t *exporter, template_flowset_t *template_flowset) { template_record_t *template; ・・・ while (size_left) { ・・・ setup_translation_table(exporter, id, offset); size_left -= template_size; ・・・ } setup_translation_tableで、エクスポーターIDやテンプレートのテーブル を保存、追加している この関数が使われているのはこの部分のみ
結論 • 可変長のフローセットでなくても、データ長は変更できる • コレクタ側は、エクスポートさせるデータの意味を知る必要はない(数値だけであれば、受け取ることができる) • 時刻変更がされても、エクスポーター側でテーブルの変更はされない • 更新はテンプレートを受け取る際に行われ続けている上、指定された時間を過ぎたテーブルは使用されないため、問題は無い