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

59

J'aimerais 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?

ck_
la source

Réponses:

15

Il y a un type qui prétend le faire en créant une application qui agit comme une passerelle entre deux sockets et en enregistrant toutes les données qui y circulent. Donc, vous ne pouvez pas appuyer sur un socket, mais si vous pouvez redémarrer le service et le configurer pour utiliser cette application de type, 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 à utiliser 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

Valeur
la source
Yah, vous pouvez aussi utiliser la méthode des intermédiaires avec socat, mais j'espère un moyen plus direct sans modifier les paramètres existants ailleurs.
ck_
1
Alors lsof et strace c'est la seule façon dont je suis au courant. Surveillez la production lorsque vous vous détachez du processus, vérifiez que tout continue à courir par la suite.
Valeur
3
Après quelques recherches supplémentaires, j'ai trouvé une question similaire avec des détails sur les raisons pour lesquelles cela n'est pas directement possible sur stackoverflow stackoverflow.com/questions/8394613/…
ck_
80

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.

Storoj
la source
3
Voulez-vous ajouter un peu plus d'explication?
Kazark
4
C'est facile lorsque le socket Unix d'origine a un chemin sur le système de fichiers. mais que se passe-t-il s'il s'agit d'un socket Unix d'espace de noms abstrait que vous ne pouvez pas réellement déplacer?
Valerio Schiavoni
6

Vous pouvez également essayer d’utiliser strace sur l’un des processus de chaque côté du socket, car cela vous permettra de regarder 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 impératif de définir -s sur quelque chose de grand.

omnigrok
la source
Cela a bien fonctionné pour moi et facile à faire. Utilisez strace -p <pid>pour regarder un processus en cours.
Matt Munson
Commande rapide: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logpuis lancez les tests. Vous avez le fichier /tmp/php.log pour vérifier lentement si le journal est trop volumineux. Si vous obtenez trop de trafic, faites une requête avec une chaîne de requête avec votre nom ou quelque chose comme ça, afin de pouvoir la rechercher dans les journaux
higuita
1
@higuita Je sais que ça fait longtemps, mais au lieu de cette boucle, vous pouvez laisser la printfgestion de la répétition. printf " -p %s" $(pidof php5-fpm)préfixera chaque argument pid avec -pet est beaucoup plus pratique à écrire.
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

ensuite:

sudo tcpdump -i lo -netvv port 8089
任喜军
la source
1
el magnifeco! Merci
typelogic