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/tun
i 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 openvpn
procesu z lsof
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 do vpn-foo
urzą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 -ef
procesó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
ifconfig
tego nie pokazuje. Pamiętaj, że są to tap
urządzenia stworzone przez OpenVPN - choć nie rozumiem, dlaczego powinna być różnica.
nmap
, ale nie jestem pewien, jak być szczerym.