TCP / IP- und UDP-Captures können mit tcpdump
/ erstellt dumpcap
und eine pcap / pcapng-Datei erstellt werden, die zur weiteren Analyse an Wireshark gesendet werden kann. Gibt es ein ähnliches Tool für benannte Unix-Domain-Sockets? (Eine allgemeine Lösung, die für abstrakte Sockets funktioniert, wäre aber auch nett.)
strace
Ist dies nicht ausreichend, ist es nicht einfach, nach Unix-Domain-Sockets-E / A zu filtern. Ein Proxy unter Verwendung socat
oder ähnlichem ist ebenfalls nicht geeignet, da das Ziel eine passive Analyse für vorhandene offene Programme ist.
Wie kann ich eine Paketerfassung erhalten, die ich in Wireshark zur Analyse verwenden kann? Beispielprotokollanwendungen sind X11 (Xorg, meine aktuelle Anwendung) und cURL / PHP (HTTP). Ich habe eine CONFIG_UNIX_DIAG
Option im Linux-Kernel gesehen. Ist dies von Nutzen?
quelle
-nolisten tcp
, gibt es keinen TCP-Socket. Wenn alles fehlschlägt, werde ich wahrscheinlich wieder auf xscope oder Ihren ordentlichen Trick mit strace + text2pcap zurückgreifen. Ich würde mich trotzdem für ein generisches Unix-Socket-Capture interessieren (nur für Daten, nicht für Seitenkanaldaten).Antworten:
Ab Linux-Kernel v4.2-rc5 ist es nicht möglich, direkt über die von libpcap verwendeten Schnittstellen zu erfassen. libpcap verwendet die Linux-spezifische
AF_PACKET
(Alias-PF_PACKET
) Domäne, mit der Sie nur Daten für Daten erfassen können, die über ein " Netzgerät " (z. B. Ethernet-Schnittstellen) übertragen werden.Es gibt keine Kernel-Schnittstelle zum Aufzeichnen von
AF_UNIX
Sockets. Standard-Ethernet-Captures haben einen Ethernet-Header mit Quelle / Ziel usw. Unix-Sockets haben keinen solchen gefälschten Header, und in der Registrierung für Link-Layer-Headertypen sind keine diesbezüglichen Informationen aufgeführt.Die grundlegenden Einstiegspunkte für Daten sind
unix_stream_recvmsg
undunix_stream_sendmsg
fürSOCK_STREAM
(SOCK_DGRAM
undSOCK_SEQPACKET
haben ähnlich benannte Funktionen). Daten werden insk->sk_receive_queue
und in derunix_stream_sendmsg
Funktion zwischengespeichert , es gibt keinen Code, der letztendlich zum Aufrufen dertpacket_rcv
Funktion für Paketerfassungen führt. In dieser Analyse von osgx zu SO finden Sie weitere Informationen zu den Interna der Paketerfassung im Allgemeinen.Zurück zur ursprünglichen Frage zur
AF_UNIX
Socket-Überwachung: Wenn Sie hauptsächlich an Anwendungsdaten interessiert sind, haben Sie einige Möglichkeiten:strace
und erfassen Sie mögliche Systemaufrufe, die E / A-Vorgänge ausführen. Es gibt viele von ihnen,read
,pread64
,readv
,preadv
,recvmsg
und vieles mehr ... Siehe @ Stéphane Chazelas Beispiel fürxterm
. Nachteil dieses Ansatzes ist, dass Sie zuerst Ihren Dateideskriptor finden müssen und dann möglicherweise immer noch Systemaufrufe verpassen. Mit strace können Sie-e trace=file
für die meisten von ihnen (pread
wird nur von-e trace=desc
, aber wahrscheinlich nicht von den meisten Programmen für Unix-Sockets verwendet).unix_stream_recvmsg
,unix_stream_sendmsg
(oderunix_dgram_*
oderunix_seqpacket_*
) im Kernel und gibt die Daten, irgendwo. Sie können SystemTap zum Festlegen solcher Tracepunkte verwenden. Hier ist ein Beispiel zum Überwachen von ausgehenden Nachrichten. Erfordert Kernel-Unterstützung und Verfügbarkeit von Debugging-Symbolen .Aktiv (funktioniert nur bei neuen Prozessen):
Verwenden Sie einen Proxy, der auch Dateien schreibt. Sie könnten selbst einen schnellen Multiplexer schreiben oder so etwas hacken, das auch einen pcap ausgibt (achten Sie auf die Einschränkungen, z. B.
AF_UNIX
können Sie Dateideskriptoren übergeben,AF_INET
können Sie nicht):Die vorgeschlagene
CONFIG_UNIX_DIAG
Option ist hier leider auch nicht hilfreich, sie kann nur zum Sammeln von Statistiken und nicht zum Erfassen von Echtzeitdaten im Fluss verwendet werden (siehe linux / unix_diag.h ).Leider gibt es im Moment keine perfekten Tracer für Unix-Domain-Sockets, die nach meinem besten Wissen pcaps produzieren. Im Idealfall gibt es ein libpcap-Format mit einem Header, der die Quell- / Ziel-PID (sofern verfügbar), gefolgt von optionalen zusätzlichen Daten (Anmeldeinformationen, Dateideskriptoren) und schließlich die Daten enthält. Ist dies nicht der Fall, ist das beste, was getan werden kann, das Syscall-Tracing.
Zusätzliche Informationen (für den interessierten Leser), hier einige Backtraces (erworben mit GDB
unix_stream_*
undrbreak packet.c:.
Linux in QEMU und socat on mainline Linux 4.2-rc5):quelle
Ich habe ein Tool geschrieben , um Unix-Domain-Socket-Verkehr zu erfassen und zu sichern. Es wird verwendet
bpf/kprobe
, um die Kernelfunktion zu testenunix_stream_sendmsg
und den Datenverkehr in den Benutzerbereich zu verschieben.Das Tool ist abhängig von
bcc
, daher müssen Sie esbcc
zuerst installieren .Ein Beispiellauf:
quelle