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/tunindem 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 openvpnProzesses mit lsofzeigt, dass der Dateideskriptor für das TAP-Gerät noch geöffnet ist und offensichtlich verwendet wird. Da es sich jedoch /dev/net/tunum eine Art Multiplexgerät handelt /dev/ptmx, können Sie lsofdamit 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/ tapXGeräte mit einem aussagekräftigeren Namen benennt, der den Basisnamen der OpenVPN-Konfigurationsdatei enthält. Führt also /etc/openvpn/foo.confzu einem vpn-fooGerä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 -effür qemu-Prozesse ein Namensparameter angezeigt wird, qemu-system-x86_64 -enable-kvm -name debian-8sollte 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
ifconfigzeigt dies nicht an. Wohlgemerkt, dies sind tapGerä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.