タップインターフェイスを備えたマシンに出くわすことがあります(KVMが実行されているときなど)。どのプロセスがTAPインターフェイスに接続されているかを知るにはどうすればよいですか?
タップインターフェイスを備えたマシンに出くわすことがあります(KVMが実行されているときなど)。どのプロセスがTAPインターフェイスに接続されているかを知るにはどうすればよいですか?
回答:
これで不思議に思い、Linuxカーネルのソースを調べました(Linuxに関する質問だと思います)。
予想よりも答えが難しいようです。このTUN / TAP APIチュートリアルページは、洞察を提供します。基本的に、プログラムはを開い/dev/net/tun
て送信することにより、新しいTUN / TAPデバイスを割り当てますTUNSETIFF
ioctl
。すべてがうまくいけば、インターフェースが作成され、カーネルがその名前とファイル記述子を提供します。それが管理方法です。
ここには2つのキャッチがあります。
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
% sudo bash -c 'grep -l iff:.*vnet0 /proc/*/fdinfo/* 2>/dev/null | cut -d/ -f3'
4143
% pgrep qemu
4143
出力に表示される名前パラメーターがあるという事実を考えるとps -ef
、たとえばqemu-system-x86_64 -enable-kvm -name debian-8
、pidとインターフェイスがどのVMに対応するかを簡単に確認できるはずです。
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
ifconfig
はこれを表示しません。ちなみに、これらはtap
OpenVPNによって作成されたデバイスです—違いがある理由はわかりません。
nmap
、私は正直に言う方法がわかりません。