Kann ich einen lokalen Unix-Domain-Socket wie tcpdump überwachen?

59

Ich möchte Antworten auf einem Unix-Socket überwachen, ohne die ursprünglichen Verbindungen zu stören, und sie zur Verarbeitung an ein Skript weiterleiten.

Ich weiß, wie man dies mit tcpdump für TCP-Verbindungen macht, aber ich kann anscheinend keine Lösung für lokale Unix-Sockets finden.

Ist das überhaupt möglich?

ck_
quelle

Antworten:

15

Es gibt jemanden, der behauptet, dies zu tun, indem er eine App erstellt, die als Gateway zwischen zwei Sockets fungiert und alle Daten protokolliert, die fließen. Sie können also nicht auf einen Socket tippen, aber wenn Sie den Dienst neu starten und für die Verwendung dieser App optimieren können, können Sie den gesamten Datenverkehr sehen.

Hier ist der Link zum Beitrag: Unix Socket Sniffer

Auf eine andere Weise müssen Sie die an den Socket angehängte Prozess-ID suchen, dann mit lsof den Dateideskriptor des Sockets suchen und dann mit strace auf den Dateideskriptor tippen.

Wenn Sie den Client / Server, der den Socket verwendet, stoppen und neu konfigurieren können, empfehle ich immer die erste und zweite Methode. Dies ist schwierig und erfordert, dass Sie auf einen aktuellen Prozess tippen, der bei einigen Apps zum Absturz führen kann.

Hoffe jemand klärt uns auf :)

Viel Glück

Tapferkeit
quelle
Ja, Sie können die Mittelsmännchen-Methode auch mit socat durchführen, aber ich hoffe auf einen direkteren Weg, ohne die bestehenden Einstellungen an anderer Stelle zu ändern.
ck_
1
Dann ist es der einzige Weg, den ich kenne. Achten Sie auf die Produktion, wenn Sie sich vom Prozess lösen, und überprüfen Sie, ob danach alles weiterläuft.
Valor
3
Nach einigem Nachdenken fand ich eine ähnliche Frage mit einigen Details darüber, warum dies nicht direkt über stackoverflow.com/questions/8394613/…
ck_ 08.10.12
80

Sie können socat verwenden.

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

Was oben passiert: Verschieben Sie zuerst die Originalfassung in die sock.original. Socat erstellt einen neuen Socket ('UNIX-LISTEN') am Originalspeicherort und leitet alle an das Original weiter ('UNIX-connect'). Das -v weist socat an, die Ausgabe auch an STDERR auszugeben.

storoj
quelle
3
Möchtest du noch eine Erklärung hinzufügen?
Kazark
4
Das ist einfach, wenn der ursprüngliche Unix-Socket einen Pfad im Dateisystem hat. Aber was ist, wenn es sich um einen abstrakten Namespace-Unix-Socket handelt, den Sie tatsächlich nicht verschieben können?
Valerio Schiavoni
6

Sie können auch versuchen, strace für einen der Prozesse auf beiden Seiten des Sockets zu verwenden, da Sie so beobachten können, was geschrieben / gelesen wird. Ich habe in meinen Produktionsumgebungen festgestellt, dass ich kein socat habe, aber ein strace.

Für jeden nützlichen Zweck ist es ein Muss, -s auf etwas Großes zu setzen.

omnigrok
quelle
Das hat bei mir gut funktioniert und ist einfach zu bewerkstelligen. Verwenden Sie strace -p <pid>diese Option , um einen laufenden Prozess zu überwachen.
Matt Munson
Kurzbefehl: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logund führen Sie dann die Tests aus. Sie haben die /tmp/php.log, um langsam zu überprüfen, ob das Protokoll zu groß ist. Wenn Sie zu viel Verkehr haben, stellen Sie eine Anfrage mit einer
Abfragezeichenfolge
1
@higuita Ich weiß, es ist lange her, aber anstelle dieser Schleife können Sie printfdie Wiederholung behandeln lassen. printf " -p %s" $(pidof php5-fpm)wird jedem pid-Argument ein Präfix voranstellen -pund ist viel praktischer zu schreiben.
JoL
2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

dann:

sudo tcpdump -i lo -netvv port 8089
任喜军
quelle
El Magnifeco! Thanks
typelogic vor