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 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?
Réponses:
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:
struct tun_struct(TUN et TAP partagent en grande partie les mêmes structures de données).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.
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
% 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.
                    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
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.
                    
nmap, mais je ne sais pas comment être honnête.