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。すべてがうまくいけば、インターフェイスが作成され、カーネルは名前とファイル記述子を提供し、これがインターフェイスを管理する方法です。

ここには2つの質問があります。

  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

関連情報