8

skbをprerouting Linuxネットワークスタックにプッシュしたい。これを行う方法はありますか? 私はdev_queue_xmit()netif_rx()関数を使用しましたが、私は彼らがprerouting Linuxネットワークスタックのskbを押すことはできないと思います。Linuxネットワークスタックの特定のポイントでskbを押す方法は?

enter image description here

+0

など、フィルタ、IPV4の実装は表のチェックを開始どこである、あなたが探している機能がip_queue_xmit()でくださいと思いますか?カーネルのバージョンがなくても難しいです。 – HighOnMeat

+0

@ペガサス私はカーネル3.2を使用しています –

+1

本当に達成しようとしていますか?どこから出発するのにskbを押してみたいですか?私は詳細を教えてください –

答えて

1

私はあなたのlibpcapまたはlibnetfilter_queue以下、まとめてユーザランドキューイングと呼ばれたいと思います。ユーザーランドのキューイングは、あなたが定義したいくつかのルールに一致するすべてのパケットをユーザランドアプリケーションにルーティングします。 dev_queue_ *関数とnetif_ *関数はカーネルレベルのルーティングに適用され、ユーザランドアプリケーションには関係ありません。

ユーザーランドのキューイングにはパフォーマンス上の影響があり、使用するライブラリによっては、パケットをネットフィルターのキューに再注入する特定の方法を使用する必要があります。

2

私は完全にはっきりしていませんここではこのskb由来です。ユーザーランドでは、これを行うには2つの方法があります。 1つは、tunデバイスを使用することです(単純にパケットを書き込む)。もう1つは、libpcap(これは受信パケットの中に隠された生のパケットを送信することがほとんど知られていません)を使用することです。

ioctl(おそらく独自にioctlを追加することを意味する)を登録し、次にユーザースペースからioctlを呼び出すことで、これを行うとします。カーネルを変更せずにこれを達成できるときに、なぜそれをやりたいのかがすぐに分かりません。しかし、もしあなたがこれをやりたければ、私がすることはtunドライバーが使用するパスに従って、write()-tunデバイスの新しいioctlに相当することに相当します。これは、パケットのソースとして機能するために、tunのようなインターフェイスがぶら下がっていることを意味するかもしれません。私はシステム内のパケットが疑わしいのソースインターフェイスの種類が必要です。

+0

これはパケットのペイロードがユーザスペースから作成された後、私はこのパケットを自分のカーネルモジュールにioctlしたいのですが、ユーザスペースからパケットを取得し、新しいskbを割り当ててパケットペイロードを追加することを知っています。ネットワークスタックのポイントを事前にルーティングすることができます。 –

+0

なぜこの場合、 'netif_rx()'が間違っていると思いますか?これ(正確には 'netif_rx_ni()')は 'drivers/net/tun.c'が使用するものです。私はあなたの問題が間違った機能を呼んでいるのではないと思っていますが、あなたの 'skb 'がインターフェイスから来ていると追跡されていない限り(あなたのものではない)、あなたが意図したように入力インターフェースを調べる事前ルールがどのように機能するか)。これが私が 'tun'デ​​バイスの使用を提案し、カーネルが変更されない理由です。 – abligh

+0

@abligh:私はnetfilterのルーティング前のフックハンドラでskb_copy()を行い、そのデータを変更して、元のskbの隣に戻して再注入したい。各受信パケットは2つのパケットに変換され、別々にルーティングされます。私はNF_ACCEPTを返す前にリンクされたリストを介してコピーされたskbを合法的なものに貼りつけようとしましたが、うまくいかなかった。これにどのようにアプローチするのか?ありがとう。 – wick

0

私はあなたのカーネルのバージョンと、より精巧な可能性があり

関連する問題