linux下netfilter中在PRE_ROUTING点收到的sk_buff内容为什么始终为空

时间:2022-05-09 11:03:25
俺是这方面的新手,最近需要利用netfilter写点东西。俺在PRE_ROUTING点挂上了自己的函数,结果传进来的sk_buff里的内容始终为空,但上层应用能正常收到数据,不知道是什么情况,希望哪位高手能帮忙解释一下。以下是关键代码:

static unsigned int incoming_filter(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 *msg_buf = NULL;
struct iphdr *msg_ip_hdr = NULL;

if (skb == NULL)
{
printk("Parameter error, drop this packet.\n");
return NF_DROP;
}

msg_buf = (*skb);
if (msg_buf == NULL)
{
//程序始终进入这个分支,skb本身有值但这个二层指针的第一层就为空……
printk("No message content, packet accept. skb addr: %x\n", skb);
return NF_ACCEPT;
}

msg_ip_hdr = ip_hdr(msg_buf);
if (msg_ip_hdr == NULL)
{
printk("No IP information, packet accepted.\n");
return NF_ACCEPT;
}
printk("Packet dropped.\n");
return NF_DROP;
}

static struct nf_hook_ops my_in_filter = { { NULL, NULL },
(nf_hookfn*)incoming_filter,
THIS_MODULE, PF_INET,
NF_INET_PRE_ROUTING,
NF_IP_PRI_FIRST };

static int __init net_init_module(void)
{
nf_register_hook(&my_in_filter);
printk("Netfilter hook registered.\n");
return 0;
}

static void __exit net_cleanup_module(void)
{
nf_unregister_hook(&my_in_filter);
printk("Netfilter hook unregistered.\n");
}

module_init(net_init_module);
module_exit(net_cleanup_module);

俺用的内核是2.6.27的,写代码时发现网上能找到的大多数文档里写的系统函数都是老版本的,新版本的系统函数说明什么的哪都找不到,man也找不到,开发过程痛苦万分……现在俺开始怀疑这个问题是不是也是因为挂载点的参数有变化之类的问题导致的。另外哪位如果有新内核下相关函数的文档麻烦也提供一下,先谢谢了!

4 个解决方案

#1


貌似上层应用接收到的数据不需要 route,你的系统能 route 么?

#2


呃……我是在一个ubuntu8.10的虚拟机上做的开发……这个会影响么……?
现在把里面的代码改成直接NF_DROP的话上层就完全没包了,所以这段代码肯定是能进来的。但是不理解为什么sk_buff是个空的……

#3


你的hook函数的第二个参数错了,应该是struct sk_buff *skb, 而不是**skb。
static unsigned int incoming_filter(unsigned int hooknum,
                        struct sk_buff *skb,
                        const struct net_device *in,
                        const struct net_device *out,
                        int (*okfn) (struct sk_buff *))
hook函数的原型可以直接看内核代码的头文件$(SRCDIR)/include/linux/netfilter.h

#4


的确是这样,谢谢了!

#1


貌似上层应用接收到的数据不需要 route,你的系统能 route 么?

#2


呃……我是在一个ubuntu8.10的虚拟机上做的开发……这个会影响么……?
现在把里面的代码改成直接NF_DROP的话上层就完全没包了,所以这段代码肯定是能进来的。但是不理解为什么sk_buff是个空的……

#3


你的hook函数的第二个参数错了,应该是struct sk_buff *skb, 而不是**skb。
static unsigned int incoming_filter(unsigned int hooknum,
                        struct sk_buff *skb,
                        const struct net_device *in,
                        const struct net_device *out,
                        int (*okfn) (struct sk_buff *))
hook函数的原型可以直接看内核代码的头文件$(SRCDIR)/include/linux/netfilter.h

#4


的确是这样,谢谢了!