Comment puis-je trouver quel processus envoie des données à un port spécifique?

21

J'ai un service, en gardant un certain port ouvert.

Je reçois des données, que je ne m'attends ni ne veux obtenir, et j'essaie de localiser la source de ces données. Alors, comment puis-je trouver quel processus qui envoie des données vers un port spécifique, par opposition à quel processus écoute.

user50849
la source

Réponses:

23

Pour TCP (bien que la même approche fonctionnerait pour SCTP 1 ou tout protocole de transport orienté connexion), même chose que pour la recherche de ceux à l'écoute:

lsof -nPi tcp:the-port

Rapportera les processus qui ont un socket TCP ouvert sur ce port. Si vous connaissez le port source (votre application serveur peut le connaître et l'enregistrer), vous pouvez l'utiliser à la place pour localiser le client escroc.

Pour les sockets UDP ou RAW, ce serait plus difficile, mais je suppose que c'est là que quelque chose comme systemtap ou dtrace peut être utile. Peut-être également audité.


1 Bien que la prise en charge SCTP (sous Linux uniquement) ait été ajoutée à lsofdans la version 4.86, vous ne pouvez pas utiliser -ipour demander explicitement des sockets SCTP. Ici, peut être utilisé lsof -nP | grep -w 'SCTP.*:the-port'comme heuristique à la place.

Stéphane Chazelas
la source
Cela ne fonctionne pas pour SCTP pour moi.
sudo
1
@sudo, voir edit
Stéphane Chazelas
3

Essayez de suivre:

$sudo ss -tp

Ou:

$sudo netstat -A inet -p

Pour éviter le résultat localhost:

$sudo netstat -A inet -p | grep -v localhost

Pour répertorier uniquement les connexions ÉTABLI:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
Amol
la source
2

Selon le type de connexion qu'il établit pour envoyer des données, l'une de ces approches vous mènera quelque part.

  • Utilisez tcpdump port 1234pour acquérir les données envoyées à ce port. Vous pouvez utiliser un programme comme Wireshark pour l'analyser sur une autre machine (capturé dans un fichier en utilisant l' -woption). Vous pouvez également utiliser Wireshark directement.

  • Dans le cas où il établit et maintient ouverte une connexion tcp / udp, vous pouvez utiliser netstatpour trouver l'IP distante de la connexion.

  • Énumérez les sockets ouvertes d'un processus comme dans la réponse fournie par @StephaneChazelas.

gertvdijk
la source
1

Vous pouvez utiliser la sockstatcommande pour trouver le processus qui a initié la connexion à votre service sur l'hôte local.

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

Faites correspondre toutes les connexions source à votre destination. Cela fonctionne bien pour TCP / UDP / UNIXsockets.

Andrey Voitenkov
la source
0

Sous Solaris, l'exécution de pfiles sur tous les processus doit montrer quels processus ont quelles connexions ouvertes. Cela nécessitera un filtrage soigneux, probablement en utilisant les options -A, -B de ggrep ...

Sous Linux, netstat -anp --inetfonctionnera, même sans lsof installé. (déposez le --inetpour obtenir également les sockets de domaine Unix)

Gert van den Berg
la source