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?
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?
Risposte:
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:
struct tun_struct(TUN e TAP condividono in gran parte le stesse strutture di dati).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.
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
% 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.
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
ifconfignon lo mostra. Intendiamoci, questi sono tapdispositivi creati da OpenVPN, anche se non vedo perché ci dovrebbe essere una differenza.
nmap, ma non sono sicuro di come essere onesto.