如果我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 tun0
或lsof | grep tun0
。
答案1
内核似乎没有公开此信息。因此,如果没有内核调试,我认为你无法知道这一点。您能做的最好的事情就是列出所有已打开的进程tun
或tap
设备,如下所示:
lsof /dev/net/tun
tun
这样可以缩小范围,但在系统上有多个活动接口的情况下,它不会告诉您哪个进程正在管理哪个隧道。
当一个进程想要创建一个tun
接口时,/dev/net/tun
无论tun
它打算使用哪个接口,它都会打开。然后,它要么让内核动态分配一个新的tun
接口名称(如tun0
、tun1
等tun2
),要么设置一个选定的名称。这是通过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