¿Cómo saber si un proceso está conectado a una interfaz táctil?

9

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?

usuario368507
fuente
Sospecho que puedes hacer esto nmap, pero no estoy seguro de cómo ser honesto.
Alex Chamberlain

Respuestas:

2

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:

  1. El núcleo no almacena el PID del proceso que envió el ioctl struct tun_struct(TUN y TAP comparten en gran medida las mismas estructuras de datos).
  2. Un proceso puede marcar una interfaz como persistente, cerrar su descriptor de archivo y luego usarla como una interfaz de red normal.

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.

Alexios
fuente
Okay. También sospechaba que la "multiplexación" / dev / net / tun nos impediría saber qué interfaz táctil se adjunta exactamente a un proceso.
user368507
5

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
jjo
fuente
Funciona para mí: % 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.
Dmitrii S.
1

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
kworr
fuente
¿En qué sistema operativo y versión estás probando esto? Sería MUY útil tener esta información (ejecuto un cuadro con docenas de puntos finales VPN), pero el Debian ifconfigno muestra esto. Eso sí, estos son tapdispositivos creados por OpenVPN, aunque no veo por qué debería haber una diferencia.
Alexios
Esto es sobre FreeBSD o cualquier otro derivado de BSD.
kworr