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/tun
et 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 openvpn
processus avec lsof
ré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/tun
c'est une sorte de périphérique de multiplexage /dev/ptmx
, vous pouvez utiliser lsof
pour 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
/ tapX
avec un nom plus descriptif qui inclut le nom de base du fichier de configuration OpenVPN. Donc, /etc/openvpn/foo.conf
conduit à un vpn-foo
appareil. 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 -ef
pour les processus qemu, par exemple, qemu-system-x86_64 -enable-kvm -name debian-8
il 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
ifconfig
ne le montre pas. Attention, ce sont des tap
appareils 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.