如何知道进程是否已连接到Tap接口?


9

有时我会遇到带有Tap接口的机器(例如,当KVM运行时)。我如何知道哪个进程附加到TAP接口?


我怀疑您可以使用来完成此操作nmap,但是我不确定该如何诚实。
Alex Chamberlain 2012年

Answers:


2

这让我感到纳闷,我看了一下Linux内核源代码(我假设您的问题是关于Linux的)。

答案似乎比您预期的要难。这个TUN / TAP API教程页面提供了一些见解。基本上,您的程序通过打开/dev/net/tun并将其发送给它来分配新的TUN / TAP设备TUNSETIFF ioctl。如果一切顺利,将创建一个接口,内核会为您提供名称和文件描述符,这就是您进行管理的方式。

这里有两个问题:

  1. 内核不存储发送ioctl的进程的PID struct tun_struct(TUN和TAP在很大程度上共享相同的数据结构)。
  2. 进程可以将接口标记为持久性,关闭其文件描述符,然后将其用作常规网络接口。

在实践中,我怀疑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来完成。


好。我也怀疑“多路复用” / dev / net / tun会阻止我们知道确切连接了进程的Tap接口。
user368507 2012年

5

每个文件描述符都有一个/ 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 -effor qemu进程的输出中显示了一个名称参数,例如qemu-system-x86_64 -enable-kvm -name debian-8,应该很容易找出pid和接口对应于哪个VM。
Dmitrii S.

1

在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

您正在尝试什么操作系统和版本?拥有此信息非常方便(我在一个装有数十个VPN端点的盒子中运行),但是Debian ifconfig没有显示此信息。请注意,这些是tap由OpenVPN创建的设备-尽管我不明白为什么会有区别。
Alexios 2012年

这是关于FreeBSD或任何其他BSD派生的。
kworr 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.