Come sapere se un processo è collegato a un'interfaccia di tocco?


9

A volte mi imbatto in una macchina con interfacce tap (ad esempio, quando KVM è in esecuzione). Come posso sapere quale processo è collegato all'interfaccia TAP?


Sospetto che tu possa farlo nmap, ma non sono sicuro di come essere onesto.
Alex Chamberlain,

Risposte:


2

Questo mi ha fatto riflettere e ho dato un'occhiata al sorgente del kernel Linux (suppongo che la tua domanda riguardi Linux).

Sembra che la risposta sia più difficile di quanto ti aspetti. Questa pagina tutorial dell'API TUN / TAP offre alcune informazioni . Fondamentalmente, il tuo programma alloca un nuovo dispositivo TUN / TAP aprendolo /dev/net/tune inviandolo TUNSETIFF ioctl. Se tutto va bene, viene creata un'interfaccia, il kernel ti dà il suo nome e un descrittore di file, ed è così che lo gestisci.

Ci sono due catture qui:

  1. Il kernel non memorizza il PID del processo che ha inviato lo ioctl struct tun_struct(TUN e TAP condividono in gran parte le stesse strutture di dati).
  2. Un processo può contrassegnare un'interfaccia come persistente, chiudere il suo descrittore di file e successivamente utilizzarla come una normale interfaccia di rete.

In pratica, sospetto che 2 non accada molto. Controllare un openvpnprocesso con lsofrivela che ha ancora il suo descrittore di file sul dispositivo TAP aperto e ovviamente lo utilizza, ma poiché /dev/net/tunè una sorta di dispositivo multiplexing come /dev/ptmx, è possibile utilizzare lsofper scoprire quali processi stanno attualmente utilizzando un dispositivo TUN / TAP, ma non puoi sapere quale processo sta utilizzando quale dispositivo.

Esistono modi obliqui per risolvere il problema di fondo. Per OpenVPN, utilizzo uno script di installazione del tunnel che denomina tunX/ tapXdevices con un nome più descrittivo che include il nome di base del file di configurazione OpenVPN. Quindi, /etc/openvpn/foo.confporta a un vpn-foodispositivo. Quindi posso correlare il processo OpenvVPN con l'interfaccia che sta utilizzando. Tuttavia, non ho ancora dovuto farlo con QEmu / KVM.


Ok. Sospettavo anche che il "multiplexing" / dev / net / tun ci avrebbe impedito di sapere quale interfaccia di tocco fosse esattamente collegata anche a un processo.
user368507,

5

Ogni descrittore di file ha una voce / proc / pid / fdinfo / num , come:

# cat /proc/24332/fdinfo/28
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

Quindi, con il nome dell'interfaccia, puoi ottenere il pid con:

# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332

Funziona per me: % sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3' 4143 % pgrep qemu 4143 dato che c'è un parametro name mostrato nell'output di ps -efper i processi qemu, ad esempio qemu-system-x86_64 -enable-kvm -name debian-8dovrebbe essere facile scoprire a quale VM corrispondono un pid e un'interfaccia.
Dmitrii S.

1

Su FreeBSD o qualsiasi altro derivato BSD:

ifconfig tap0

dovrebbe mostrarti quale processo è collegato all'interfaccia:

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

Su quale sistema operativo e versione stai provando questo? Sarebbe MOLTO utile avere queste informazioni (gestisco una scatola con dozzine di endpoint VPN), ma Debian ifconfignon lo mostra. Intendiamoci, questi sono tapdispositivi creati da OpenVPN, anche se non vedo perché ci dovrebbe essere una differenza.
Alexios,

Si tratta di FreeBSD o di qualsiasi altro derivato BSD.
kworr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.