Я иногда сталкиваюсь с машиной с интерфейсами крана (например, когда KVM работает). Как я могу узнать, какой процесс подключен к интерфейсу TAP?
networking
kvm
tap
user368507
источник
источник
nmap
, но я не уверен, как быть честным.Ответы:
Это заставило меня задуматься, и я взглянул на исходный код ядра 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 , например:
Итак, с именем интерфейса вы можете получить pid:
источник
% 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
этого не показывает. Имейте в виду, этоtap
устройства, созданные OpenVPN - хотя я не понимаю, почему должна быть разница.