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?
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?
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 sendet TUNSETIFF
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 mit lsof
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 Sie lsof
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 einem vpn-foo
Gerät. Dann kann ich den OpenvVPN-Prozess mit der verwendeten Schnittstelle korrelieren. Ich musste dies jedoch noch nicht mit QEmu / KVM tun.
Jeder Dateideskriptor hat einen Eintrag / proc / pid / fdinfo / num , wie:
# cat /proc/24332/fdinfo/28
pos: 0
flags: 0104002
mnt_id: 18
iff: tap0123acdc-66
Mit dem Namen der Schnittstelle können Sie die PID erhalten mit:
# 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
Angesichts der Tatsache, dass in der Ausgabe von ps -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:
ifconfig tap0
sollte Ihnen zeigen, welcher Prozess mit der Schnittstelle verbunden ist:
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
zeigt dies nicht an. Wohlgemerkt, dies sind tap
Geräte, die von OpenVPN erstellt wurden - obwohl ich nicht verstehe, warum es einen Unterschied geben sollte.
nmap
, aber ich bin mir nicht sicher, wie ich ehrlich sein soll.