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/tun
dan 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 openvpn
proses dengan lsof
mengungkapkan masih ada deskriptor file ke perangkat TAP terbuka dan jelas menggunakannya, tetapi karena /dev/net/tun
semacam perangkat multiplexing seperti /dev/ptmx
, Anda dapat menggunakan lsof
untuk 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
/ tapX
perangkat dengan nama yang lebih deskriptif yang menyertakan nama file file konfigurasi OpenVPN. Jadi, /etc/openvpn/foo.conf
mengarah ke vpn-foo
perangkat. 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 -ef
untuk 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
ifconfig
tidak menunjukkan ini. Pikiran Anda, ini adalah tap
perangkat yang dibuat oleh OpenVPN - meskipun saya tidak melihat mengapa harus ada perbedaan.
nmap
, tetapi saya tidak yakin bagaimana harus jujur.