2

パケット転送(ルーティングではない)の途中に入りたいです。たとえば、システムはホストとそのゲートウェイ間のレイヤー 2 ブリッジです。レイヤー7の文字列または「foo」をチェックし、結果に基づいてパケットを転送/ドロップ/遅延したい。私が問題を抱えているのは、パケットの傍受です。

これまでに読んだこと:

BPF デバイスからパケットのコピーを取得できることはわかっています (Steven McCanne と Van Jacobson による Usenix の論文http://www.tcpdump.org/papers/bpf-usenix93.pdf )。スニッフィングには適していますが、私には適していません。

PF デバイスにアクセスして、転送またはドロップの決定に適したフィルタリング ルールを設定できますが、検査には適していません。男pf(4)

パケットを ALTQ キューに入れることはできますが、キューにある個々のパケットにアクセスする方法がわかりません。男 altq(9)

PF(/usr/src/sys/contrib/pf/net)、PFCTL(/usr/src/contrib/pf/pfctl)、ALTQ(/usr/src/sys/contrib/)のソースコードも調べました。 altq/altq)。FreeBSD 9.1 マシン上

私は C の専門家ではありませんが、それは得意です。

多分私は今日、すべての読書で疲れていて、些細なことを見逃しています. もしそうなら、私を許してください。さらに、これは、このテーマを調べている人にとって非常に良い発見になるでしょう.

PSパケット内の「foo」を検出し、その要求への応答用のフィルターを設定して、その応答が戻ってくるのを拒否することにより、「foo」の流れを制御する方法があります。これは私が達成しようとしているものではありません。パケットがシステムから出てはならない場合は、出てほしくありません。

EDIT 2 PS Linuxでこれを行う素晴らしい方法があります。libnetfilter_queue を使用して、ここで言及したすべてを Linux で実現できます。Linuxでそれを行う方法に関するチュートリアルがたくさんあるので、ここにソリューションを投稿することはしません.

結論として、BSDでこれを行う方法についての答えをまだ探しています。私が理解できる限り、pf に基づいてラッパー/ライブラリを作成する必要があります (ネット上にそのようなものがないため、そうでなければ既に見つけているはずです)。これは libnetfilter_queue ライブラリで libnetfilter と同じことを行います。または、どういうわけか libnetfilter を掘り下げて FreeBSD に移植することもできますが、それは iptables に基づいているため、libnetfilter ライブラリを掘り下げて得られるのはロジックとアルゴリズムだけであり、実際のコード自体ではありません。私に使用します。

4

3 に答える 3

1

FreeBSD 9.1 には、netmap と呼ばれるパケット アクセス用のユーザー空間フレームワークがあります。最近導入され、驚異的なパフォーマンススケールを備えています。それは非常に単純ですが強力なことを行います.NICバッファをメモリのユーザー空間部分にmmapし、ホストスタックからパケット処理を切り離すだけです.これはまさに私が必要としていたものでした.

この商品のリファレンスが必要な場合は、 man netmap (4)を参照してください。

于 2013-08-16T08:48:35.857 に答える
0

BSD実装の「Divert Sockets」もチェックしてください。Netmap とは異なり、ゼロコピー (IMHO) ではありませんが、処理するパッケージをフィルタリングするために必要なフィルターを実装するために ipfw と連携できます。

于 2016-01-18T15:00:11.397 に答える
0

OpenDPIまたはnDPIをご覧ください。

于 2013-08-11T23:11:36.820 に答える