私はさまざまなタイプの(仮想)インターフェイス(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つの)トン/タップネットワークインターフェイスを持つことによって達成されます。