Bagaimana cara mengetahui jika suatu proses dilampirkan ke antarmuka tap?

9

Saya kadang-kadang datang dengan mesin dengan antarmuka tap (misalnya, ketika KVM sedang berjalan). Bagaimana saya bisa tahu proses mana yang dilampirkan ke antarmuka TAP?

pengguna368507
sumber
Saya curiga Anda bisa melakukan ini nmap, tetapi saya tidak yakin bagaimana harus jujur.
Alex Chamberlain

Jawaban:

2

Ini membuat saya bertanya-tanya dan saya melihat sumber kernel Linux (saya berasumsi pertanyaan Anda adalah tentang Linux).

Tampaknya jawabannya lebih sulit daripada yang Anda harapkan. Ini TUN / TAP API tutorial penawaran halaman beberapa wawasan . Pada dasarnya, program Anda mengalokasikan perangkat TUN / TAP baru dengan membuka /dev/net/tundan mengirimkannya TUNSETIFF ioctl. Jika semuanya berjalan dengan baik, sebuah antarmuka dibuat, kernel memberi Anda nama dan deskriptor file, dan itulah cara Anda mengelolanya.

Ada dua tangkapan di sini:

  1. Kernel tidak menyimpan PID dari proses yang mengirim ioctl di struct tun_struct(TUN dan TAP sebagian besar berbagi struktur data yang sama).
  2. Suatu proses dapat menandai suatu antarmuka sebagai persisten, tutup deskriptor file dan kemudian menggunakannya sebagai antarmuka jaringan normal.

Dalam praktiknya, saya kira 2 tidak banyak terjadi. Memeriksa suatu openvpnproses dengan lsofmengungkapkan masih ada deskriptor file ke perangkat TAP terbuka dan jelas menggunakannya, tetapi karena /dev/net/tunsemacam perangkat multiplexing seperti /dev/ptmx, Anda dapat menggunakan lsofuntuk mengetahui proses apa yang saat ini menggunakan perangkat TUN / TAP, tetapi Anda tidak dapat mengetahui proses apa yang menggunakan perangkat apa.

Ada cara miring untuk memecahkan masalah yang mendasarinya. Untuk OpenVPN, saya menggunakan skrip pengaturan terowongan yang menamai tunX/ tapXperangkat dengan nama yang lebih deskriptif yang menyertakan nama file file konfigurasi OpenVPN. Jadi, /etc/openvpn/foo.confmengarah ke vpn-fooperangkat. Lalu saya bisa menghubungkan proses OpenvVPN dengan antarmuka yang digunakannya. Namun, saya belum harus melakukan ini dengan QEmu / KVM.

Alexios
sumber
Baik. Saya curiga juga bahwa "multiplexing" / dev / net / tun akan mencegah kita untuk mengetahui apa antarmuka tap persis proses yang terpasang juga.
user368507
5

Setiap deskriptor file memiliki entri / proc / pid / fdinfo / num , seperti:

# cat /proc/24332/fdinfo/28
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

Jadi, dengan nama antarmuka, Anda bisa mendapatkan pid dengan:

# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332
jjo
sumber
Bekerja untuk saya: % sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3' 4143 % pgrep qemu 4143 Mengingat fakta bahwa ada parameter nama yang ditampilkan dalam output ps -efuntuk proses qemu, misalnya qemu-system-x86_64 -enable-kvm -name debian-8, seharusnya mudah untuk menemukan VM mana yang sesuai dengan pid dan antarmuka.
Dmitrii S.
1

Pada FreeBSD atau turunan BSD lainnya:

ifconfig tap0

akan menunjukkan kepada Anda proses mana yang terhubung ke antarmuka:

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
sumber
OS dan versi apa yang Anda coba ini? Akan sangat SANGAT berguna untuk memiliki informasi ini (saya menjalankan sebuah kotak dengan puluhan titik akhir VPN), tetapi Debian ifconfigtidak menunjukkan ini. Pikiran Anda, ini adalah tapperangkat yang dibuat oleh OpenVPN - meskipun saya tidak melihat mengapa harus ada perbedaan.
Alexios
Ini tentang FreeBSD atau turunan BSD lainnya.
kworr