Я иногда сталкиваюсь с машиной с интерфейсами крана (например, когда KVM работает). Как я могу узнать, какой процесс подключен к интерфейсу TAP?
Я иногда сталкиваюсь с машиной с интерфейсами крана (например, когда KVM работает). Как я могу узнать, какой процесс подключен к интерфейсу TAP?
Ответы:
Это заставило меня задуматься, и я взглянул на исходный код ядра Linux (я предполагаю, что ваш вопрос касается Linux).
Похоже, ответ сложнее, чем вы ожидаете. Эта учебная страница TUN / TAP API предлагает некоторое понимание . По сути, ваша программа выделяет новое устройство 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
должно быть легко определить, какой виртуальной машине соответствуют 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
, но я не уверен, как быть честным.