ユーザープログラムからTUN / TAPトンネルを利用する方法


9

私は最近、Linux TUN / TAPインターフェースの存在を発見し、まだそれらを理解しようとしています。基本的な概念はわかったと思います。ネットワークインターフェイスをエミュレートする疑似デバイスが作成され、データをハードウェアに渡す代わりに、ユーザースペースプログラムに渡されます。

このトンネルを利用するように無関係のプログラムをどのように指示しますか?

たとえば、トンネルが作成される前のシステムには、eth0とlo、通常のイーサネットインターフェイス(ローカルネットワークに配線されている)、およびループバックインターフェイスのみが含まれています。プログラムがトンネルを作成して構成した後、ローカルネットワーク上にあるが使用されていないIPアドレスを与えた新しいインターフェイスgr0があります(したがって、すべて同じサブネット上にいます)。無関係なプログラムにこの「トンネル」を利用させるにはどうすればよいですか?TCP接続を利用するシンプルなPythonメッセージパッシングクライアント/サーバーアプリがあるとしたら、トンネルを使用するように構成するにはどうすればよいですか?

基本的なことを忘れてしまったことをお詫びしますが、いつものように、物事の構図で混乱しました。繰り返しますが、私が望んでいるのは、このトンネルを利用する単純なTCPプログラムを作成することだけです。

ありがとう!

回答:


7

常に「トンネル」とは限りません。TUN / TAPは特定のNICドライバです。ネットワークスタックの観点からは、他のネットワークインターフェイスと同様に機能します。IPアドレスを持つことも、ポイントツーポイントまたはブロードキャストインターフェイスにすることもできます。ルーティングルールもそれらに適用されます。ただし、そのネットワークインターフェイスの1つに書き込まれるすべてのトラフィックは、処理のためにユーザー空間プログラムに送られ、ユーザー空間プログラムによって直接書き込まれるすべてのデータは/dev/tunX、ネットワークスタックの着信パケットのように見えます。

通常のトンネリング設定では、サーバーとクライアントにアドレスが割り当てられたTUNデバイスがあります。両方で構成されたルーティングテーブルは、必要なトラフィックをこのTUNデバイスに転送します。パケットがtun0にルーティングされると、カーネルはそれをユーザースペースプログラム(クライアント)に送信し、ユーザー空間プログラム(クライアント)はこのパケットを、TCP接続などを介してリモートマシン(サーバー)上の他のプログラムに送信します。リモートマシンでは、他のプログラム(サーバー)がクライアントからパケットを受け取り、それを自身の/dev/tunXデバイスに書き込み、そのパケットをネットワークスタックに「注入」します。そして、トンネルされたパケットは他のパケットと同様に処理されます。


1
したがって、(私の目的で)答えは、これらのインターフェースにトラフィックを転送するようにルーティングテーブルを構成することです。それが私が見逃しているポイントでしたが、今では解決策を見つけることができるはずです。また、説明がわかりやすくなりましたので、よろしくお願いします。ありがとう!
シカダンス氏、2011年

2
「route add <TUN IP ADDR> dev gr0」を使用してしまいました。これにより、新しいインターフェースを介してトラフィックをリダイレクトできました。再度、感謝します!
シカダンス氏、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.