TUN / TAPインターフェイスのみを使用してネットワーク名前空間間でパケットを送信できますか?

TUN / TAPインターフェイスのみを使用してネットワーク名前空間間でパケットを送信できますか?

私はさまざまなタイプの(仮想)インターフェイス(TUN / TAP、vethなど)の違いを理解し、コンテナの文脈でそれらのいくつかを研究しようとしています。

TUN / TAPインターフェイスのみを使用して、コンテナ(独自のネットワークネームスペースにある)とホストのネットワークネームスペース間でパケットを送信することは可能ですか?それともこれを行うには、1対のvethペア(各名前空間に1つずつ)が必要ですか?

私が理解しているように、TUN / TAPインターフェイスは、ネットワークネームスペース間ではなく、インターフェイスのネットワークネームスペースに対応するネットワークスタックからユーザースペースにパケットを送受信するためにのみ使用できます。そうですか?

ベストアンサー1

tun/tap インターフェースは常にアプリケーションに属します。このインターフェイスに送信されたパケットはアプリケーションから読み取られ、アプリケーションによって作成されたパケットはこのインターフェイスを介してカーネルネットワークスタックに入ります。

通常、仮想イーサネットペア(veth)を使用してネットワークネームスペースを接続します。彼らは単にパケットをペアの他のインターフェイスに転送します。

2 つの tun/tap インターフェイスを開いたり、あるインターフェイスからパケットを読み込んだり、別のインターフェイスに転送したり、その逆に転送したりするなど、まさにこのタスクを実行するアプリケーションを作成するのに邪魔になることはありません。などの既製のアプリケーションを使用してこれを実行することもできますsocat

2つのアプリケーションを作成することもできます。各アプリケーションは tun/tap インターフェイスを開き、アプリケーションは転送を達成するために異なる方法で通信します。デフォルトでは、すべてのVPNアプリはこのように動作します(VPNアプリの場合、「他の手段として」は通常「既存のネットワーク接続を介して」であるため、実際には重要ではありません)。

はい。正しいアプリケーションを使用すると、tun / tapインターフェースを使用して名前空間に接続できます。しかし、通常、これらのアプリケーションを書く必要があり、veth-pairを使用するよりも効率が悪いので、これを行うことはあまり意味がありません。

編集する

tunインタフェースを私が作成したネットワーク名前空間に移動してみましたが、デフォルトのネットワーク名前socat空間で実行したにもかかわらず、期待ns0どおりにうまくいきました。socat

socat TUN:10.1.0.254/24,tun-name=tun0a,iff-up TUN:10.1.0.1/24,tun-name=tun0b
ip link set tun0b netns ns0

tun0bその後、移動したアドレスをリセットする必要があります。

したがって、「インターリーブ」は、プロセスとは異なる名前空間に1つ(または2つの)トン/タップネットワークインターフェイスを持つことによって達成されます。

おすすめ記事