web-dev-qa-db-ja.com

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

さまざまなタイプの(仮想)インターフェイス(TUN/TAP、vethなど)の違いを理解しようとしており、コンテナーのコンテキスト内でこれらのタイプのいくつかを研究していました。

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

私の理解では、TUN/TAPインターフェイスは、そのインターフェイスのネットワーク名前空間に対応するネットワークスタックとの間でユーザースペースとの間でパケットを送受信するためにのみ使用でき、ネットワーク名前空間間でパケットを送信することはできません。これは正しいです?

1
dippynark

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

通常、ネットワーク名前空間を仮想イーサネットペア(veth)に接続します。パケットをペアの他のインターフェイスに転送するだけです。

これを正確に実行するアプリケーションを作成することを妨げるものは何もありません。2つのtun/tapインターフェイスを開き、一方からパケットを読み取り、もう一方に転送します。その逆も同様です。これを行うために使用できる既製のアプリケーションもあります。 socat

2つのアプリケーションを作成することもできます。各アプリケーションは単一のtun/tapインターフェイスを開き、アプリケーションは他の手段を使用して相互に通信し、この方法で転送を実装します。基本的に、すべてのVPNアプリケーションはこのように機能します(ただし、「他の手段による」VPNアプリケーションの場合、通常は「既存のネットワーク接続を介して」行われるため、実際にはカウントされません)。

そうです、適切なアプリケーションを使用すれば、名前空間をtun/tapインターフェースに接続できます。ただし、そのようなアプリケーションを作成する必要があるため、一般的にはあまり意味がありません。また、veth-pairを使用するよりも効率が低下します。

編集

socatの1つのtunインターフェイスを作成したネットワーク名前空間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つ(または両方)のtun/tapネットワークインターフェイスを配置することで発生します。

1
dirkt