Tap 인터페이스에 프로세스가 연결되어 있는지 어떻게 알 수 있나요?

Tap 인터페이스에 프로세스가 연결되어 있는지 어떻게 알 수 있나요?

가끔 탭 인터페이스가 있는 머신을 발견합니다(예: KVM이 실행 중일 때). TAP 인터페이스에 어떤 프로세스가 연결되어 있는지 어떻게 알 수 있나요?

답변1

각 파일 설명자에는 /proc/가 있습니다.PID/fdinfo/일련번호다음과 같은 항목:

# cat /proc/24332/fdinfo/28
pos:    0
flags:  0104002
mnt_id: 18
iff:    tap0123acdc-66

따라서 인터페이스 이름을 사용하면 다음을 통해 pid를 얻을 수 있습니다.

# egrep -l iff:.*tap0123acdc-66 /proc/*/fdinfo/* 2>/dev/null|cut -d/ -f3
24332

답변2

이것이 궁금해서 Linux 커널 소스 코드를 살펴보았습니다(귀하의 질문은 Linux에 관한 것이라고 가정합니다).

생각보다 답이 어려운 것 같습니다. 이것TUN/TAP API 튜토리얼 페이지는 몇 가지 통찰력을 제공합니다.. 기본적으로 프로그램이 열리고 /dev/net/tun인터페이스로 전송됩니다 TUNSETIFF ioctl. 모든 것이 잘되면 인터페이스가 생성되고 커널은 이름과 파일 설명자를 제공하며 이것이 인터페이스를 관리하는 방법입니다.

여기에는 두 가지 질문이 있습니다.

  1. 커널은 ioctl을 보내는 프로세스의 PID를 저장하지 않습니다 struct tun_struct(TUN과 TAP는 거의 동일한 데이터 구조를 공유합니다).
  2. 프로세스는 인터페이스를 지속성으로 표시하고 해당 파일 설명자를 닫은 다음 이를 일반 네트워크 인터페이스로 사용할 수 있습니다.

사실 2번이 많이 일어날지는 의문이다. openvpn프로세스를 확인하면 lsofTAP 장치의 파일 설명자가 여전히 열려 있고 분명히 이를 사용하고 있음이 드러납니다. 하지만 프로세스와 같은 다중화된 장치이므로 어떤 /dev/net/tun프로세스 가 어떤 장치를 사용하고 있는지 알 수 없습니다./dev/ptmxlsof

근본적인 문제를 해결하는 몇 가지 간접적인 방법이 있습니다. OpenVPN의 경우 터널 설정 스크립트를 사용하여 tunXOpenVPN 구성 파일의 기본 이름을 포함하는 보다 설명적인 이름으로 /device의 이름을 지정합니다 . tapX따라서 /etc/openvpn/foo.conf장치가 도입되었습니다 vpn-foo. 그런 다음 OpenvVPN 프로세스를 사용하는 인터페이스와 연결할 수 있습니다. 그러나 이를 수행하기 위해 QEmu/KVM을 사용할 필요는 없습니다.

답변3

FreeBSD 또는 기타 BSD 파생물:

ifconfig tap0

이 인터페이스에 연결된 프로세스가 표시되어야 합니다.

tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=80000<LINKSTATE>
    ether 58:9c:fc:10:8f:2b
    groups: tap
    media: Ethernet autoselect
    status: active
    nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
    Opened by PID 2672

관련 정보