2

Linux カーネル用の NAT モジュールを実装しようとしています。直面している問題は、着信フックでの TCP パケットの場合、宛先ポートを指すと予想されるポインターがそうしないことです。発信フックのスニペット:

unsigned int incoming_hook(unsigned int hooknum,
        struct sk_buff *skb,
        const struct net_device *in,
        const struct net_device *out,
        int (*okfn)(struct sk_buff*))
{
struct iphdr *iph;
struct tcphdr *tcph;
unsigned int dst_addr;
unsigned short dst_port;
unsigned short *dpptr;

printk(KERN_ALERT "****Incoming hook starts****\n");

if (!skb)return NF_ACCEPT;

iph = ip_hdr(skb);
if (!iph)return NF_ACCEPT;

dst_addr = ntohl(iph->daddr);     // works correct

printk(KERN_ALERT " dst addr is %d \n", dst_addr);  


if (iph->protocol==IPPROTO_TCP)
{ 
    tcph = tcp_hdr(skb);
    if (!tcph)return NF_ACCEPT;

    dst_port = ntohs(tcph->dest);   // gives incorrect result (unexpected.)
    // dpptr = (unsigned short *)((char *)iph + 22); // just a try. does not work either

    printk(KERN_ALERT " dst port is  %d  \n", *dpptr);
    dst_port = ntohs(*dpptr);

// continues with the NAT code

ただし、送信元アドレスと送信元ポートを変更する発信フックでのパケットに対しても同じことが機能します。発信パケットに対する次の動作

tcph = tcp_hdr(skb);
  if (!tcph)return NF_ACCEPT;

  src_port = ntohs(tcph->source);

着信パケットの IP ヘッダー サイズに問題があるか、構造体 tcphdr にバグがあるか、tcphdr->dest ポインターに問題があるか? それとも、もっと間違っている可能性がありますか?

助けが必要。ありがとう。

4

1 に答える 1

2

同じ問題があり、クラスメートとクラスの先生のおかげで解決しました。

netfilterの着信フックを介して到着するパケットの場合は、使用する必要があります+20(現在は +22 になっています)。

コード例:

skb_linearize(skb);
struct tcphdr* tcp_header;
tcp_header = (struct tcphdr *)(skb_transport_header(skb)+20);
于 2017-04-19T06:23:23.207 に答える