如何找出哪个进程使隧道接口(tun)保持打开状态?

如何找出哪个进程使隧道接口(tun)保持打开状态?

如果我tun使用命令创建一个接口ip tuntap add mode tun并使用ip link set dev tun1 up命令强制其管理启动,则该接口本身始终“物理”关闭:

root@A58:~# ip link show dev tun1
46: tun1: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT qlen 500
    link/none 
root@A58:~# 

这是有道理的,因为没有应用程序连接到该接口。但是,tun0我的系统中也有“物理上”启动的:

root@A58:~# ip link show dev tun0
45: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 100
    link/none 
root@A58:~# 

有没有办法找出哪个进程连接到这个tun0接口?我没有运气ps -ef | grep tun0lsof | grep tun0

答案1

内核似乎没有公开此信息。因此,如果没有内核调试,我认为你无法知道这一点。您能做的最好的事情就是列出所有已打开的进程tuntap设备,如下所示:

lsof /dev/net/tun

tun这样可以缩小范围,但在系统上有多个活动接口的情况下,它不会告诉您哪个进程正在管理哪个隧道。

当一个进程想要创建一个tun接口时,/dev/net/tun无论tun它打算使用哪个接口,它都会打开。然后,它要么让内核动态分配一个新的tun接口名称(如tun0tun1tun2),要么设置一个选定的名称。这是通过ioctl使用 code 进行调用来完成的TUNSETIFF。因此,除非您跟踪该ioctl调用,否则实际上没有办法知道分配了什么名称。

答案2

Linux 内核现在在/proc/$PID/fdinfo/$FD.例如:

# grep ^iff: /proc/*/fdinfo/*
/proc/31219/fdinfo/5:iff:       tun0
/proc/31235/fdinfo/5:iff:       tun1
/proc/31252/fdinfo/5:iff:       tun2
/proc/31267/fdinfo/5:iff:       tun3

使用 Debian 5.8.10 进行测试。

答案3

如果您有 /proc 文件系统,则可以使用以下命令序列:

find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID

相关内容