/proc/[PID]/fdinfo/[FD] で参照される tap/tun デバイスの Linux ネットワーク名前空間を取得するには?

/proc/[PID]/fdinfo/[FD] で参照される tap/tun デバイスの Linux ネットワーク名前空間を取得するには?

TAP / TUNデバイスを使用しているプロセスに正しく一致させたいのですが。外部ioctl()これらのプロセスはTAP / TUNデバイスを使用します(つまり、プロセス自体内の特定のファイル記述子にアクセスできないため、sを実行できません)。

私は次の質問に対する答えを知っていますタブインターフェイスとそのファイル記述子間の接続を見つけるには?つまり、対応するTAP / TUNネットワークインターフェイスの名前を提供する追加のキーと値の/proc/[PID]/fdinfo/[FD]ペアがあります。iff:

ただし、ネットワークネームスペースには問題があります。特に、ユーザー空間プロセスがネットワーク名前空間に接続された後、TAP / TUNネットワークインタフェースがネットワーク名前空間内を移動する場合に問題があります。これにはtapclient単純なバリエーションがあります。a34729ttunclient.c、タブネットワーク名を受け入れて追加します):

$ sudo ip tuntap add tap123 mode tap
$ sudo tapclient tap123 &
$ sudo ip netns add fooz
$ sudo ip link set tap123 netns fooz
$ PID=$(ps faux | grep tapclient | grep -v -e sudo -e grep | awk '{print $2}')
$ sudo cat /proc/$PID/fdinfo/3

...その後、以下を提供します。iff: tap123- ただし、tap123ネットワークインターフェイスが現在配置されているネットワークネームスペースではありません。

もちろん、tap123すべてのネットワーク名前空間を繰り返して、それらの1つで一致するネットワークインターフェイスを見つけてそれを見つけることができます。残念ながら、tap123最初の名前を上記のネットワークネームスペースに移動したfooz後、ホストネームスペースに別の名前を作成した場合など、重複した名前がある可能性があります。

$ sudo ip tuntap add tap123 mode tap
$ ip link show tap123
$ sudo ip netns exec fooz ip link show tap123

だから私たちは今二つ tap123は別々のネットワークネームスペースにあり、fdinfoあいまいですiff: tap123

残念ながら、Tapclientのネットワークネームスペースを調べることは/proc/$PID/ns/net役に立ちません。現在のネットワーク名前空間と一致しなくなったためですtap123

$ findmnt -t nsfs | grep /run/netns/fooz
$ sudo readlink /proc/$PID/ns/net

たとえば、これはnet:[4026532591]vs。net:[4026531993]

tapclientプロセスが接続されている正しいネットワークインターフェイスインスタンスと明示的に一致する方法はありますか?tap123

ベストアンサー1

名前の代わりにハードウェアアドレスでtunインターフェースを一致させることができます(ioctl(SIOCGIFHWADDR)tun / tapファイル記述子からアドレスを取得できます)。

これより簡単なことはないと思います。それ以外の場合、最近の変更は次のとおりです。これ(これにより、tun fdを介してインターフェイスのネットワークネームスペースを取得する必要がなくなり、許容される可能性が高くなります。

おすすめ記事