Ich stoße manchmal auf eine Maschine mit Tap-Schnittstellen (z. B. wenn KVM ausgeführt wird). Wie kann ich wissen, welcher Prozess an die TAP-Schnittstelle angeschlossen ist?
networking
kvm
tap
user368507
quelle
quelle
nmap
, aber ich bin mir nicht sicher, wie ich ehrlich sein soll.Antworten:
Das hat mich gewundert und ich habe mir die Linux-Kernelquelle angesehen (ich gehe davon aus, dass Ihre Frage Linux betrifft).
Es scheint, dass die Antwort schwieriger ist als erwartet. Diese TUN / TAP API-Tutorial-Seite bietet einige Einblicke . Grundsätzlich weist Ihr Programm ein neues TUN / TAP-Gerät zu,
/dev/net/tun
indem es das öffnet und sendetTUNSETIFF
ioctl
. Wenn alles gut geht, wird eine Schnittstelle erstellt, der Kernel gibt Ihnen seinen Namen und einen Dateideskriptor, und so verwalten Sie es.Hier gibt es zwei Fänge:
struct tun_struct
(TUN und TAP teilen sich weitgehend dieselben Datenstrukturen).In der Praxis vermute ich, dass 2 nicht viel passiert. Das Auschecken eines
openvpn
Prozesses mitlsof
zeigt, dass der Dateideskriptor für das TAP-Gerät noch geöffnet ist und offensichtlich verwendet wird. Da es sich jedoch/dev/net/tun
um eine Art Multiplexgerät handelt/dev/ptmx
, können Sielsof
damit herausfinden, welche Prozesse derzeit ein TUN / TAP-Gerät verwenden Sie können nicht wissen, welcher Prozess welches Gerät verwendet.Es gibt schräge Wege, um das zugrunde liegende Problem zu lösen. Für OpenVPN verwende ich ein Tunnel-Setup-Skript, das die
tunX
/tapX
Geräte mit einem aussagekräftigeren Namen benennt, der den Basisnamen der OpenVPN-Konfigurationsdatei enthält. Führt also/etc/openvpn/foo.conf
zu einemvpn-foo
Gerät. Dann kann ich den OpenvVPN-Prozess mit der verwendeten Schnittstelle korrelieren. Ich musste dies jedoch noch nicht mit QEmu / KVM tun.quelle
Jeder Dateideskriptor hat einen Eintrag / proc / pid / fdinfo / num , wie:
Mit dem Namen der Schnittstelle können Sie die PID erhalten mit:
quelle
% sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3'
4143
% pgrep qemu
4143
Angesichts der Tatsache, dass in der Ausgabe vonps -ef
für qemu-Prozesse ein Namensparameter angezeigt wird,qemu-system-x86_64 -enable-kvm -name debian-8
sollte es beispielsweise leicht sein, herauszufinden, welcher VM eine PID und eine Schnittstelle entsprechen.Auf FreeBSD oder einem anderen BSD-Derivat:
sollte Ihnen zeigen, welcher Prozess mit der Schnittstelle verbunden ist:
quelle
ifconfig
zeigt dies nicht an. Wohlgemerkt, dies sindtap
Geräte, die von OpenVPN erstellt wurden - obwohl ich nicht verstehe, warum es einen Unterschied geben sollte.