2012-04-15 17 views
2

私はnetfilter hooksでアプリケーションを書く。なぜskb_transport_headerが正しく計算されないのですか?

それはskb_transport_header関数は(時には常にではない)を正しく計算しないようです。

struct tcphdr* tcp_header = NULL; 
tcp_header = (struct tcphdr*)skb_transport_header(skb); // somtimes incorrect address. 
tcp_header = (struct tcphdr*)((char*)ip_header + (ip_header->ihl * 4));// always correct address. 

どこが間違っているのですか?

+0

どのようなフックを使用しますか?操作の前にTCPタイプを確認できますか? –

+0

@IlyaMatveychikov:はい、私はTCPプロトコルをチェックします。 –

+1

私は、そのメソッドが異なる結果をもたらす場合にパケット解析を実行することによって問題を明確にすることを提案します。つまり、 '(struct tcphdr *)skb_transport_header(skb)'!= '(構造体tcphdr *)((char *)ip_header +(ip_header-> ihl * 4))' –

答えて

0

カーネルバージョンは非常にインポート情報です。Linuxネットワークカーネルでは、SKBのtransport_header(および他の多くのプロパティ)は、(ドライバによって)最初に作成されたときには設定されず、SKBのデータポインタは移動した。だからあなたのフックが低い、別名BRIDGEレベルであれば、それはあなたがそれにアクセスするときに設定されていないかもしれません。

4

あなたがここでそれを確認することができます。 http://www.roman10.net/how-to-filter-network-packets-using-netfilterpart-2-implement-the-hook-function/ 問題はnetfilterのパケットは、物理層から上がるとき、あなたはそれがTCP層に到達する前にパケットをキャッチし、いくつかの機能は、プロセスではなく、ネットワーク層で実装しています。

+0

の場合、パケット全体をダンプする必要があります。ありがとうございました..私は約2時間、私の着信データが正しくない理由を理解しようとしていた! – antfx

関連する問題