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?
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?
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ándolo TUNSETIFF ioctl. 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 con lsofrevela 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 usar lsofpara 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 un vpn-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.
Cada descriptor de archivo tiene una entrada / proc / pid / fdinfo / num , como:
# cat /proc/24332/fdinfo/28
pos: 0
flags: 0104002
mnt_id: 18
iff: tap0123acdc-66
Entonces, con el nombre de la interfaz, puede obtener el pid con:
# 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 dado el hecho de que hay un parámetro de nombre que se muestra en la salida de los ps -efprocesos qemu, por ejemplo qemu-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:
ifconfig tap0
debería mostrarle qué proceso está conectado a la interfaz:
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
ifconfigno muestra esto. Eso sí, estos son tapdispositivos creados por OpenVPN, aunque no veo por qué debería haber una diferencia.
nmap, pero no estoy seguro de cómo ser honesto.