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/tun
e 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 openvpn
processo con lsof
rivela 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 lsof
per 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
/ tapX
devices con un nome più descrittivo che include il nome di base del file di configurazione OpenVPN. Quindi, /etc/openvpn/foo.conf
porta a un vpn-foo
dispositivo. 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 -ef
per i processi qemu, ad esempio qemu-system-x86_64 -enable-kvm -name debian-8
dovrebbe 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
ifconfig
non lo mostra. Intendiamoci, questi sono tap
dispositivi creati da OpenVPN, anche se non vedo perché ci dovrebbe essere una differenza.
nmap
, ma non sono sicuro di come essere onesto.