A veces me encuentro con máquinas con interfaces tap (por ejemplo, cuando KVM se está ejecutando). ¿Cómo puedo saber qué proceso está conectado a la interfaz TAP?
networking
kvm
tap
usuario368507
fuente
fuente

nmap, pero no estoy seguro de cómo ser honesto.Respuestas:
Esto me hizo preguntarme y eché un vistazo a la fuente del kernel de Linux (supongo que su pregunta es sobre Linux).
Parece que la respuesta es más difícil de lo que cabría esperar. Esta página de tutorial de API TUN / TAP ofrece algunas ideas . Básicamente, su programa asigna un nuevo dispositivo TUN / TAP abriéndolo
/dev/net/tuny enviándoloTUNSETIFFioctl. Si todo va bien, se crea una interfaz, el núcleo le da su nombre y un descriptor de archivo, y así es como lo administra.Aquí hay dos capturas:
struct tun_struct(TUN y TAP comparten en gran medida las mismas estructuras de datos).En la práctica, sospecho que 2 no sucede mucho. Al verificar un
openvpnproceso conlsofrevela que todavía tiene su descriptor de archivo abierto para el dispositivo TAP y obviamente lo está usando, pero dado que/dev/net/tunes una especie de dispositivo de multiplexación/dev/ptmx, puede usarlsofpara averiguar qué procesos están usando actualmente un dispositivo TUN / TAP, pero no puedes saber qué proceso está usando qué dispositivo.Hay formas oblicuas de resolver el problema subyacente. Para OpenVPN, utilizo un script de configuración de túnel que nombra los dispositivos
tunX/tapXcon un nombre más descriptivo que incluye el nombre base del archivo de configuración de OpenVPN. Entonces,/etc/openvpn/foo.confconduce a unvpn-foodispositivo. Entonces puedo correlacionar el proceso OpenvVPN con la interfaz que está usando. Sin embargo, todavía no he tenido que hacer esto con QEmu / KVM.fuente
Cada descriptor de archivo tiene una entrada / proc / pid / fdinfo / num , como:
Entonces, con el nombre de la interfaz, puede obtener el pid con:
fuente
% sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3'4143% pgrep qemu4143dado el hecho de que hay un parámetro de nombre que se muestra en la salida de losps -efprocesos qemu, por ejemploqemu-system-x86_64 -enable-kvm -name debian-8, debería ser fácil averiguar a qué VM corresponde un pid y una interfaz.En FreeBSD o cualquier otro derivado de BSD:
debería mostrarle qué proceso está conectado a la interfaz:
fuente
ifconfigno muestra esto. Eso sí, estos sontapdispositivos creados por OpenVPN, aunque no veo por qué debería haber una diferencia.