Jak się dowiedzieć, czy proces jest dołączony do interfejsu dotykowego?

9

Czasami przychodzę na maszynę z interfejsami tap (np. Gdy KVM jest uruchomiony). Skąd mam wiedzieć, który proces jest dołączony do interfejsu TAP?

użytkownik368507
źródło
Podejrzewam, że możesz to zrobić nmap, ale nie jestem pewien, jak być szczerym.
Alex Chamberlain,

Odpowiedzi:

2

To mnie zastanowiło i rzuciłem okiem na źródło jądra Linuksa (zakładam, że twoje pytanie dotyczy Linuksa).

Wygląda na to, że odpowiedź jest trudniejsza niż się spodziewałeś. Ta strona samouczka interfejsu API TUN / TAP oferuje pewien wgląd . Zasadniczo twój program przydziela nowe urządzenie TUN / TAP, otwierając je /dev/net/tuni wysyłając TUNSETIFF ioctl. Jeśli wszystko pójdzie dobrze, tworzony jest interfejs, jądro podaje jego nazwę i deskryptor pliku, i tak właśnie nim zarządzasz.

Istnieją tutaj dwa połowy:

  1. Jądro nie przechowuje PID procesu, który wysłał ioctl struct tun_struct(TUN i TAP w dużej mierze współużytkują te same struktury danych).
  2. Proces może oznaczyć interfejs jako trwały, zamknąć deskryptor pliku, a następnie użyć go jako normalnego interfejsu sieciowego.

W praktyce podejrzewam, że 2 niewiele się dzieje. Sprawdzanie openvpnprocesu z lsofujawnieniem, że wciąż ma otwarty deskryptor pliku na urządzeniu TAP i oczywiście go używa, ale ponieważ /dev/net/tunjest to rodzaj urządzenia multipleksującego /dev/ptmx, możesz użyć, lsofaby dowiedzieć się, jakie procesy obecnie używają urządzenia TUN / TAP, ale nie wiesz, jaki proces korzysta z jakiego urządzenia.

Istnieją ukryte sposoby rozwiązania podstawowego problemu. W przypadku OpenVPN używam skryptu konfiguracji tunelu, który nadaje nazwę tunX/ tapXdevices bardziej opisową nazwą, która obejmuje nazwę basenu pliku konfiguracyjnego OpenVPN. Tak, /etc/openvpn/foo.confprowadzi do vpn-foourządzenia. Następnie mogę skorelować proces OpenvVPN z używanym interfejsem. Jednak jeszcze nie musiałem tego robić z QEmu / KVM.

Alexios
źródło
Ok. Podejrzewałem też, że „multipleksowanie” / dev / net / tun nie pozwoliłoby nam dowiedzieć się, do którego interfejsu tap jest dołączony również proces.
user368507
5

Każdy deskryptor pliku ma pozycję / proc / pid / fdinfo / num , na przykład:

# cat /proc/24332/fdinfo/28
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

Tak więc, dzięki nazwie interfejsu możesz uzyskać pid za pomocą:

# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332
jjo
źródło
Działa dla mnie: % sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3' 4143 % pgrep qemu 4143 biorąc pod uwagę fakt, że na wyjściu ps -efprocesów qemu jest wyświetlany parametr name , np qemu-system-x86_64 -enable-kvm -name debian-8. Powinno być łatwo ustalić, z którą maszyną wirtualną odpowiada pid i interfejs.
Dmitrii S.
1

Na FreeBSD lub innej pochodnej BSD:

ifconfig tap0

powinien pokazać, który proces jest podłączony do interfejsu:

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
źródło
Na jakim systemie operacyjnym i wersji próbujesz tego? Byłoby BARDZO przydatne, aby mieć te informacje (uruchamiam pudełko z dziesiątkami punktów końcowych VPN), ale Debian ifconfigtego nie pokazuje. Pamiętaj, że są to tapurządzenia stworzone przez OpenVPN - choć nie rozumiem, dlaczego powinna być różnica.
Alexios
Chodzi o FreeBSD lub dowolną inną pochodną BSD.
kworr