4

我正在尝试将从机器传出的所有数据包的源 IP 修改为我在此内核模块中指定的内容,但是每次我尝试访问nh.iph->saddr时,我都会在编译时收到一个错误,提示Struct sk_buff 没有成员命名为 nh
我在这里做错了什么?我错过了一些标题或什么?

#include <linux/module.h>       
#include <linux/kernel.h>       
#include <linux/init.h>         

#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>

#include <linux/skbuff.h>
#include <linux/ip.h>                  /* For IP header */

#include <linux/inet.h> /* For in_aton(); htonl(); and other related Network utility functions */ 


static struct nf_hook_ops nfho;


unsigned int hook_func(unsigned int hooknum,
                       struct sk_buff **skb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *))
{
    struct sk_buff *sb = *skb;
    struct in_addr masterIP;

    masterIP.s_addr = htonl (in_aton("192.168.1.10")); 
    sb->nh.iph->saddr = masterIP.s_addr;
    return NF_ACCEPT;
}

请注意,我正在运行 Ubuntu 10.04 LTS 64 位
内核 2.6.32-33

4

2 回答 2

13

在您的内核版本中struct sk_buff已更改。它不再有那些成员。要访问 ip 标头,您应该尝试:

#include <linux/ip.h>

struct iphdr* iph = ip_hdr(skb);

然后只需使用iph变量来更改地址,例如:

iph->saddr = ....
iph->daddr = ....

此外,不要忘记您可能需要重新计算ip和可能的传输数据包校验和。

于 2012-04-05T08:29:23.697 回答
-1

您可以在 'include/linux/skbuff.h' 中找到命中 sk_buff 的定义。

它没有 nh 字段,它解释了您看到的编译错误。它确实有一个“network_header”字段,这可能是您正在寻找的。

于 2012-04-05T08:30:13.410 回答