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

Mar*_*tin 8 linux text-processing network-interface

如果我tunip 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:~# 
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为没有应用程序连接到此接口。但是,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:~# 
Run Code Online (Sandbox Code Playgroud)

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

Cel*_*ada 7

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

lsof /dev/net/tun
Run Code Online (Sandbox Code Playgroud)

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

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


fam*_*zah 5

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
Run Code Online (Sandbox Code Playgroud)

使用 Debian 5.8.10 进行测试。