Woher wissen Sie, ob ein Prozess an eine Tap-Schnittstelle angeschlossen ist?

9

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?

user368507
quelle
Ich vermute, Sie können das tun nmap, aber ich bin mir nicht sicher, wie ich ehrlich sein soll.
Alex Chamberlain

Antworten:

2

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:

  1. Der Kernel speichert nicht die PID des Prozesses, der das ioctl gesendet hat struct tun_struct(TUN und TAP teilen sich weitgehend dieselben Datenstrukturen).
  2. Ein Prozess kann eine Schnittstelle als persistent markieren, ihren Dateideskriptor schließen und sie anschließend als normale Netzwerkschnittstelle verwenden.

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.

Alexios
quelle
Okay. Ich hatte auch den Verdacht, dass das "Multiplexen" / dev / net / tun uns daran hindern würde zu wissen, mit welcher Tap-Schnittstelle genau ein Prozess verbunden ist.
user368507
5

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
jjo
quelle
Funktioniert für mich: % 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.
Dmitrii S.
1

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
kworr
quelle
Auf welchem ​​Betriebssystem und welcher Version probieren Sie das aus? Es wäre SEHR praktisch, diese Informationen zu haben (ich verwende eine Box mit Dutzenden von VPN-Endpunkten), aber der Debian ifconfigzeigt dies nicht an. Wohlgemerkt, dies sind tapGeräte, die von OpenVPN erstellt wurden - obwohl ich nicht verstehe, warum es einen Unterschied geben sollte.
Alexios
Hier geht es um FreeBSD oder ein anderes BSD-Derivat.
Kworr