Mar*_*tin 8 linux text-processing network-interface
如果我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:~#
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 tun0
或lsof | grep tun0
。
内核似乎没有公开此信息。因此,如果没有内核调试,我认为你无法知道这一点。您能做的最好的事情就是列出所有已打开的进程tun
或tap
设备,如下所示:
lsof /dev/net/tun
Run Code Online (Sandbox Code Playgroud)
这样可以缩小范围,但在系统上有多个活动接口的情况下tun
,它不会告诉您哪个进程正在管理哪个隧道。
当一个进程想要创建一个tun
接口时,/dev/net/tun
无论tun
它打算使用哪个接口,它都会打开。然后,它要么让内核动态分配一个新的接口名称(tun
如tun0
、等),要么设置一个选定的名称。这是通过使用 code 进行调用来完成的。因此,除非您跟踪该调用,否则实际上没有办法知道分配了什么名称。tun1
tun2
ioctl
TUNSETIFF
ioctl
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 进行测试。