netfilter传入钩子:struct tcphdr - > dest指针没有指向正确的位置?

时间:2012-11-25 22:49:40

标签: tcp linux-kernel nat netfilter

我们正在尝试为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

然而,对于更改源地址和源端口的传出挂钩的数据包也是如此。 Follwing适用于传出数据包

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

  src_port = ntohs(tcph->source);

传入数据包的IP头大小是否有问题或者struct tcphdr有错误或者tcphdr-> dest指针有问题?还是可能出现问题?

需要帮助。 谢谢。

1 个答案:

答案 0 :(得分:2)

我有同样的问题,感谢一些同学和the class' teacher.

对于通过netfilter的传入挂钩到达的数据包,您应该使用+20(目前您的目的地为+22)。

示例代码:

skb_linearize(skb);
struct tcphdr* tcp_header;
tcp_header = (struct tcphdr *)(skb_transport_header(skb)+20);