Sat, 14 May 2022 00:00:00 +0200
computernetz, netflow, nfdump, nfsen, sysadmin, troubleshoot

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.