2012-03-27 11 views
0

netfilterを使用してすべてのイーサネットパケットをフックできますか?Linuxカーネルモジュール

ipv4またはipv6からパケットを取得できます。

編集:

上記のコードは私のカーネルモジュールです。 1つのイーサネットインターフェイスに到着したすべてのパケットを別のインターフェイスにリダイレクトしたいのです。このモジュールは、パケットが到着した(テストのための)デバイスの名前を印刷します。このフックで私はちょうどパケットの魔法の種類を取得ipv4ですが、私はすべての種類を取得したい。

私はウェブで検索しましたが、イーサネットインターフェイスをバイパスするすべてのパケットを取得するためにフックを設定する方法が見つかりませんでした。

よろしく

nfho nf_hook_ops構造体の静的

int型hook_func(構造体sk_buffの*のSKB)

{構造体ethhdr * ETH。

のprintk( "デバイス:%sの\ nは、skb-> DEV->名);

}

int型はinit_module(){
のprintk(" フックモジュールのオンライン\ n "は!) ;

nfho.hook =(nf_hookfn *)hook_func;

nfho.hooknum = NF_IP_PRE_ROUTING;
nfho.pf = PF_INET; nfho.priority = NF_IP_PRI_FIRST;(& nfho);

return 0; }

/*クリーンアップルーチン* /無効cleanup_module(){

のprintk( "オーバーとアウト\ N!"); nf_unregister_hook(& nfho); }

+0

あなたが尋ねた唯一の質問への短い答えは「はい」ですが、それがあなたの全体的な質問であれば、それは最も近い価値があります(間違ったサイト*および*一般的な参照)。あなたの全体的な質問ではない場合は、より具体的にする必要があります(あなたがするまで、質問はまだまだ価値があります)。 – dmckee

+0

私の投稿を再編集します。あなたが私を助けることができれば、私は感謝します。宜しくお願いします! – Ricardo

+0

いいえ、あなたはそのためにnetfilterを使うことはできません。あなたはbridge-netfilterを使う必要があります。 – ninjalj

答えて

0

確かに、私が大丈夫なら、あなたはただちにすべてのEther検証済みパケットを受け入れ、別のインターフェイスに渡しても構いません。場合 は、単にカーネルファイルが含ま:

#include <linux/if_ether.h> 

あなたがでヘッダーを取得:

struct ethhdr *hdr = eth_hdr(skb); 
// *skb is a ptr !! 

とエーテルはいくつかの値ethhdr構造体のうち をチェックすることで有効であることを確認してください。 その後、ローカルホストから送信されたか、または他のインターフェイスにパケットのように受け入れる場合は、アドレスを変更してください。

関連する問題