web-dev-qa-db-ja.com

ネットワークパケットでのタスクとカスタムロジックの実行

Linuxサーバーで特定の方法でパケットを処理する方法を探しています-すべてのパケットでカスタムロジックを実行してから、(おそらく)パケットに対していくつかのアクションを実行し、カーネルに必要に応じてルーティングさせる必要があります。私の使用固有のユースケースは次のとおりです。

  1. (ホスト上のLinuxブリッジ内で渡されている)IGMPパケットをキャッチし、それらの内部フィールド(マルチキャストグループとチェックサム)を、許可されている値のリストと照合して検証します。一致するものが見つからない場合は、パケットをドロップします。
  2. IPv6パケット(Linuxマシン経由でルーティングされている)を受信したら、送信元アドレスを「疑わしい」アドレスの辞書と比較します。 trueの場合、パケットを開き(HTTPヘッダーと内部まで)、いくつかのテストを実行して、パケットが有効であることを確認します(たとえば、ポート番号、コンテンツの長さ、ヘッダー構造を確認します)
  3. TCPセグメントをキャプチャしたら、そこで有効になっているフラグの数を確認し、その数が5より大きい場合は、パケットのコピーを別の宛先(IDSアプライアンスなど)に送信して転送しますパケットは正常です。

tcXDPDPDKおよびその他のFD.ioソリューション(VPP)などのLinuxユーティリティとツールを見てきましたが、私が望むものを達成するために、これらのテクノロジーを簡単な方法で解決する簡単な方法を見つけることができませんでした。私の検証とアクションが最新の柔軟な環境とコードで実行できる場合は望ましいです(ここではpythonまたはJavaを要求しませんが、bashは一部の人よりも望ましいでしょうカーネルのようなCコード)。

Linuxマシンでそのようなアクションを実装する一般的な方法は何ですか?上記のすべての変更と機能をプログラムで許可するベストプラクティスまたはテクノロジーはありますか?

乾杯。

1
FitzChivalry

XDP INGRESSの使用は、igmpおよびtcpシナリオの理想的な候補です。ただし、ipv6の場合は、チェックと境界が多いため、どのように変換されるかわかりません。ここでの欠点は、特定のユーザーアプリケーションがないため、ユーザーゼロコピーモードを使用できず、eBPFがサンドボックスJITでパケットごとに処理することです。 IDのパケットミラーも難しくなります。

TAPまたはKNIを使用したDPDKは、コストをバッチ処理して償却できるため、実際に使用する方法です。ただし、これにはユーザースペースの傍受が含まれます。

これが私の提案です

  1. Hw ackまたはflow.directorがある場合は、関心のあるトラフィックをカスタムポートまたはキューに分岐します。
  2. カスタムポートでDPDKを使用して検査します。 idaのミラーと一致する場合は、tapまたはkniを介してカーネルに注入します。

または

  1. Hwフィルタがない場合は、ユーザースペースebpfを試して、着信トラフィックからigmp、ipv6、およびtcpコンテンツをフィルタリングします。
  2. 次に、ユーザースペースアプリケーションはフィルターとミラーロジックを実行し、カーネルに注入します。
1
Vipin Varghese