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

9

Я иногда сталкиваюсь с машиной с интерфейсами крана (например, когда KVM работает). Как я могу узнать, какой процесс подключен к интерфейсу TAP?

user368507
источник
Я подозреваю, что вы можете сделать это с nmap, но я не уверен, как быть честным.
Алекс Чемберлен

Ответы:

2

Это заставило меня задуматься, и я взглянул на исходный код ядра Linux (я предполагаю, что ваш вопрос касается Linux).

Похоже, ответ сложнее, чем вы ожидаете. Эта учебная страница TUN / TAP API предлагает некоторое понимание . По сути, ваша программа выделяет новое устройство 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
jjo
источник
Работает для меня: % 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должно быть легко определить, какой виртуальной машине соответствуют 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
kworr
источник
На какой ОС и версии вы это примеряете? Было бы ОЧЕНЬ удобно иметь эту информацию (я запускаю коробку с десятками конечных точек VPN), но Debian ifconfigэтого не показывает. Имейте в виду, это tapустройства, созданные OpenVPN - хотя я не понимаю, почему должна быть разница.
Алексиос
Это касается FreeBSD или любого другого производного BSD.
Kworr