Я іноді натрапляю на машину з кранами інтерфейсу (наприклад, коли працює KVM). Як я можу знати, який процес приєднаний до інтерфейсу TAP?
Я іноді натрапляю на машину з кранами інтерфейсу (наприклад, коли працює KVM). Як я можу знати, який процес приєднаний до інтерфейсу TAP?
Відповіді:
Це мене здивувало, і я подивився на джерело ядра Linux (я припускаю, що ваше питання стосується Linux).
Здається, відповідь складніше, ніж ви очікували. Ця сторінка підручника API TUN / TAP пропонує деяку інформацію . По суті, ваша програма виділяє новий TUN / TAP пристрій, відкривши /dev/net/tun
та надіславши його TUNSETIFF
ioctl
. Якщо все добре, створюється інтерфейс, ядро дає вам своє ім'я та дескриптор файлу, і саме так ви керуєте ним.
Тут є два улови:
struct tun_struct
(TUN і TAP багато в чому поділяють однакові структури даних).На практиці я підозрюю, що 2 не буває багато. Перевірка openvpn
процесу з виявленням, lsof
він все ще відкрив дескриптор файлів на пристрої TAP і, очевидно, використовує його, але оскільки /dev/net/tun
це такий собі тип мультиплексування, як /dev/ptmx
ви, ви можете використовувати, lsof
щоб дізнатися, які процеси в даний час використовують пристрій TUN / TAP, але ви не можете знати, який процес використовує який пристрій.
Існують косі способи вирішення основної проблеми. Для OpenVPN я використовую сценарій налаштування тунелю, який називає tunX
/ tapX
пристрої з більш описовим іменем, що включає базове ім'я конфігураційного файла OpenVPN. Отже, /etc/openvpn/foo.conf
веде до vpn-foo
пристрою. Тоді я можу співвіднести процес OpenvVPN з інтерфейсом, який він використовує. Хоча ще цього не робили з QEmu / KVM.
Кожен дескриптор файлу має запис / proc / pid / fdinfo / num , наприклад:
# cat /proc/24332/fdinfo/28
pos: 0
flags: 0104002
mnt_id: 18
iff: tap0123acdc-66
Отже, використовуючи ім'я інтерфейсу, ви можете отримати pid за допомогою:
# 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
Враховуючи той факт, що є параметр імені, показаний на виході ps -ef
процесів qemu, наприклад, qemu-system-x86_64 -enable-kvm -name debian-8
слід легко зрозуміти, якому VM відповідає pid та інтерфейс.
На FreeBSD або будь-якій іншій похідній BSD:
ifconfig tap0
повинен показати вам, який процес підключений до інтерфейсу:
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
цього не показує. Зауважте, це tap
пристрої, створені OpenVPN - хоча я не розумію, чому має бути різниця.
nmap
, але я не впевнений, як бути чесним.