netflow は前から試してみたかったのだけれど、対応しているものを常設するのも億劫で手を出せていなかった。Linux 箱で組んで入れてみたものの、「ずっと動かすのもなー」とか「電源落ちたらネットワークも断だなー」とか考えて困っていた。そうしていたら、気が付いたらmirror ポート設定できるスイッチングハブが2000円台で買えるようになっていて、これ使えそう!
こんな感じに組んだ。
upstream
|
+-+-------------+
| TL-SG105E |
+-+-------+---+-+
| | |(mirror)
| | |
+-+--+ +-+---+-+
| PC | | Linux |
+----+ +-------+
upstream の ingress, egress を mirror ポートに出す設定を入れる。
Linux 側ではこれらを準備する。なお Linux はここでは Ubuntu 17 を使う。
データの流れは promisc interface -> ipt-NETFLOW
-> (netflow) -> nprobe
-> (zeromq) -> ntopng
のようになる。IPV6 対応させたいので netflow v10 であるとろの ipfix を使う。
interfaces
mirror に繋がっているインターフェースが ethX
だったとする。NetworkManager
にはミラーポートにパケットを流して欲しくないので、/etc/network/interfaces
管理にするなど対策を講じる。
auto ethX
iface ethX inet manual
pre-up ifconfig $IFACE up promisc
post-down ifconfig $IFACE down
ipt-NETFLOW
普通にやると Linux が upstream と通信したパケットもミラーされて送られてくるので、そのアドレスが再び解釈されて 127.0.0.1
に変換されたりする。これを防ぐために PREROUTING
チェーンで処理することになる。PREROUTING
で処理するためには ipt-NETFLOW は promisc オプションを有効にしてコンパイルしないといけないと README.promisc に書いてある。
net.ipv6.conf.ethX.disable_ipv6=1
options ipt_NETFLOW protocol=10 promisc=1
上記の kernel パラメータを有効にした後、netfilter の設定を入れる。module parameter はsysctl だと上手く反映されなかったりしたので、modprobe 時点で設定するようにしています(原因未調査)。
iptables -A PREROUTING -t raw -i ethX -j NETFLOW
ip6tables -A PREROUTING -t raw -i ethX -j NETFLOW
/etc/init.d/netfilter-persistent save
nprobe, ntopng
公式ドキュメント に従ってインストール。
nprobe
nprobe は少し癖がある。systemd
のファイルは用意されていない。いずれにせよ、collector モードで動作させるので、次のような設定ファイルを用意する。
-g /var/run/nprobe.pid
--collector-port 2055
-i none
-n none
--zmq tcp://127.0.0.1:1234
-V 10
/etc/nprobe/nprobe-none.start
という名前の空ファイルを用意しておくと、起動されるようになる。systemd の互換機能を使えば大丈夫。
$ systemctl enable nprobe
ntopng
ntopng は通常の systemd
ファイルで起動するようにできている。デフォルトの設定では、各 netdev を対象として分析を行うようになっている。今回は zeromq プロトコルで nprobe から受け取るので、次のように設定する。
--community
-G=/var/run/ntopng.pid
-i=tcp://127.0.0.1:1234
これも systemd から起動するようにしておく。
$ eystemctl enable ntopng