web-dev-qa-db-fra.com

Puis-je surveiller un socket de domaine Unix local comme tcpdump?

Je voudrais surveiller les réponses sur un socket Unix sans perturber les connexions d'origine et les diriger vers un script pour traitement.

Je sais comment faire cela avec tcpdump pour les connexions tcp mais je n'arrive pas à trouver de solution pour les sockets unix locales.

Est-ce seulement possible?

57
ck_

Il y a un type qui prétend le faire en créant une application qui sert de passerelle entre deux sockets et en enregistrant toutes les données qui y circulent. Donc, vous ne pouvez pas taper sur un socket, mais si vous pouvez redémarrer le service et le configurer pour utiliser cette application, vous pourrez voir tout le trafic.

Voici le lien vers l'article: Unix Socket Sniffer

Il existe un autre moyen de rechercher l'ID de processus associé au socket, puis de rechercher avec lsof le descripteur de fichier du socket, puis de taper le descripteur de fichier à l'aide de strace.

Si vous pouvez arrêter n'importe quel client/serveur qui utilise le socket et le reconfigurer, je recommanderais toujours la première méthode, la deuxième méthode est délicate et vous oblige à exploiter un processus en cours qui, sur certaines applications, pourrait provoquer son crash.

J'espère que quelqu'un nous éclairer d'une autre manière :)

Bonne chance

15
Valor

vous pouvez utiliser socat.

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

Que se passe-t-il ci-dessus: Commencez par déplacer le support d'origine vers sock.original. Socat crée un nouveau socket ("UNIX-LISTEN") à l'emplacement des originaux et les transfère tous vers l'original ("UNIX-connect"). Le -v indique à socat d'imprimer également la sortie sur STDERR.

78
storoj

Vous pouvez également essayer d'utiliser strace sur l'un des processus de chaque côté du socket, car cela vous permettra de voir ce qui est écrit/lu. J'ai trouvé dans mes environnements de production, je n'ai pas de socat, mais j'ai strace.

Pour tout usage utile, il est indispensable de définir -s sur une taille importante.

6
omnigrok
// 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

puis:

Sudo tcpdump -i lo -netvv port 8089
0
任喜军