Erstellen eines Multicast-Joins für tcpdump-Captures

10

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

tcpdumpwird Pakete sehen. Wenn mdumpnicht läuft, tcpdumpsieht nichts.

Gibt es eine Standard-Linux-Methode, um diese Multicast-Joins vor dem Starten der Captures einzurichten? Ich könnte mdumpdiese Verknüpfungen verwenden, aber das scheint verschwenderisch, da mdumpall 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.

John Dibling
quelle
1
Sofern Sie eine Nicht-Standard - Version von tcpdump laufen lassen , Sie sind Putting die Schnittstelle in der Promiscuous - Modus - die -pFlagge, 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.
1
@ GuyHarris: Danke für die Klarstellung. Ich bin in einem Switched Network. Ohne das bereits eingerichtete Abonnement (dh beim mdumpAusführen in einer anderen Konsole) tcpdumpsieht man nichts.
John Dibling
Und wenn sie nicht möchten, dass Sie im Promiscuous-Modus ausgeführt werden, möchten sie wahrscheinlich auch nicht, dass Sie (oder lassen Sie nicht einmal ) einen "gespiegelten Port" auf dem Switch einrichten (vorausgesetzt, der Switch unterstützt dies sogar) Kopien des gesamten Datenverkehrs über den Switch (oder des gesamten Datenverkehrs über bestimmte Ports, falls dies möglich ist).
Was ist also falsch daran, dies mit einem Skript zu tun? Was zählt ist, ob es die Arbeit erledigt, nicht ob jemand es "auf die übliche Weise" betrachtet - was ist "ungewöhnlich" an dem Skript?
Der Promiscious-Modus ist deaktiviert, da sich das Aktivieren anscheinend auf die anderen VMs auf dem Host auswirken würde. Das ist unerwünscht. Ich kann einen gespiegelten Port am Switch einrichten - das sind 40-GB-Aristas -, aber ich bin mir nicht sicher, ob ich Ihren Standpunkt verstehe.
John Dibling

Antworten:

5

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 addund sei fertig damit". Das Problem ip maddressbetrifft nur Multicast-Adressen der Verbindungsschicht, keine Protokoll- Multicast-Adressen ( man 8 ip-maddress).

Davon abgesehen macht die Verwendung der autojoinFlagge mit dem Adressverb den Trick einfach gut.

Dies wirft jedoch einige nachfolgende Fragen auf. Ich gehe davon aus, dass Sie ausgeführt werden tcpdumpoder tsharküber Root-Berechtigungen verfügen. Für den Fall, dass Sie nicht 22001 ist ein Port mit hoher Nummer und andere Dienstprogramme wie socatwerden auch Dinge erledigen.

Nimm mein Wort nicht dafür. Um dies zu testen, können wir Multicast-UDP-Pakete mit socatoder ncat(im Allgemeinen über nmap/ gepackt nmap-ncat) generieren .

Führen Sie auf einigen Hosts eine der folgenden zwei Kombinationen aus:

Option 1:

sudo ip addr add 233.54.12.234/32 dev eth1 autojoin

Option 2:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1 /dev/null &

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 der trapuntergeordneten 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/ tsharkBefehl 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 rennen netstat -gn.

Sobald Sie überprüft haben, dass die Schnittstelle die richtige Gruppe abonniert hat, starten Sie Ihren Befehl tcpdump:

tcpdump -nnXs 0 -i eth1 udp port 22001 and dst 233.54.12.234

Alternativ können Sie den socatobigen Befehl verwenden, um den Inhalt zu verbinden und zu wiederholen, STDOUTindem Sie ihn ersetzen /dev/nulldurch STDOUT:

socat -u UDP4-RECV:22001,ip-add-membership=233.54.12.234:eth1

Verwenden Sie dann von einem anderen Computer aus eine der folgenden beiden Optionen, um einige einfache Testdaten zu senden:

Option 1:

socat STDIO UDP-DATAGRAM:233.54.12.234:22001

Option 2:

ncat  -u 233.54.12.234 22001

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+Dwenn Sie fertig sind, senden Sie eine EOFNachricht.

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.

Brian Redbeard
quelle
1
Wow, es hat 4 Jahre gedauert, um eine Antwort zu bekommen! Ich mache das nicht einmal mehr und habe wirklich keine Möglichkeit zu testen, aber ich werde es trotzdem akzeptieren.
John Dibling
1
Kommt gerade jetzt praktisch! : D Danke Brian :)
Quaylar