Ich möchte ein Linux-Shell-Skript schreiben, das bestimmten Multicast-Verkehr erfasst. Speziell wie in möchte ich eine pcap-Datei erstellen, die den gesamten Datenverkehr für eine bestimmte Multicast-Gruppe / einen bestimmten Port enthält.
Hier ist die Befehlszeile, die ich zum Anzeigen des Datenverkehrs verwende:
tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234
Dies funktioniert einwandfrei, solange ich bereits ein Multicast-Abonnement für diese Gruppe eingerichtet habe. Wenn ich dies beispielsweise in einer anderen Konsole ausführe:
mdump 233.54.12.234 22001 10.13.252.51
tcpdump
wird Pakete sehen. Wenn mdump
nicht läuft, tcpdump
sieht nichts.
Gibt es eine Standard-Linux-Methode, um diese Multicast-Joins vor dem Starten der Captures einzurichten? Ich könnte mdump
diese Verknüpfungen verwenden, aber das scheint verschwenderisch, da mdump
all diese Daten in der Gruppe verarbeitet werden, aber ich werde sie einfach wegwerfen.
Beachten Sie, dass ich aufgrund meiner spezifischen Umgebung davon abgehalten wurde, die Benutzeroberfläche in den Promiscuous-Modus zu versetzen. Es kann in der Tat verboten sein.
quelle
-p
Flagge, in Standardversionen von tcpdump, schaltet Promiscuous - Modus aus , wie es auf der Standardeinstellung. Im Promiscuous-Modus sollte der gesamte Datenverkehr einschließlich des Multicast-Datenverkehrs angezeigt werden, unabhängig davon, ob Sie das Abonnement eingerichtet haben - es sei denn, Sie befinden sich in einem Switched-Netzwerk und das Abonnement muss eingerichtet sein, damit der Switch Ihnen den Datenverkehr weiterleitet.mdump
Ausführen in einer anderen Konsole)tcpdump
sieht man nichts.Antworten:
TL; DR - Wählen Sie eine aus:
sudo ip addr add 233.54.12.234/32 dev eth1 autojoin
socat STDIO UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 > /dev/null
Zuerst wollte ich sagen "benutze es einfach
ip maddress add
und sei fertig damit". Das Problemip maddress
betrifft nur Multicast-Adressen der Verbindungsschicht, keine Protokoll- Multicast-Adressen (man 8 ip-maddress
).Davon abgesehen macht die Verwendung der
autojoin
Flagge mit dem Adressverb den Trick einfach gut.Dies wirft jedoch einige nachfolgende Fragen auf. Ich gehe davon aus, dass Sie ausgeführt werden
tcpdump
odertshark
über Root-Berechtigungen verfügen. Für den Fall, dass Sie nicht 22001 ist ein Port mit hoher Nummer und andere Dienstprogramme wiesocat
werden auch Dinge erledigen.Nimm mein Wort nicht dafür. Um dies zu testen, können wir Multicast-UDP-Pakete mit
socat
oderncat
(im Allgemeinen übernmap
/ gepacktnmap-ncat
) generieren .Führen Sie auf einigen Hosts eine der folgenden zwei Kombinationen aus:
Option 1:
Option 2:
Die erste Option erfordert entweder root oder zumindest die Fähigkeit
CAP_NET_ADMIN
. Die zweite Option erfordert kein root, erwartet jedoch auch, dass sie im Vordergrund ausgeführt wird, und ist daher möglicherweise weniger förderlich für die Skripterstellung (obwohl das Verfolgen dertrap
untergeordneten Prozess-ID und das Bereinigen mit einem in BASH möglicherweise genau das ist, wonach Sie suchen.Sobald dies erledigt ist (aber bevor wir unseren
tcpdump
/tshark
Befehl testen ), stellen Sie sicher, dass der Kernel die Schnittstelle erkennt, die der richtigen IGMP-Gruppe beigetreten ist. Wenn du dich super schick fühlst, kannst du verrückt werden, wenn du das Hex auswählst/proc/net/igmp
, aber ich würde vorschlagen, einfach nur zu rennennetstat -gn
.Sobald Sie überprüft haben, dass die Schnittstelle die richtige Gruppe abonniert hat, starten Sie Ihren Befehl tcpdump:
Alternativ können Sie den
socat
obigen Befehl verwenden, um den Inhalt zu verbinden und zu wiederholen,STDOUT
indem Sie ihn ersetzen/dev/null
durchSTDOUT
:Verwenden Sie dann von einem anderen Computer aus eine der folgenden beiden Optionen, um einige einfache Testdaten zu senden:
Option 1:
Option 2:
Wenn Sie einen dieser Befehle ausführen, wartet er interaktiv auf die Eingabe. Geben Sie einfach einige Dinge ein, drücken Sie die Eingabetaste, um zu senden, und
CTRL+D
wenn Sie fertig sind, senden Sie eineEOF
Nachricht.Zu diesem Zeitpunkt sollten Sie einen End-to-End-Test gesehen und mit ein paar Befehlen das schlechteste und unsicherste Chat-System der Welt aufgebaut haben.
quelle