Answers:
这让我感到纳闷,我看了一下Linux内核源代码(我假设您的问题是关于Linux的)。
答案似乎比您预期的要难。这个TUN / TAP API教程页面提供了一些见解。基本上,您的程序通过打开/dev/net/tun
并将其发送给它来分配新的TUN / TAP设备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
for qemu进程的输出中显示了一个名称参数,例如qemu-system-x86_64 -enable-kvm -name debian-8
,应该很容易找出pid和接口对应于哪个VM。
在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
,但是我不确定该如何诚实。