ユーザープログラムでTUN / TAPトンネルを使用する方法は?

ユーザープログラムでTUN / TAPトンネルを使用する方法は?

私は最近Linux TUN / TAPインターフェースの存在を発見し、それを理解しようとしています。基本概念を理解していると思います。ネットワークインターフェイスをシミュレートし、データをハードウェアではなくユーザー空間プログラムに渡す擬似デバイスを作成します。

関係のないプログラムにトンネルを使用するように指示するにはどうすればよいですか?

たとえば、トンネルを作成する前に、私のシステムにはeth0とlo、通常のイーサネットインターフェイス(ローカルネットワークに接続されている)、ループバックインターフェイスのみが含まれていました。プログラムがトンネルを作成して設定した後、新しいインターフェイスgr0が作成されました。これはローカルネットワークにありますが、使用されていないIPアドレスを提供しました(したがって、両方とも同じサブネットにありました)。この「トンネル」を利用するために無関係なプログラムを入手するにはどうすればよいですか? TCP接続を利用する単純なPythonメッセージングクライアント/サーバーアプリケーションがあるとします。トンネルを使用するようにどのように設定しますか?

私が基本的なものを見逃している場合は謝罪します。しかし、いつものように、私は物事の計画に混乱しています。繰り返しますが、私が望むのは、このトンネルを利用する単純なTCPプログラムです。

ありがとうございます!

ベストアンサー1

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

一般的なトンネル設定では、サーバーとクライアントの両方がTUNデバイスに割り当てられたアドレスを持ちます。両方に設定されたルーティングテーブルは、必要なトラフィックをTUNデバイスに送信します。パケットが tun0 にルーティングされると、カーネルはそれをユーザー空間プログラム (クライアント) に送信し、このプログラムは TCP 接続などを介してリモートコンピュータ (サーバー) 内の他のプログラムにパケットを送信します。リモートシステムでは、他のプログラム(サーバー)がクライアントからパケットを受信し、それを自分のデバイスに書き込み、/dev/tunXパケットをネットワークスタックに「注入」します。トンネルパケットは他のパケットのように扱われます。

おすすめ記事