FreeBSD Netgraph、トラフィックを考慮

例としてイーサネットトンネルを使用したNetgraph FreeBSD Netgraph核グラフサブシステムのトピックを続けて、Cisco netflowプロトコルを使用してトラフィックを計算してみましょう。



前回のレビューでは、ng_bridge、ng_ether、ng_ksocketモジュールに精通し、それらに基づいてインターネット上にイーサネットトンネルを構築しました。本日は、追加のnetgraphモジュールを使用してこのトンネルを通過するトラフィックを計算する方法を説明します。



ng_netflowモジュールを使用して、トラフィックを考慮します。



ウィキペディアは言う



Netflowは、ネットワーク内のIPトラフィックに関する情報を収集するために設計された、シスコが開発したプロトコルです。

シスコのルーターは、netflowコレクターと呼ばれる特別なノードに送信されるnetflowストリームを生成します。



ng_netflowはciscoルーターのふりをして、実際のcisco netflowをコレクターに送信します。 コレクターは、情報を収集し、フロー、IPアドレスごとにトラフィックをグループ化し、グラフを描画します。 実装に依存します。 試用版のnetflowアナライザー7.5を使用しました。



再びキューブについて



以下が必要です。



ng_netflow.gif

ng_netflow -cisco netflow protocol version 5を実装するNetgraph カーネルサブシステムモジュール。 Ng_netflowは、着信トラフィックを受信して​​識別し、アクティブなトラフィックフローのカウンターを作成します。 ストリームは、プロトコル、ポート番号、ToS、インターフェイスによって分解されます。 完成したストリームは、UDPデータグラムとしてNetflowコレクターに送信されます。 ストリームは完全であると見なされます:RSTまたはTCP FINパケットが受信された場合。 フローについても、ストリームが完了してコレクターに転送されるタイムアウトがあります。 アクティブなスレッドのタイムアウト-デフォルトでは1800秒。 また、非アクティブストリームのデフォルトのタイムアウトは15秒です。



Ng_netflowフックの名前はiface0、iface1、iface2、ifaceNです。 また、対応するout0、out1、out2、outN。 エクスポート統計エクスポートフック。



ifaceNの着信トラフィックは、アカウンティングモジュールによって処理されます。 対応するoutNフックが接続されている場合、トラフィックは変更されずに接続され、接続されていない場合、どこにも行きません。 outNフックに含まれるトラフィックは、ifaceNフックへの変更なしで、アカウンティングモジュールによる処理なしで行きます。 つまり、ifaceNの着信トラフィックのみが実際にカウンターに到達します。 トラフィックアカウンティングの動作を制御するための設定があります。これについては以下で説明します。 その結果、エクスポートフックを介して、UDP netflowデータグラムが出力されます。このキッチンは通常、ng_ksocketモジュールのinet / dgram / udpフックに接続されます。



モジュールが受信する制御メッセージは同じコマンドです:info、ifinfo、setdlt、setifindex、settimeouts、setconfig、show。 一部について説明し、残りについてはman ng_netflowで読みます。



Setdltは、ifaceNに接続されているインターフェイスのタイプを設定します。 可能なすべてのオプション(/usr/src/sys/net/bpf.h)



/*

* Data-link level type codes.

*/

#define DLT_NULL 0 /* BSD loopback encapsulation */

#define DLT_EN10MB 1 /* Ethernet (10Mb) */

#define DLT_EN3MB 2 /* Experimental Ethernet (3Mb) */

#define DLT_AX25 3 /* Amateur Radio AX.25 */

#define DLT_PRONET 4 /* Proteon ProNET Token Ring */

#define DLT_CHAOS 5 /* Chaos */

#define DLT_IEEE802 6 /* IEEE 802 Networks */

#define DLT_ARCNET 7 /* ARCNET */

#define DLT_SLIP 8 /* Serial Line IP */

#define DLT_PPP 9 /* Point-to-point Protocol */

#define DLT_FDDI 10 /* FDDI */

#define DLT_ATM_RFC1483 11 /* LLC/SNAP encapsulated atm */

#define DLT_RAW 12 /* raw IP */







イーサネットとベアIPのみがそれぞれオプション1と12でサポートされています。最初のオプションはデフォルトでインストールされます。 構文は「setdlt {iface = 0 dlt = 12}」です



Settimeouts-アクティブおよび非アクティブフローのタイムアウトを設定します。その後、統計がコレクターに送信されます。 構文は「settimeouts {inactive = 15 active = 1800}」です





ng_hub.gif

ng_hub-名前はネットワーク用語に由来します。 イーサネットハブは長い間どこでも使用されておらず、最新のスマートイーサネットスイッチとは異なり、2つの単純なアクションしか実行できませんでした。つまり、任意のインターフェイスでパケットを受信し、このパケットをすべてのインターフェイスに送信します。

このモジュールはまったく同じように機能します。 任意の名前の接続フックでデータを受信し、すべての接続フックを変更せずにこのデータを送信します。 制御メッセージを受け入れません。





outNフックを使用して、ng_netgraphを介してトラフィックを通過させませんが、ng_hubモジュールを使用して、トンネルを双方向に通過するトラフィックをコピーします。



グラフを作成します。



ethernet_over_udp_netflow_scheme.gif





古いものと比較して、新しいものの変更が表示されます:



1. ng_bridgeモジュールのlink2とng_ksocketモジュールのinet / dgram / udpの間のギャップに、新しいng_hubモジュールが挿入されます。

2.新しいng_netflowがng_hubに接続されます。

3. ng_netflowは、ng_ksocketモジュールの新しいコピーに接続され、これはnetflowコレクターに接続されます。



システムでグラフを収集します。



bsd2サーバー側では、変更を加える必要はありません。

bsd1サーバーでは、最初からすべてを収集します。



ng_bridgeノードを作成し、そのフック「link0」にネットワークインターフェイス「em1」「lower」のフックを接続します。

ngctl mkpeer em1:ブリッジ下位link0

新しく作成したノードに「switch」という名前を付けます。これは、「em1:lower」というパスにあります。

ngctl name em1:下位スイッチ

「スイッチ」上位ネットワークインターフェイス「em1」の「link1」に接続します。

ngctl connectスイッチ:em1:link1 upper

ng_hubノードを作成し、それをスイッチのlink2フックであるhublink0フックに接続します

ngctl mkpeerスイッチ:hub link2 hublink0

新しく作成されたノードに「hub」という名前を付けます。これは、パス「switch:link2」にあります。

ngctl nameスイッチ:link2ハブ

ng_ksocketノードを作成し、「ハブ」のフック「inet / dgram / udp」「hublink1」に接続します

ngctl mkpeerハブ:ksocket hublink1 inet / dgram / udp

新しく作成されたノードに「hub_socket」という名前を付けます。パス「hub:hublink1」にあります

ngctl name hub:hublink1 hub_socket

ng_netflowノードを作成し、「ハブ」のフック「iface0」「hublink2」に接続します

ngctl mkpeerハブ:netflow hublink2 iface0

新しく作成したノードに「netflow」という名前を付けます。これは、パス「hub:hublink2」にあります

ngctl name hub:hublink2 netflow

別のng_ksocketノードを作成し、そのフック「inet / dgram / udp」「netflow」によって作成された「export」に接続します

ngctl mkpeer netflow:ksocket export inet / dgram / udp

新しく作成されたノードに「netflow_socket」という名前を付けます。これはパス「netflow:export」にあります

ngctl name netflow:エクスポートnetflow_socket

パラメーターを指定して、bindコマンドをswitch_socketに送信します。 ksocketはIP 1.1.1.1でポート7777を使用します。

ngctl msg switch_socket:bind inet / 1.1.1.1:7777

パラメータを指定して「switch_socket」に「connect」コマンドを送信します。 ksocketは、IPアドレス2.2.2.2のポート7777に接続します。

ngctl msg switch_socket:接続inet / 2.2.2.2:7777

パラメータを指定して「connect」コマンドを「netflow_socket」に送信します。 ksocketは、IPアドレス3.3.3.3のポート9996に接続します。 NetFlowコレクターが存在する必要があります。

ngctl msg netflow_socket:connect inet / 3.3.3.3:9996

em1ネットワークインターフェイスのng_etherモジュールにコマンドを送信して、それ宛てではないパケットの盗聴モードに切り替えます。 結局のところ、仮想ネットワークにあるデバイスのパケットを受信する必要があります。

ngctl msg em1:setpromisc 1

ngctl msg em1:setautosrc 0



最終的なグラフアセンブリスクリプト:

#!/bin/sh

self=1.1.1.1

peer=2.2.2.2

collector=3.3.3.3:9996

port=7777

if=em1



case "$1" in

start)

echo "Starting netgraph switch."

ngctl mkpeer ${if}: bridge lower link0

ngctl name ${if}:lower switch

ngctl connect switch: ${if}: link1 upper

ngctl mkpeer switch: hub link2 hublink0

ngctl name switch:link2 hub

ngctl mkpeer hub: ksocket hublink1 inet/dgram/udp

ngctl name hub:hublink1 hub_socket

ngctl mkpeer hub: netflow hublink2 iface0

ngctl name hub:hublink2 netflow

ngctl mkpeer netflow: ksocket export inet/dgram/udp

ngctl name netflow:export netflow_socket

ngctl msg hub_socket: bind inet/${self}:${port}

ngctl msg hub_socket: connect inet/${peer}:${port}

ngctl msg netflow_socket: connect inet/${collector}

ngctl msg ${if}: setpromisc 1

ngctl msg ${if}: setautosrc 0

echo "Ok."

exit 0

;;

stop)

echo "Stopping netgraph switch."

ngctl shutdown netflow_socket:

ngctl shutdown netflow:

ngctl shutdown hub_socket:

ngctl shutdown hub:

ngctl shutdown switch:

ngctl shutdown ${if}:

echo "Ok."

exit 0

;;

restart)

sh $0 stop

sh $0 start

;;

*)

echo "Usage: `basename $0` { start | stop | restart }"

exit 64

;;

esac









結果を見てみましょう:

合計8つのノードがあります。



[root@bsd1] /root/> ngctl list

Name: em0 Type: ether ID: 00000001 Num hooks: 0

Name: em1 Type: ether ID: 00000002 Num hooks: 2

Name: switch Type: bridge ID: 000002c7 Num hooks: 3

Name: ngctl56729 Type: socket ID: 000002e1 Num hooks: 0

Name: hub_socket Type: ksocket ID: 000002ce Num hooks: 1

Name: hub Type: hub ID: 000002cb Num hooks: 3

Name: netflow_socket Type: ksocket ID: 000002d4 Num hooks: 1

Name: netflow Type: netflow ID: 000002d1 Num hooks: 2









トンネルを介してトラフィックを駆動した後、次のように見えます。

[root@bsd1] /root/> ngctl msg netflow: info

Rec'd response "info" (805306369) from "[2d1]:":

Args: { Bytes=1722435 Packets=13683 Records used=27 Active expiries=203 Inactive expiries=5566 Inactive timeout=15 Active timeout=1800 }









コレクターの統計を見るだけで、トンネルを通過するトラフィックを確認できます。



netflow_analyzer.png



終わり



トンネルでのトラフィックアカウンティングの実際の使用は疑わしいため、このようなグラフの収集は、サブシステムをさらに理解し、ニーズに合わせて既製のスキームを近代化するための例と考えることができます。



次の記事では、ng_netflowを介したトラフィックを考慮したより実用的な方法で、netgraphサブシステムとipfwの相互作用について説明します。



またね



All Articles