Sniff UNIX Domain Socket

9

Ich weiß, dass ein Prozess in einen bestimmten Unix-Domain-Socket ( /var/run/asterisk/asterisk.ctl) schreibt , aber ich kenne die PID des Absenders nicht. Wie kann ich herausfinden, wer in die Steckdose schreibt? Ich habe versucht mit:

sudo lsof /var/run/asterisk/asterisk.ctl

Es wird jedoch nur der Besitzer des Sockets aufgelistet. Ich möchte wissen, wer in diesen Socket schreibt / liest, und ich möchte auch die Daten schnüffeln. Ist das möglich?

verdammt schnell
quelle

Antworten:

4

Die kurzen Antworten sind nein und nicht leicht.

Unter Linux ist lsof darauf angewiesen /proc/net/unix, die Informationen zu UNIX-Domain-Sockets abzurufen. Diese Schnittstelle listet alle gebundenen Sockets auf, verfolgt jedoch nicht die Endpunkte. Sie können also sehen, welche Sockets vorhanden sind, aber Sie können nicht sehen, was mit ihnen verbunden ist. Irgendwo diese Information wird verfolgt, sie verfolgt werden müssen oder aber die Steckdosen - Verbindungen nicht funktionieren würde. Ich habe noch keinen Mechanismus zum Abrufen der Verbindungsinformationen gefunden.

Die Schnüffelfrage ist etwas interessanter, aber nicht weniger enttäuschend. Was ich mit "nicht einfach" gemeint habe, ist, dass es keinen Haken gibt, um sich in diese Daten einzuschleichen und sie zu erfassen. Das nächste Analogon ist die Verwendung von tcpdump oder Wireshark, die beide libpcap verwenden, um das schwere Heben tatsächlich durchzuführen. Während Netzwerk (AF_INET) und UNIX-Domäne (AF_UNIX) beide mithilfe des socket()Funktionsaufrufs erstellt werden connect(), werden beide zum Herstellen einer Verbindung, zum Verwenden read()und write()Verarbeiten von Daten verwendet. Sie werden von verschiedenen Kernel-Subsystemen verarbeitet. Dies hat den unglücklichen Nebeneffekt, dass libpcap nicht für die Verwendung mit UNIX-Domänensockets ausgelegt ist.

Das Problem hat eine etwas weniger dunkle Seite. Schauen Sie sich die Manpage für an recv(2). Dies ist ein untergeordneter Systemaufruf, read()der verwendet wird. Es gibt eine Flagge für recv()aufgerufen MSG_PEEK. Auf diese Weise können Sie den Datenverkehr über einen UNIX-Domänensocket abhören. Das ist also die helle Seite, die dunkle Seite ist, dass es meines Wissens keine aktuelle Anwendung gibt, die dafür entwickelt wurde. Sie sehen also einige Entwicklungsanstrengungen.

Ich wünschte , es wirklich war eine schöne einfache Antwort von F'YEAH auf beiden Teile Ihrer Frage.

Scott Pack
quelle
11

Ja, das kannst du machen. Alles was Sie brauchen ist Systemtap.

Stellen Sie sich eines der beispielhaften Systemtap-Skripte vor, mit denen die PID und der Prozessname eines Programms gedruckt werden, das einen bestimmten Inode liest oder schreibt (und Ihr Unix-Domain-Socket ist genau das).

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

Michael Hampton
quelle
3

Ich weiß, dass dies nicht die Hauptfrage beantwortet, aber ich bin hier gelandet und habe nur nach Kommunikation an einer Steckdose gesucht. Ich habe beschlossen, 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. Hoffe das hilft jemandem.

Anton Valqk
quelle
funktioniert perfekt
JSmyth
-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

Es gibt keine doppelte Ausgabe, keine zyklische Ausgabe. Fehler des vorherigen Kommentars ".sock.socat"

srvf
quelle
2
Obwohl dies ein nützlicher Befehl sein kann, fügen Sie bitte eine Erklärung / Klarstellung hinzu (und wie unterscheidet sich das von dieser Antwort ?)
HBruijn
Es tut mir Leid. Es gibt keine doppelte Ausgabe, keine zyklische Ausgabe. Fehler des vorherigen Kommentars ".sock.socat"
srvf