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?
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?
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/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:
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 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.
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
% 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.
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
ifconfigtego nie pokazuje. Pamiętaj, że są to tapurządzenia stworzone przez OpenVPN - choć nie rozumiem, dlaczego powinna być różnica.
nmap, ale nie jestem pewien, jak być szczerym.