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?

user368507
la source
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.

Alexios
la source
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
jjo
la source
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
kworr
la source
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