가끔 탭 인터페이스가 있는 머신을 발견합니다(예: 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
. 모든 것이 잘되면 인터페이스가 생성되고 커널은 이름과 파일 설명자를 제공하며 이것이 인터페이스를 관리하는 방법입니다.
여기에는 두 가지 질문이 있습니다.
- 커널은 ioctl을 보내는 프로세스의 PID를 저장하지 않습니다
struct tun_struct
(TUN과 TAP는 거의 동일한 데이터 구조를 공유합니다). - 프로세스는 인터페이스를 지속성으로 표시하고 해당 파일 설명자를 닫은 다음 이를 일반 네트워크 인터페이스로 사용할 수 있습니다.
사실 2번이 많이 일어날지는 의문이다. openvpn
프로세스를 확인하면 lsof
TAP 장치의 파일 설명자가 여전히 열려 있고 분명히 이를 사용하고 있음이 드러납니다. 하지만 프로세스와 같은 다중화된 장치이므로 어떤 /dev/net/tun
프로세스 가 어떤 장치를 사용하고 있는지 알 수 없습니다./dev/ptmx
lsof
근본적인 문제를 해결하는 몇 가지 간접적인 방법이 있습니다. OpenVPN의 경우 터널 설정 스크립트를 사용하여 tunX
OpenVPN 구성 파일의 기본 이름을 포함하는 보다 설명적인 이름으로 /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