時々、タブインターフェイスを持つマシンを見つけます(たとえば、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
。すべてがうまくいけば、インターフェイスが作成され、カーネルは名前とファイル記述子を提供し、これがインターフェイスを管理する方法です。
ここには2つの質問があります。
- カーネルは 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