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?
networking
kvm
tap
użytkownik368507
źródło
źródło
nmap
, ale nie jestem pewien, jak być szczerym.Odpowiedzi:
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/tun
i wysyłającTUNSETIFF
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:
struct tun_struct
(TUN i TAP w dużej mierze współużytkują te same struktury danych).W praktyce podejrzewam, że 2 niewiele się dzieje. Sprawdzanie
openvpn
procesu zlsof
ujawnieniem, że wciąż ma otwarty deskryptor pliku na urządzeniu TAP i oczywiście go używa, ale ponieważ/dev/net/tun
jest to rodzaj urządzenia multipleksującego/dev/ptmx
, możesz użyć,lsof
aby 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
/tapX
devices bardziej opisową nazwą, która obejmuje nazwę basenu pliku konfiguracyjnego OpenVPN. Tak,/etc/openvpn/foo.conf
prowadzi dovpn-foo
urządzenia. Następnie mogę skorelować proces OpenvVPN z używanym interfejsem. Jednak jeszcze nie musiałem tego robić z QEmu / KVM.źródło
Każdy deskryptor pliku ma pozycję / proc / pid / fdinfo / num , na przykład:
Tak więc, dzięki nazwie interfejsu możesz uzyskać pid za pomocą:
źródło
% 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ściups -ef
procesów qemu jest wyświetlany parametr name , npqemu-system-x86_64 -enable-kvm -name debian-8
. Powinno być łatwo ustalić, z którą maszyną wirtualną odpowiada pid i interfejs.Na FreeBSD lub innej pochodnej BSD:
powinien pokazać, który proces jest podłączony do interfejsu:
źródło
ifconfig
tego nie pokazuje. Pamiętaj, że są totap
urządzenia stworzone przez OpenVPN - choć nie rozumiem, dlaczego powinna być różnica.