ポート/プロトコルなど、何らかの形で「正常」であるだけでなく、キューの長さやその他の外部要因などの他の側面にも基づいて、パケットをルーティングできるシステムを構築する必要があります。 。私のルーターは、2つの内部インターフェイス(802.11)と2つの外部インターフェイス(1つはADSL、1つはLTE)で構成されています。そこで、外部プログラムを介して各パケットを調べ、どのインターフェイスをルーティングするかを決定したいと思います。
Iproute2を調べましたが、各パケットを外部プログラムに渡す方法や、各パケットのルートを動的に選択する方法が見つかりませんでした。
だから質問:これを行うための最良の方法は何ですか?この方向に進むツールはすでにありますか、それとも自分で作成したものに依存して、Linux標準ツールを介してパケットを渡す必要がありますか?
Netfilter (iptables)には queue module フレームをユーザースペースプログラムに送信します。パケットを調べるために、さまざまな言語( c 、 python 、Perlなど)のライブラリを使用できます。フレームを処理した後、ACCEPTまたはDROP判定、元のフレームまたは変更されたフレーム、およびマークを設定するオプションを返します。
マークを使用して、netfilterチェーンの残りの部分でこのパケットを異なる方法で処理し、ルーティングマークを変更して特定のルーティングテーブルを選択できると思います。
これは、非常に低レベルのデバイス処理よりも洗練されたソリューションですが、ユーザースペースの実装の選択によってはパフォーマンスの問題になる場合があります。
別のプロジェクトでこれを使用して、壊れたクライアントからの着信DHCPフレームを変更しましたが、マークを使用したことはありません。
ユーザースペースルーティングは、デフォルトルートをtun
デバイスに向け、ユーザースペースプログラムに受信した各パケットを検査させることで実現できます。これは非効率的で脆弱なアプローチですが、機能するように作られています。HenningRoggeのおかげで、そのように機能するAODVv2実装がありました。
もちろん、他のオプションは、カーネル内にルーティングプロトコルを実装することです。AODV/ DYMO/AODVv2のほとんどの実装はそのように機能します。
この種のタスクに着手する前に、個々のパケットごとにルーティングを決定する必要があるかどうかを慎重に検討することをお勧めします。可能であれば、実際の転送をカーネルに任せながら、ルーティングテーブルを動的に操作することをお勧めします。このアプローチを使用して達成できることの例は、 このドラフトペーパー に示されています。 (免責事項:私は共著者です。)
どのようなハードウェアを使用していますか?組み込みデバイスで作業しているようですが、その場合はおそらくnetfilterオプションを使用する必要があります。ただし、自由に使えるリソースが多い場合は、OVS( http://openvswitch.org/ )の使用を検討する必要があります。これは、ソフトウェア定義ネットワークの事実上のオープンソース標準です。
ソフトウェアデファインドネットワーキングには、「データプレーン」と「コントロールプレーン」の概念があります。パケットは、データプレーン内の物理/仮想スイッチ間を移動します。コントロールプレーンでは、ソフトウェアがデータプレーンを介してパケットを転送する方法についてスイッチに指示を送信します。
コンテナーにOVSをセットアップし、それをシステムのToR(ルーターの上部)スイッチとして扱うことができます。すべての着信パケットをOVSにルーティングし、それらをどう処理するかを決定させます。ソフトウェアがopenflow命令をスイッチに送信します。
始めるためのリソースは次のとおりです。
幸運を!