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?


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.


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.