Anydump ist ein tcpdump-Wrapper und bietet die Möglichkeit tcpdump auf allen Interfaces auszuführen ohne den Überblick über die Herkunft der einzelnen Ereignisse zu verlieren.
Möchte man auf seinem System auf allen Netzwerk-Interfaces gleichzeitig einen tcpdump ausführen, so nutzt man tcpdump -i any. Soweit so langweilig.
Tcpdump ist in seiner Funktion auf Firewalls leider in einer gewissen Art eingeschränkt. Denn sobald mehrere Interfaces belauscht werden, ist es nicht mehr bestimmbar, welches Interface den Traffic gesehen hat. Das Problem wurde hier auch schon beschrieben. Da wir auf der Arbeit oft diese Art von tcpdumps nutzen, wollte ich eine Möglichkeit implementieren, um genau die fehlende Information anzuzeigen. Dabei ist folgendes raus gekommen:
[pastacode lang=“bash“ message=“Anydump 1.3″ highlight=““ provider=“manual“]
#!/bin/sh
#===================================================================================
#
# FILE: dump.sh
# USAGE: dump.sh [-i interface] [tcpdump-parameters]
# DESCRIPTION: tcpdump on any interface and add the prefix [Interace:xy] in front of the dump data.
# OPTIONS: same as tcpdump
# REQUIREMENTS: tcpdump, sed, ifconfig, kill, awk, grep, posix regex matching
# BUGS: ---
# FIXED: - In 1.0 The parameter -w would not work without -i parameter as multiple tcpdumps are started.
# - In 1.1 VLAN's would not be shown if a single interface was dumped.
# - In 1.3 Some fixes for virtual interfaces have been provided by Reiner Keller. (Thanks!)
# NOTES: ---
# - 1.2 git initial
# AUTHOR: Sebastian Haas
# VERSION: 1.2
# CREATED: 16.09.2014
# REVISION: 22.09.2014
#
#===================================================================================
# When this exits, exit all background processes:
trap 'kill $(jobs -p) &> /dev/null && sleep 0.2 && echo ' EXIT
# Create one tcpdump output per interface and add an identifier to the beginning of each line:
if [[ $@ =~ -i[[:space:]]?[^[:space:]]+ ]]; then
tcpdump -l $@ | sed 's/^/[Interface:'"${BASH_REMATCH[0]:2}"'] /' &
else
for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}'i | sed "/:[0-9]/d")
do
tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"'] /' 2>/dev/null &
done
fi
# wait .. until CTRL+C
wait
[/pastacode]
Das Skript ruft alle Interfaces per ifconfig auf und startet für jedes Interface einen tcpdump mit den gegebenen Parametern.
Alle Ausgaben werden per sed mit einem Interface-Identifier-Präfix ausgestattet und auf der Shell ausgegeben.
Es ist möglich die meisten Parameter von tcpdump zu verwenden und auch der Modus, ein einzelnes Interace zu monitoren, wird unterstützt. Das ist nötig, falls man vor hat einen Alias für Anydump anzulegen.
Es ist noch nicht alles perfekt, aber soweit funktionieren alle Funktionen.
Ich würde mich sehr über Verbesserungsvorschläge freuen. Vielleicht hat ja auch jemand eine Idee, wie man die multiblen Zusammenfassungen beim beenden des Dumps in den Griff bekommt.