GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Sniff-UNIX-Domain-Socket

Ja, das können Sie tun. Alles, was Sie brauchen, ist systemtap.

Betrachten Sie eines der Beispiel-Systemtap-Skripte, die die PID und den Prozessnamen jedes Programms ausgeben, das einen bestimmten Inode liest oder schreibt (und Ihr Unix-Domain-Socket ist genau so etwas).

Sie können dieses Skript trivial ändern, um die tatsächlich gelesenen/geschriebenen Daten zu drucken; Ich überlasse es dem Leser als Übung.


Die kurzen Antworten sind nein und nicht leicht.

Unter Linux stützt sich lsof auf /proc/net/unix um die Informationen zu UNIX-Domain-Sockets abzurufen. Diese Schnittstelle listet alle gebundenen Sockets auf, aber nicht Verfolgen Sie die Endpunkte. Also können Sie Sehen Sie, welche Steckdosen vorhanden sind, aber Sie können nicht sehen, was mit ihnen verbunden ist. Irgendwo sind diese Informationen verfolgt, muss es verfolgt werden, sonst würden die Sockets-Verbindungen nicht funktionieren. Ich muss noch einen Mechanismus finden, um die Verbindungsinformationen abzurufen.

Die Schnüffelfrage ist etwas interessanter, aber nicht weniger enttäuschend. Was ich mit "nicht leicht" meinte, ist, dass es keinen Haken gibt, um sich einzuschleichen und diese Daten zu erfassen. Das nächste Analogon ist die Verwendung von tcpdump oder Wireshark, die beide libpcap verwenden, um tatsächlich die Schwerarbeit zu leisten. Während Netzwerk (AF_INET) und UNIX-Domäne (AF_UNIX) beide mit socket() erstellt werden Funktionsaufruf, beide verwenden connect() zum Verbinden verwenden beide read() und write() Um Daten zu verarbeiten, werden sie von verschiedenen Kernel-Subsystemen verarbeitet. Dies hat den unglücklichen Nebeneffekt, dass libpcap nicht dafür ausgelegt ist, mit UNIX-Domain-Sockets zu arbeiten.

Das Problem hat eine etwas weniger düstere Seite. Werfen Sie einen Blick auf die Manpage für recv(2) . Dies ist ein niedrigerer Systemaufruf als read() nutzt. Es gibt ein Flag für recv() genannt MSG_PEEK . Dies würde es Ihnen ermöglichen, den Datenverkehr zu schnüffeln, der durch einen UNIX-Domain-Socket läuft. Das ist also die gute Seite, die dunkle Seite ist, dass es meines Wissens keine aktuelle Anwendung gibt, die dafür ausgelegt ist. Sie sehen also einen gewissen Entwicklungsaufwand.

Ich wünschte wirklich, es gäbe eine eine schöne einfache Antwort von F'YEAH auf beide Teile Ihrer Frage.


Ich weiß, dass dies nicht die Hauptfrage beantwortet, aber ich bin hier gelandet und habe nur nach Sniffing-Kommunikation auf einem Socket gesucht. Ich habe mich entschieden, für andere wie mich zu posten. So habe ich es gemacht:

$> sudo socat -t100 -x -v UNIX-LISTEN:/var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/php5-fpm.sock

Sie können -x entfernen und einfach -v für die ASCII-Kommunikation belassen. Ich hoffe, das hilft jemandem.


Linux
  1. Linux – Ist Linux ein Unix?

  2. Arrays in der Unix-Bourne-Shell?

  3. Unix-Fall-Regex?

  4. Tmux-Socket-API?

  5. Domain-Weiterleitungstypen

So wechseln Sie PHP-FPM Listen auf Unix Socket

So verbinden Sie NGINX mit PHP-FPM über UNIX oder TCP/IP Socket

Linux gegen Unix

erlang:UNIX-Domain-Socket-Unterstützung?

Verbinden mit einem bereits eingerichteten UNIX-Socket mit node.js?

Wie greife ich über die Befehlszeile auf Unix Domain Sockets zu?