GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je identifier quel processus génère du trafic UDP sous Linux ?

Solution 1 :

L'audit Linux peut aider. Il localisera au moins les utilisateurs et les processus établissant des connexions réseau datagramme. Les paquets UDP sont des datagrammes.

Tout d'abord, installez le auditd framework sur votre plateforme et assurez-vous que auditctl -l renvoie quelque chose, même s'il indique qu'aucune règle n'est définie.

Ensuite, ajoutez une règle pour surveiller l'appel système socket() et étiquetez-le pour le retrouver facilement plus tard (-k ). Je dois supposer que vous êtes sur une architecture 64 bits, mais vous pouvez remplacer b32 à la place du b64 si ce n'est pas le cas.

auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

Vous devez choisir parmi les pages de manuel et les fichiers d'en-tête pour créer cela, mais ce qu'il capture est essentiellement cet appel système :socket(PF_INET, SOCK_DGRAM|X, Y) , où le troisième paramètre est indéterminé mais souvent nul. PF_INET est 2 et SOCK_DGRAM est 2. Les connexions TCP utiliseraient SOCK_STREAM qui définirait a1=1 . (SOCK_DGRAM dans le deuxième paramètre peut être ORed avec SOCK_NONBLOCK ou SOCK_CLOEXEC , d'où le &= comparaison.) Le -k SOCKET est notre mot-clé que nous voulons utiliser lors de la recherche ultérieure de pistes d'audit. Cela peut être n'importe quoi, mais j'aime rester simple.

Laissez passer quelques instants et passez en revue les pistes d'audit. Facultativement, vous pouvez forcer quelques paquets en envoyant un ping à un hôte sur le net, ce qui entraînera une recherche DNS, qui utilise UDP, ce qui devrait déclencher notre alerte d'audit.

ausearch -i -ts today -k SOCKET

Et une sortie similaire à la section ci-dessous apparaîtra. Je l'abrège pour mettre en évidence les parties importantes

type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET

Dans la sortie ci-dessus, nous pouvons voir que le ping La commande a provoqué l'ouverture du socket. Je pourrais alors exécuter strace -p 14510 sur le processus, s'il était toujours en cours d'exécution. Le ppid (ID de processus parent) est également répertorié au cas où il s'agirait d'un script qui génère souvent l'enfant problématique.

Maintenant, si vous avez beaucoup de trafic UDP, cela ne suffira pas et vous devrez recourir à OProfile ou SystemTap, qui dépassent actuellement mon expertise.

Cela devrait aider à réduire les choses dans le cas général.

Lorsque vous avez terminé, supprimez la règle d'audit en utilisant la même ligne que vous avez utilisée pour la créer, remplacez uniquement -a avec -d .

auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET

Solution 2 :

Vous pouvez utiliser netstat, mais vous avez besoin des bons drapeaux, et cela ne fonctionne que si le processus qui envoie les données est toujours actif. Il ne trouvera pas les traces de quelque chose qui est venu brièvement à la vie, a envoyé du trafic UDP, puis est parti. Il nécessite également des privilèges root locaux. Cela dit :

Me voici en train de démarrer un ncat sur mon hôte local, envoyant le trafic UDP au port 2345 sur une machine (inexistante) 10.11.12.13 :

[[email protected]]$ ncat -u 10.11.12.13 2345 < /dev/urandom

Voici une sortie tcpdump prouvant que le trafic est en cours :

[[email protected] ~]# tcpdump -n -n port 2345
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:41:32.391750 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.399723 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.401817 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.407051 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.413492 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192
12:41:32.417417 IP 192.168.3.11.57550 > 10.11.12.13.2345: UDP, length 8192

Voici la partie utile , en utilisant netstat avec l'indicateur -a (pour voir les détails du port) et l'indicateur -p pour voir les détails de l'ID de processus. C'est le drapeau -p qui nécessite les privilèges root :

[[email protected] ~]# netstat -apn|grep -w 2345
udp        0      0 192.168.3.11:57550          10.11.12.13:2345            ESTABLISHED 9152/ncat     

Comme vous pouvez le voir, le pid 9152 est signalé comme ayant une connexion ouverte au port 2345 sur l'hôte distant spécifié. Netstat exécute également utilement cela via ps et me dit que le nom du processus est ncat .

J'espère que cela vous sera utile.

Solution 3 :

J'ai eu exactement le même problème et malheureusement auditd n'a pas fait grand-chose pour moi.

J'ai eu du trafic de certains de mes serveurs vers des adresses DNS Google, 8.8.8.8 et 8.8.4.4 . Maintenant, mon administrateur réseau a un léger TOC et il voulait nettoyer tout le trafic inutile puisque nous avons nos caches DNS internes. Il voulait désactiver le port sortant 53 pour tout le monde sauf ces serveurs de cache.

Donc, après avoir échoué avec auditctl , je fouille dans systemtap . Je propose le script suivant :

# cat >> udp_detect_domain.stp <<EOF
probe udp.sendmsg {
  if ( dport == 53 && daddr == "8.8.8.8" ) {
    printf ("PID %5d (%s) sent UDP to %15s 53\n", pid(), execname(), daddr)
  }
}
EOF

Ensuite, lancez simplement :

stap -v udp_detect_domain.stp

Voici le résultat que j'ai obtenu :

PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3501 (python) sent UDP to  8.8.8.8 53
PID  3506 (python) sent UDP to  8.8.8.8 53

C'est ça! Après avoir changé resolv.conf ces PID n'ont pas pris en compte les modifications.


J'espère que cela vous aidera :)

Solution 4 :

Voici une option systemtap, utilisant les sondes netfilter disponibles dans stap version 1.8 et versions ultérieures. Voir aussi man probe::netfilter.ip.local_out .

# stap -e 'probe netfilter.ip.local_out {
  if (dport == 53) # or parametrize
      printf("%s[%d] %s:%d\n", execname(), pid(), daddr, dport)
}'
ping[24738] 192.168.1.10:53
ping[24738] 192.168.1.10:53
^C

Solution 5 :

J'utiliserais un renifleur de réseau comme tcpdump ou wireshark pour afficher les requêtes DNS. Le contenu de la requête peut donner une idée du programme qui les émet.


Linux
  1. Comment installer vtop sur Linux

  2. Linux - Comment identifier quelle distribution Linux est en cours d'exécution ??

  3. Comment déterminer quel processus écrit sur le disque sous Linux

  4. Comment identifier le chipset d'un périphérique USB sous Linux ?

  5. Comment puis-je lier symboliquement un fichier sous Linux?

Comment tuer un processus zombie sous Linux

Comment tuer un processus sous Linux

Comment tuer un processus sous Linux

Comment puis-je créer un fichier de vidage d'un processus en cours d'exécution sous Linux ?

Comment puis-je identifier les logiciels malveillants contenant des extensions Chrome sous Linux ?

Comment définir l'affinité processeur d'un processus sous Linux ?