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/tun
y enviándoloTUNSETIFF
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
openvpn
proceso conlsof
revela que todavía tiene su descriptor de archivo abierto para el dispositivo TAP y obviamente lo está usando, pero dado que/dev/net/tun
es una especie de dispositivo de multiplexación/dev/ptmx
, puede usarlsof
para 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
/tapX
con un nombre más descriptivo que incluye el nombre base del archivo de configuración de OpenVPN. Entonces,/etc/openvpn/foo.conf
conduce a unvpn-foo
dispositivo. 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 qemu
4143
dado el hecho de que hay un parámetro de nombre que se muestra en la salida de losps -ef
procesos 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
ifconfig
no muestra esto. Eso sí, estos sontap
dispositivos creados por OpenVPN, aunque no veo por qué debería haber una diferencia.