[unix] 프로세스가 탭 인터페이스에 연결되어 있는지 확인하는 방법

때때로 탭 인터페이스 (예 : KVM이 실행 중일 때)가있는 머신을 사용합니다. TAP 인터페이스에 어떤 프로세스가 첨부되어 있는지 어떻게 알 수 있습니까?



답변

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

답변이 예상보다 어려워 보입니다. 이 TUN / TAP API 튜토리얼 페이지는 약간의 통찰력을 제공 합니다. 기본적으로 프로그램은를 열고 새 TUN / TAP 장치를 할당하여 할당 /dev/net/tun합니다 TUNSETIFF ioctl. 모든 것이 잘되면 인터페이스가 생성되고 커널은 이름과 파일 설명자를 제공하므로 관리하는 방식입니다.

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

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

실제로, 나는 2가별로 일어나지 않는다고 생각합니다. openvpn프로세스를 체크 아웃하면 lsof파일 설명자가 TAP 장치에 열려 있고 분명히 사용하고 있음을 알 수 있지만 , /dev/net/tun와 같은 일종의 멀티플렉싱 장치 /dev/ptmx이므로 lsof현재 TUN / TAP 장치를 사용하는 프로세스를 찾는 데 사용할 수 있지만 어떤 프로세스가 어떤 장치를 사용하고 있는지 알 수 없습니다.

근본적인 문제를 해결하는 데는 비스듬한 방법이 있습니다. OpenVPN 의 경우 OpenVPN 구성 파일의 기본 이름을 포함하는보다 설명적인 이름으로 tunX/ tapX장치의 이름을 지정하는 터널 설정 스크립트를 사용 합니다. 따라서 장치로 /etc/openvpn/foo.conf연결됩니다 vpn-foo. 그런 다음 OpenvVPN 프로세스를 사용중인 인터페이스와 상관시킬 수 있습니다. 그러나 아직 QEmu / KVM으로이 작업을 수행 할 필요는 없습니다.


답변

각 파일 디스크립터는 / proc / pid / fdinfo / num 엔트리를 가지고 있습니다 :

# 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


답변

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


답변