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/tun
y 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 openvpn
proceso con lsof
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 usar lsof
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 un vpn-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.
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 -ef
procesos 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
ifconfig
no muestra esto. Eso sí, estos son tap
dispositivos creados por OpenVPN, aunque no veo por qué debería haber una diferencia.
nmap
, pero no estoy seguro de cómo ser honesto.