Comment savoir si un processus est attaché à une interface tap?


9

Je tombe parfois sur une machine avec des interfaces de prise (par exemple, lorsque KVM est en cours d'exécution). Comment savoir quel processus est associé à l'interface TAP?


Je soupçonne que vous pouvez le faire avec nmap, mais je ne sais pas comment être honnête.
Alex Chamberlain

Réponses:


2

Cela m'a fait réfléchir et j'ai jeté un œil à la source du noyau Linux (je suppose que votre question concerne Linux).

Il semble que la réponse soit plus difficile que vous ne le pensez. Cette page de didacticiel sur l'API TUN / TAP offre un aperçu . Fondamentalement, votre programme alloue un nouveau périphérique TUN / TAP en l'ouvrant /dev/net/tunet en l'envoyant TUNSETIFF ioctl. Si tout se passe bien, une interface est créée, le noyau vous donne son nom et un descripteur de fichier, et c'est comme ça que vous le gérez.

Il y a deux captures ici:

  1. Le noyau ne stocke pas le PID du processus qui a envoyé l'ioctl struct tun_struct(TUN et TAP partagent en grande partie les mêmes structures de données).
  2. Un processus peut marquer une interface comme persistante, fermer son descripteur de fichier et l'utiliser ensuite comme interface réseau normale.

En pratique, je soupçonne que 2 ne se produit pas beaucoup. Vérifier un openvpnprocessus avec lsofrévèle qu'il a toujours son descripteur de fichier sur le périphérique TAP ouvert et l'utilise évidemment, mais comme /dev/net/tunc'est une sorte de périphérique de multiplexage /dev/ptmx, vous pouvez utiliser lsofpour savoir quels processus utilisent actuellement un périphérique TUN / TAP, mais vous ne pouvez pas savoir quel processus utilise quel appareil.

Il existe des moyens indirects de résoudre le problème sous-jacent. Pour OpenVPN, j'utilise un script de configuration de tunnel qui nomme les périphériques tunX/ tapXavec un nom plus descriptif qui inclut le nom de base du fichier de configuration OpenVPN. Donc, /etc/openvpn/foo.confconduit à un vpn-fooappareil. Ensuite, je peux corréler le processus OpenvVPN avec l'interface qu'il utilise. Cependant, je n'ai pas encore eu à le faire avec QEmu / KVM.


D'accord. Je soupçonnais aussi que le "multiplexage" / dev / net / tun nous empêcherait de savoir à quelle interface de tapotement exactement un processus est attaché.
user368507

5

Chaque descripteur de fichier a une entrée / proc / pid / fdinfo / num , comme:

# cat /proc/24332/fdinfo/28
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

Ainsi, avec le nom de l'interface, vous pouvez obtenir le pid avec:

# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332

Fonctionne pour moi: étant % sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3' 4143 % pgrep qemu 4143 donné qu'il y a un paramètre de nom affiché dans la sortie de ps -efpour les processus qemu, par exemple, qemu-system-x86_64 -enable-kvm -name debian-8il devrait être facile de savoir à quelle VM un pid et une interface correspondent.
Dmitrii S.

1

Sur FreeBSD ou tout autre dérivé BSD:

ifconfig tap0

devrait vous montrer quel processus est connecté à l'interface:

tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=80000<LINKSTATE>
    ether 58:9c:fc:10:8f:2b
    groups: tap
    media: Ethernet autoselect
    status: active
    nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
    Opened by PID 2672

Sur quel système d'exploitation et quelle version essayez-vous cela? Ce serait TRÈS pratique d'avoir ces informations (je lance une boîte avec des dizaines de points de terminaison VPN), mais Debian ifconfigne le montre pas. Attention, ce sont des tapappareils créés par OpenVPN - même si je ne vois pas pourquoi il devrait y avoir une différence.
Alexios

Il s'agit de FreeBSD ou de tout autre dérivé de BSD.
kworr
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.