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を介してインターフェイスのネットワークネームスペースを取得する必要がなくなり、許容される可能性が高くなります。