EN JA
NG_NETFLOW(4)
NG_NETFLOW(4) FreeBSD Kernel Interfaces Manual NG_NETFLOW(4)

名称

ng_netflowCisco の NetFlow 実装

書式

#include < sys/types.h>
#include < netinet/in.h>
#include < netgraph/netflow/ng_netflow.h>

解説

ng_netflow ノードは、 FreeBSD で実行されるルータで Cisco の NetFlow エクスポートプロトコルを実装します。 ng_netflow ノードは、着信トラフィックを listen (接続を受け付け) し、それのユニークなフローを識別します。フローは、終点 IP アドレス、TCP/UDP ポート番号、ToS、および入力インタフェースによって区別されます。期限が切れたフローは、NetFlow バージョン 5/9 UDP データグラムのノードからエクスポートされます。期限切れの理由は、次の 1 つを指定できます:
  • RST または FIN TCP セグメント。
  • アクティブなタイムアウト。フローは、指定された期間より長く生存できません。デフォルトは、1800 秒 (30 分) です。
  • アクティブでないタイムアウト。フローは、指定された期間にアクティブでありませんでした。デフォルトは、15 秒です。

ノードは、(NetFlow v9 専用の) IPv6 アカウンティングをサポートし、複数の fib を気付いています。異なった fib は、NetFlow V9 の異なった domain_id と NetFlow V5 の異なった engine_id にマップされます。

フック

このノードタイプは、 iface0, iface1 などの名前が付けられた NG_NETFLOW_MAXIFACES フック (デフォルトは、65536) と out0, out1 などの名前が付けられたフックの同じ数、さらに次の 2 つの export までをサポートします: (NetFlow バージョン 5 のための) export と (NetFlow バージョン 9 のための) export9 です。すべてのサポートされた export フックのために同時に export を行うことができます。デフォルトで (有効にされた ingress NetFlow) ノードは、 iface* フックで受信されたデータの NetFlow アカウンティングを行います。対応する out フックが接続されているなら、変更されていないデータは、迂回され、そうでなければ、データは、解放されます。データが out フックで受信されたなら、なんの処理なしで対応する iface フックに迂回されます (デフォルトで無効にされた egress NetFlow)。 export プロトコルのための完全な export データグラムが構築されるとき、それは、 export または export9 フックに送信されます。通常操作では、1 つ (または複数) の export フックは、 ng_ksocket(4) ノードの inet/dgram/udp フックに接続されます。

コントロールメッセージ

このノードタイプは、次を加えて、一般的なコントロールメッセージをサポートします:
NGM_NETFLOW_INFO ( info)
struct ng_netflow_info 中のいくつかのノード統計値と現在のタイムアウト値を返します。
NGM_NETFLOW_IFINFO ( ifinfo)
iface N フックに関する情報を返します。フック番号は、引数として渡されます。
NGM_NETFLOW_SETDLT ( setdlt)
iface N フックのデータリンクタイプを設定します。現在、サポートされているタイプは、 DLT_RAW (生の IP データグラム) と DLT_EN10MB (イーサネット) です。 < net/bpf.h> ヘッダで DLT_ 定義を見つけることができます。現在、使用される値は、 DLT_EN10MB のための 1 と DLT_RAW のための 12 です。このメッセージタイプは、引数として struct ng_netflow_setdlt を使用します:

struct ng_netflow_setdlt { 
 uint16_t iface;  /* どのインタフェースが dlt 
       を変更したか */ 
 uint8_t  dlt;  /* bpf.h からの DLT_XXX */ 
};

要求された ifaceN フックは、前もって接続されていなければなりません。そうでなければ、メッセージ送信操作は、エラーで返ります。

NGM_NETFLOW_SETIFINDEX ( setifindex)
ある場合には、 ng_netflow は、パケットの入力インタフェースインデックスを決定することができないかもしれません。トラフィックがシステムインタフェースの入力キューに来る前に ng_netflow ノードに入るなら、これは、起こるかもしれません。そのようなセットアップの例は、同期データラインと ng_iface(4)間の トラフィックの取得です。この場合、入力インデックスは、与えられたフックと関係があるべきです。インタフェースのインデックスは、ユーザランドからの if_nametoindex(3) を通して決定することができます。このメッセージは、引数として struct ng_netflow_setifindex を必要とします:

struct ng_netflow_setifindex { 
 uint16_t iface;  /* どのインタフェースが index 
       を変更したか */ 
 uint16_t index;  /* 新しいインデックス */ 
};

要求された ifaceN フックは、前もって接続されていなければなりません。そうでなければ、メッセージ送信操作は、エラーで返ります。

NGM_NETFLOW_SETTIMEOUTS ( settimeouts)
NetFlow のアクティブ/インアクティブタイムアウトのための値を秒単位で設定します。このメッセージは、引数として struct ng_netflow_settimeouts を必要とします:

struct ng_netflow_settimeouts { 
 uint32_t inactive_timeout; /* フロー不活発なタイプアウト */ 
 uint32_t active_timeout; /* フロー活発なタイムアウト */ 
};
NGM_NETFLOW_SETCONFIG ( setconfig)
指定されたインタフェースを設定します。このメッセージは、引数として struct ng_netflow_setconfig を必要とします:

struct ng_netflow_setconfig { 
 uint16_t iface;  /* どのインタフェースが config 
                            を変更したか */ 
 uint32_t conf;  /* 新しい設定 */ 
#define NG_NETFLOW_CONF_INGRESS  1 
#define NG_NETFLOW_CONF_EGRESS  2 
#define NG_NETFLOW_CONF_ONCE  4 
#define NG_NETFLOW_CONF_THISONCE 8 
#define NG_NETFLOW_CONF_NOSRCLOOKUP 16 
#define NG_NETFLOW_CONF_NODSTLOOKUP 32 
};

設定は、いくつかのオプションのビットマスクです。デフォルトで有効にされた、オプション NG_NETFLOW_CONF_INGRESS は、 (ifaceX フックから来るデータのために) ingress NetFlow 生成を有効にします。オプション NG_NETFLOW_CONF_EGRESS は、(outX フックから来るデータのために) egress NetFlow を有効にします。オプション NG_NETFLOW_CONF_ONCE は、パケットが、netflow ノードを通して数回渡されるなら、一度だけアカウントされるべきであるであることを定義します。オプション NG_NETFLOW_CONF_THISONCE は、パケットが、正確にこの netflow ノードを通して数回渡されるなら、一度だけアカウントされるべきであるであることを定義します。これらの 2 つのオプションは、ingress と egress NetFlow の両方が、有効にされるとき、重複してアカウントすることを避けるために重要です。オプション NG_NETFLOW_CONF_NOSRCLOOKUP は、ネットワークマスクに書き込むために使用されるフローソースアドレスでラディックス (radix) 検索をスキップします。オプション NG_NETFLOW_CONF_NODSTLOOKUP は、(egress インタフェース ID、宛先マスクとゲートウェイを書き込む) 宛先でラディックス (radix) 検索をスキップします。検索によって提供されたデータを必要とされないなら、ルータのロードを削減するために、それらを無効にすることができます。

NGM_NETFLOW_SETTEMPLATE ( settemplate)
(NetFlow v9 特有の) データフローテンプレートをアナウンスするために様々なタイムアウトを設定します。このメッセージは、引数として struct ng_netflow_settemplate を必要とします:

struct ng_netflow_settemplate { 
 uint16_t time;  /* アナウンスの間の最大時間 */ 
 uint16_t packets; /* アナウンスの間の最大パケット */ 
};

time フィールドの値は、データテンプレートを再アナウンスするために秒単位の時間で表します。 packets フィールドの値は、再アナウンスのデータテンプレートの間の最大のパケットカウントを表します。

NGM_NETFLOW_SETMTU ( setmtu)
(NetFlow v9 特有の) 指定されたサイズのパケットを構築するためにエクスポートインタフェース MTU を設定します。このメッセージは、引数として struct ng_netflow_setmtu を必要とします:

struct ng_netflow_setemtu { 
 uint16_t mtu;  /* パケットの MTU */ 
};

デフォルトは、1500 バイトです。

NGM_NETFLOW_SHOW
このコントロールメッセージは、フローキャッシュの全体の内容をダンプするようにノードに要求します。それは、直接 ngctl(8) から呼び出されるのではなく、 flowctl(8) から呼び出されます。
NGM_NETFLOW_V9INFO ( v9info)
struct ng_netflow_v9info のいくつかの NetFlow v9 に関連する値を返します。

struct ng_netflow_v9info { 
    uint16_t        templ_packets;  /* v9 テンプレートパケット */ 
    uint16_t        templ_time;     /* v9 テンプレート時間 */ 
    uint16_t        mtu;            /* v9 MTU */ 
};

シャットダウン

このノードは、 NGM_SHUTDOWN コントロールメッセージを受け取るか、すべてのフックが切断されている時、シャットダウンします。

使用例

最も簡単な可能な設定は、フロー収集が有効にされるところで一つのイーサネットインタフェースです。

/usr/sbin/ngctl -f- <<-SEQ 
 mkpeer fxp0: netflow lower iface0 
 name fxp0:lower netflow 
 connect fxp0: netflow: upper out0 
 mkpeer netflow: ksocket export inet/dgram/udp 
 msg netflow:export connect inet/10.0.0.1:4444 
SEQ

これは、2 の NetFlow が有効なされたインタフェース fxp0ng0 があるルータのより複雑な例です。この例の ng0: ノードは、 ng_tee(4) に接続されることに注意してください。後者は、パケットを解析して解放する、IP パケットのコピーを利用者に送信します。 fxp0: に関して: 利用者は、tee を使用しませんが、パケットをいずれかのノードに送り返します。

/usr/sbin/ngctl -f- <<-SEQ 
 # ng0 の tee を iface0 フックに接続 
 mkpeer ng0:inet netflow right2left iface0 
 name ng0:inet.right2left netflow 
 # DLT を raw モードに設定 
 msg netflow: setdlt { iface=0 dlt=12 } 
 # インタフェースインデックスを設定 (この例の 5) 
 msg netflow: setifindex { iface=0 index=5 } 
 
 # fxp0: を iface1 と out1 フックに接続 
 connect fxp0: netflow: lower iface1 
 connect fxp0: netflow: upper out1 
 
 # export フックに ksocket ノード作成し、適切な宛先に 
 # export を送信するためにそれを設定します 
 mkpeer netflow: ksocket export inet/dgram/udp 
 msg netflow:export connect inet/10.0.0.1:4444 
SEQ

関連項目

netgraph(4), setfib(2), ng_ether(4), ng_iface(4), ng_ksocket(4), ng_tee(4), flowctl(8), ngctl(8) B. Claise, Ed, Cisco Systems NetFlow Services Export Version 9, RFC 3954.

http://www.cisco.com/en/US/docs/ios/solutions_docs/netflow/nfwhite.html

作者

ng_netflow ノードタイプは、 Gleb Smirnoff <glebius@FreeBSD.org>, Alexander Motin <mav@FreeBSD.org>, Alexander Chernikov <melifaro@ipfw.ru>によって書かれました。初期のコードは、 Roman V. Palagin <romanp@unshadow.net>によって書かれた ng_ipacct に基づいていました。

バグ

NGM_NETFLOW_SHOW コマンドで得られるキャッシュスナップは、厳しい負荷の下でエントリのいくらかの割合で欠けるかもしれません。

ng_netflow ノードタイプは、AS 番号に入れられません。これは、カーネルルーティングテーブルで必要な情報が不足しているためです。しかしながら、この情報は、 GNU Zebra のようなルーティングデーモンからのカーネルに注入することができます。この機能は、今後のリリースで利用可能になるかもしれません。

December 10, 2012 FreeBSD