터널 인터페이스(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 tun0역시 운이 없었다 lsof | grep tun0.

답변1

커널은 이 정보를 노출하지 않는 것 같습니다. 따라서 커널 디버깅 없이는 이것을 알 수 없을 것 같습니다. 당신이 할 수 있는 최선의 방법은 다음과 같이 열려 있는 모든 프로세스 tuntap장치를 나열하는 것입니다.

lsof /dev/net/tun

tun이렇게 하면 범위가 좁아지지만 시스템에 여러 활성 인터페이스가 있는 경우 어떤 프로세스가 어떤 터널을 관리하고 있는지 알 수 없습니다.

tun프로세스가 인터페이스를 생성하려고 하면 사용하려는 인터페이스를 엽니다 /dev/net/tun. tun그런 다음 커널이 새 tun인터페이스 이름(예 tun0: tun1tun2)을 동적으로 할당하거나 선택한 이름을 설정하도록 합니다. 이는 ioctl코드를 사용하여 호출함으로써 수행됩니다 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

데비안 5.8.10을 사용하여 테스트되었습니다.

답변3

/proc 파일 시스템이 있는 경우 다음 명령 순서를 사용할 수 있습니다.

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

관련 정보