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:
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.
Hi,
leider wird beim Abschluss nicht alles nach STDERR geschrieben, aber es ist schon mal eine brauchbare Kürzung der Summary Zeilen.
Und da ich bei mir auch eth0:1 verwende, habe ich mal den Filter für die Interfaces erweitert: 😉
28c28
for interface in $(ifconfig | grep '^[a-z0-9]' | awk '{print $1}'i | sed "/:[0-9]/d")
30c30
tcpdump -l -i $interface -nn $@ | sed 's/^/[Interface:'"$interface"'] /' 2>/dev/null &
Danke für deine Ergänzungen Reiner 🙂
Mit deinem Einverständnis packe ich die Anpassungen in meinen Beitrag.
gerne…
Pingback (Kurzfassung): How to display interface in tcpdump output flow? – segmentfault
*saved my ass* 🙂
Danke!
man, u r awesome!
This is awesome!
but the output is not sorted by timestamp.
You are right. I have no good idea how to fix this though as all outputs are put together with tail
Your script helped me diagnose a problem after hours of frustration. I owe you a drink!
Glad it helped you! Have a great weekend
The timestamp problem might be caused by sed buffering the output; try adding `-u` to sed.
I did some changes to tidy the output:
# 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 $@ 2>&1 | sed ’s/^/[Interface:'“${BASH_REMATCH[0]:2}“‚] /‘ &
else
echo „$(date +’%F %T‘): Getting list of interfaces…“
ints=( $(tcpdump -D | gawk ‚!/^[0-9]+[.]any/{a=$1;sub(„^[0-9]+[.]“,““,a);print a}‘) )
echo „$(date +’%F %T‘): ints=${ints[@]}“
for interface in „${ints[@]}“; do
tcpdump -l -i „$interface“ -nn „$@“ 2>&1 \
| sed -u ‚/^$/d; /^tcpdump:/d; /^listening on/d; / packets\? \(captured\|received\|dropped\)/d; s/^/[Interface:'“$interface“‚] /‘ &
done
fi
# wait .. until CTRL+C
wait
sleep 1