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?
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?
Jawaban:
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:
struct tun_struct(TUN dan TAP sebagian besar berbagi struktur data yang sama).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.
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
% 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.
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
ifconfigtidak menunjukkan ini. Pikiran Anda, ini adalah tapperangkat yang dibuat oleh OpenVPN - meskipun saya tidak melihat mengapa harus ada perbedaan.
nmap, tetapi saya tidak yakin bagaimana harus jujur.