NetFlow mit nfdump und NfSen
Nachdem ich vor kurzem die Vorteile von NetFlow für die Arbeit als Netzwerk-Administrator geschildert habe, komme ich in diesem Artikel zum praktischen Teil, dem Aufsetzen eines NetFlow-Kollektors mit nfdump und NfSen.
Prinzipiell reicht nfdump aus, wenn ich die NetFlow-Daten nur sammeln und durchsuchen oder automatisch auswerten will. NfSen bietet jedoch eine webbasierte Oberfläche, die vorteilhaft ist für schnelle Auswertungen.
Nfdump aufsetzen
Nfdump wird aktiv gepflegt, in den Linux-Distributionen gibt es relativ aktuelle Pakete, doch das auf GitHub erhältliche Release enthält einige Korrekturen, die ich mir nicht entgehen lassen will. Ich installiere daher nfdump, genauso wie anschließend NfSen, aus den Quellen, weil ich die Entwicklerwerkzeuge für letzteres sowieso benötige.
Als Plattform verwende ich Debian 11, bei anderen Plattformen heißen die Pakete mit den Werkzeugen und Bibliotheken eventuell anders.
Zunächst installiere ich die Entwicklerwerkzeuge sowie die für die Kompilierung benötigten Bibliotheken.
$ sudo apt update
$ sudo apt install build-essential autoconf libtool pkg-config
$ sudo apt install rrdtool mrtg librrds-perl librrdp-perl librrd-dev \
libmailtools-perl php bison flex libbz2-dev stow
Nachdem ich alle Werkzeuge und Bibliotheken habe, hole ich die Quellen und packe sie aus. Während ich an diesem Text schreibe, ist das letzte Release von nfdump 1.6.24.
$ wget https://github.com/phaag/nfdump/archive/refs/tags/v1.6.24.tar.gz
$ tar xvzf v1.6.24.tar.gz
Ich wechsle in das Verzeichnis,
erzeuge das configure
Skript
und schaue mir die Optionen für die Kompilierung an.
$ cd nfdump-1.6.24
$ ./autogen.sh
$ ./configure --help # optional, shows the build settings available
...
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
...
--enable-devel compile debug and development code into nfdump; default is NO
--enable-nsel compile nfdump, to read and process ASA/NSEL/NEL event data; default is NO
--enable-jnat compile nfdump, to read and process Junos NAT event logging; default is NO
--enable-nel (depricated) compile nfdump, to read and process NAT/NSEL/NEL event data; default is NO
--enable-fixtimebug enable code for swap time bug of some v5 exporters; default is NO
--enable-ftconv Build the flow-tools to nfdump converter; default is NO
--enable-nfprofile Build nfprofile used by NfSen; default is NO
--enable-influxdb enable stats to influxdb (default is no)
--enable-nftrack Build nftrack used by PortTracker; default is NO
--enable-sflow Build sflow collector sfcpad; default is NO
--enable-readpcap Build nfcapd collector to read from pcap file instead of network data; default is NO
--enable-nfpcapd Build nfpcapd collector to create netflow data from interface or pcap data; default is NO
...
Von den Optionen sind --prefix
, --enable-nfprofile
und --enable-nftrack
für NfSen wichtig.
Mit diesen konfiguriere ich das Verzeichnis,
übersetze und installiere nfdump.
$ ./configure --enable-nfprofile --enable-nftrack \
--prefix=/usr/local/stow/nfdump-1.6.24
$ make
$ sudo make install
$ cd /usr/local/stow
$ sudo stow nfdump-1.6.24
Die Option --prefix
beim Konfigurieren
und der Aufruf von stow
nach der Installation
erlauben mir,
verschiedene Versionen von nfdump gleichzeitig auf dem System zu halten
und relativ schnell zwischen diesen zu wechseln.
Da nfdump aktiv entwickelt wird,
will ich mir die Möglichkeit zum Upgrade so einfach wie möglich halten.
Testen
Zum Testen lege ich ein temporäres Verzeichnis an, starte nfcapd über diesem Verzeichnis und richte eine NetFlow-Probe auf Port 9996/udp an diesem Rechner.
$ sudo mkdir /tmp/nfcap-test
$ sudo nfcapd -E -p 9996 -l /tmp/nfcap-test/
Habe ich noch keine NetFlow-Probe, kann ich eine auf meinem Rechner einrichten und für Netzverkehr sorgen. Als Probe eignen sich zum Beispiel fprobe oder softflowd, die ich in der Paketverwaltung finde. In einem späteren Artikel gehe ich auf verschiedene Proben für NetFlow ein.
Nach etwa 10 Minuten breche ich den nfcapd
-Prozess ab
und kann mit nfdump
die Dateien anschauen.
Diese enthalten das Datum und die Uhrzeit im Dateinamen,
ich muss also zunächst mit ls
nach dem aktuellen Namen schauen.
$ nfdump -r /tmp/nfcap-test/nfcapd.202205031625
Date first seen Duration Proto Src IP Addr:Port Dst IP Addr:Port Packets Bytes Flows
2022-05-03 16:26:21.233 0.000 ICMP 10.0.2.15:0 -> 1.1.1.1:8.0 1 56 1
2022-05-03 16:26:21.249 0.000 ICMP 1.1.1.1:0 -> 10.0.2.15:0.0 1 56 1
2022-05-03 16:26:22.257 0.000 ICMP 10.0.2.15:0 -> 1.1.1.1:8.0 1 56 1
2022-05-03 16:26:22.272 0.000 ICMP 1.1.1.1:0 -> 10.0.2.15:0.0 1 56 1
2022-05-03 16:27:07.745 0.000 ICMP6 fe80::a..39:460b.0 -> ff02::2.133.0 1 16 1
2022-05-03 16:26:03.428 0.000 TCP 10.0.2.2:34584 -> 10.0.2.15:22 2 40 1
2022-05-03 16:26:03.427 0.000 TCP 10.0.2.15:22 -> 10.0.2.2:34584 2 152 1
2022-05-03 16:26:29.231 50.601 TCP 10.0.2.15:38732 -> 192.168.1.254:22 84 5470 1
2022-05-03 16:26:29.232 50.600 TCP 192.168.1.254:22 -> 10.0.2.15:38732 84 14847 1
Summary: total flows: 9, total bytes: 20749, total packets: 177, avg bps: 2172, avg pps: 2, avg bpp: 117
Time window: 2022-05-03 16:26:03 - 2022-05-03 16:27:19
Total flows processed: 9, Blocks skipped: 0, Bytes read: 696
Sys: 0.004s flows/second: 2177.1 Wall: 0.003s flows/second: 2627.7
Damit ist nfdump einsatzbereit und ich kann mich der Installation von NfSen zuwenden.
NfSen
Für NfSen gibt es keine fertigen Pakete bei Debian 11, ich muss es aus den Quellen installieren. Diese bekomme ich von SourceForge.
$ wget https://downloads.sourceforge.net/project/nfsen/stable/nfsen-1.3.8/nfsen-1.3.8.tar.gz
$ tar xzf nfsen-1.3.8.tar.gz
Nach dem Download und Auspacken wechsle ich in das Verzeichnis und kopiere die Konfigurationsdatei an die richtige Stelle.
$ cd nfsen-1.3.8/
$ cp etc/nfsen-dist.conf etc/nfsen.conf
$ vi etc/nfsen.conf
Diese Datei ist so noch nicht einsatzfähig. Die folgenden Variablen muss ich mindestens anpassen:
$BASEDIR = "/var/nfsen";
$WWWUSER = 'www-data';
$WWWGROUP = 'www-data';
# Receive buffer size for nfcapd - see man page nfcapd(1)
%sources=(
'sensor1' => {'port'=>'9995','col'=>'#0000ff','type'=>'netflow'},
);
$HTMLDIR = "/var/www/html/nfsen/";
Die Bedeutung der Variablen erschließt sich aus der Handbuchseite,
die ich nach der Installation mit man nfsen.conf
einsehen kann.
Als nächstes lege ich einen Benutzer für NfSen an, der Mitglied in der Gruppe des Webservers sein muss.
$ sudo useradd -d /var/nfsen -G www-data -m -s /bin/false netflow
Nun könnte ich NfSen bereits installieren. Das würde allerdings fehlschlagen, weil NfSen nicht so aktiv weiterentwickelt wird wie nfdump. Mit einem Patch nehme ich ein paar geringfügige Änderungen an den Quellen vor, um NfSen unter Debian 11 zu installieren. Diesen Patch spiele ich im Quellverzeichnis von NfSen wie folgt ein:
$ patch -p1 < ../nfsen-1.3.8.patch.txt
Beim Installieren muss ich das aktuelle Verzeichnis in den Suchpfad aufnehmen (-I.
),
weil das Installationsskript selbst
einige Bibliotheken aus dem Verzeichnis libexec verwendet
und diese nur so findet.
$ sudo perl -I. install.pl etc/nfsen.conf
NfSen wird nicht so aktiv entwickelt wie nfdump,
so dass ich mir hier den Zwischenschritt mit stow
erspare.
Als letztes sorge ich dafür, das NfSen beim Systemstart automatisch anläuft.
$ sudo ln -s /var/nfsen/bin/nfsen /etc/init.d/nfsen
$ sudo update-rc.d nfsen defaults 20
$ sudo service nfsen start
$ ps auxwww | grep nfcap
Damit habe ich einen laufenden Kollektor für NetFlow-Daten, die ich von den Sonden im Netzwerk dorthin senden kann. Etwa 10 Minuten nach dem eine neue Sonde aufgenommen wurde, sollten ihre Daten zu sehen sein.
Posted 2022-05-14