때때로 탭 인터페이스 (예 : KVM이 실행 중일 때)가있는 머신을 사용합니다. TAP 인터페이스에 어떤 프로세스가 첨부되어 있는지 어떻게 알 수 있습니까?
답변
이것은 궁금 해졌고 Linux 커널 소스를 보았습니다 (귀하의 질문이 Linux에 관한 것이라고 가정합니다).
답변이 예상보다 어려워 보입니다. 이 TUN / TAP API 튜토리얼 페이지는 약간의 통찰력을 제공 합니다. 기본적으로 프로그램은를 열고 새 TUN / TAP 장치를 할당하여 할당 /dev/net/tun
합니다 TUNSETIFF
ioctl
. 모든 것이 잘되면 인터페이스가 생성되고 커널은 이름과 파일 설명자를 제공하므로 관리하는 방식입니다.
여기에는 두 가지가 있습니다.
- 커널은 ioctl을 보낸 프로세스의 PID를 저장하지 않습니다
struct tun_struct
(TUN과 TAP는 거의 동일한 데이터 구조를 공유합니다). - 프로세스는 인터페이스를 영구적으로 표시하고 파일 디스크립터를 닫은 다음 일반 네트워크 인터페이스로 사용할 수 있습니다.
실제로, 나는 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