Як дізнатися, чи підключений процес до інтерфейсу крана?


9

Я іноді натрапляю на машину з кранами інтерфейсу (наприклад, коли працює KVM). Як я можу знати, який процес приєднаний до інтерфейсу TAP?


Я підозрюю, що ти можеш це зробити nmap, але я не впевнений, як бути чесним.
Алекс Чемберлен

Відповіді:


2

Це мене здивувало, і я подивився на джерело ядра Linux (я припускаю, що ваше питання стосується Linux).

Здається, відповідь складніше, ніж ви очікували. Ця сторінка підручника API TUN / TAP пропонує деяку інформацію . По суті, ваша програма виділяє новий TUN / TAP пристрій, відкривши /dev/net/tunта надіславши його TUNSETIFF ioctl. Якщо все добре, створюється інтерфейс, ядро ​​дає вам своє ім'я та дескриптор файлу, і саме так ви керуєте ним.

Тут є два улови:

  1. Ядро не зберігає PID процесу, який надсилає ioctl struct tun_struct(TUN і TAP багато в чому поділяють однакові структури даних).
  2. Процес може позначити інтерфейс як стійкий, закрити його дескриптор файлів і після цього використовувати його як звичайний мережевий інтерфейс.

На практиці я підозрюю, що 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.


Добре. Я теж підозрював, що "мультиплексування" / dev / net / tun заважає нам знати, до якого саме інтерфейсу дотику також додається процес.
user368507

5

Кожен дескриптор файлу має запис / 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 та інтерфейс.
Дмитро С.

1

На 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

На якій ОС та версії ви пробуєте це? Дуже зручно було б мати цю інформацію (я запускаю коробку з десятками кінцевих точок VPN), але Debian ifconfigцього не показує. Зауважте, це tapпристрої, створені OpenVPN - хоча я не розумію, чому має бути різниця.
Олексій

Йдеться про FreeBSD або будь-яку іншу похідну BSD.
kworr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.