より短いバージョン
Linuxのネットワークインタフェースがネットワークデバイスドライバの代わりに実行中のプロセスでパケットを送受信するにはどうすればよいですか?
拡張バージョン
学士号では、2台のコンピュータ間通信用にUSRP N210(Ettusによって作成されたソフトウェア定義ラジオ)2台にカスタムワイヤレス一時ネットワーク(802.11ではなくIPスタックを使用)を構築する予定です。アイデアは、USRPを使用して無線信号を送受信するGNURadioの上にリンク層を実装することです。
理想的には、コミュニケーションシステム全体が次のようになります。透明まるで、一部のインターフェイス(eth0など)に接続されている別のネットワークであるかのように、ホストに接続されます。それで、作る方法がないかと思います。ネットワークインターフェース(図のvirt0)をLinuxで実行し、ネットワークデバイスドライバの代わりにGNURadio(PythonとC ++を使用)と通信するようにします。これの目的は、GNURadio環境が送信する必要があるパケットにアクセスし、他のホストが受信できるようにUSRPを介してそれを転送できることです(一部の処理を含む)。プロセス間通信ですが、パイプを使用できますか?
これが私が透明性と呼ぶことを達成したい私の最初のアイデアでした。また、GNURadioと対話するためにダミーネットワークドライバを作成することも検討しましたが、デバイスドライバの経験が不足していたため、これを避けたいと思いました。他のアイデアがあれば、いつでも歓迎します。
答え1
次のコマンドを使用して、一部のプログラムでサポートされているパケットを送受信できるネットワークインターフェイスを作成できます。 (あなたの場合、プログラムは何とかGNU Radioに接続されます。)火曜日/蛇口相互作用。
Documentation/networking/tuntap.txt
カーネルソースコードの引用:
TUN / TAPは、ユーザー空間プログラムのパケット受信と送信を提供します。物理媒体からパケットを受信する代わりに、ユーザ空間プログラムからパケットを受信し、物理媒体を介してパケットを送信するのではなく、ユーザに記録する簡単なポイントツーポイントまたはイーサネットデバイスと考えることができる。宇宙プログラム。
ドライバを使用するには、プログラムが
/dev/net/tun
適切なioctl()を開き、実行してネットワークデバイスをカーネルに登録する必要があります。ネットワークデバイスは選択したオプションに従ってtunXX
表示されます。tapXX
プログラムがファイル記述子を閉じると、ネットワークデバイスとそのパスの両方が消えます。選択したデバイスタイプに応じて、ユーザースペースプログラムはIPパケット(tunを使用)またはイーサネットフレーム(tapを使用)を読み書きする必要があります。どちらが使用されるかは、ioctl()が提供するフラグによって異なります。
パッケージは以下で提供されます。http://vtun.sourceforge.net/tunチューニングとタップデバイスの使用方法の2つの簡単な例が含まれています。両方のプログラムは両方のネットワークインターフェイス間のブリッジのように動作します。
br_select.c
- 選択されたシステムコールに基づくブリッジング。
br_sigio.c
- 非同期ioおよびSIGIO信号に基づくブリッジ。しかし、最良の例はVTunです。http://vtun.sourceforge.net
また見てくださいこれスタックオーバーフローの質問です。 Google では、多くのチュートリアルを見つけることができます。