免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2464 | 回复: 7
打印 上一主题 下一主题

[网络子系统] 如何在NF_IP_PRE_ROUTING直接把数据包送到第4层? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-02 17:57 |只看该作者 |倒序浏览
本帖最后由 lawrence2013 于 2013-04-02 18:01 编辑

我想把在NF_IP_PRE_ROUTING hook到的一些数据包直接送到4层,我直接调用了ip_local_deliver()函数,但似乎有问题,发udp包的时候不能成功送到4层,发icmp包的时候kernel panic。我该如何解决这个问题?谢谢!

我的代码如下:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/netdevice.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/udp.h>
#include <net/icmp.h>
#include <linux/netfilter_ipv4.h>

const char* hooks[] ={"NF_IP_PRE_ROUTING"};

unsigned int
header(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* nskb;
   struct iphdr *iph = NULL;
  
   nskb = skb;
   if(nskb==NULL)
   {
     printk("%s\n", "*skb is NULL");
     return NF_ACCEPT;
   }
  
   iph = ip_hdr(nskb);
   if(iph == NULL)
   {
     printk("%s\n", "*iph is NULL");
     return NF_ACCEPT;
   }

   if ((iph->protocol == IPPROTO_UDP) || (iph->protocol == IPPROTO_ICMP)){

           ip_local_deliver(nskb);
           printk("------delivered  --------\n");
           return NF_STOLEN;
   }
     
   return NF_ACCEPT;
}

                             
static struct nf_hook_ops header_ops[] = {
        {
                .hook     = header,
                .owner    = THIS_MODULE,
                .pf       = PF_INET,
                .hooknum  = 0, //NF_IP_PRE_ROUTING,
                .priority = NF_IP_PRI_FIRST,
        },
};

static int __init init(void)
{
    int ret;
    ret = nf_register_hooks(header_ops, ARRAY_SIZE(header_ops));
    if (ret < 0) {
        printk("http detect:can't register header_ops detect hook!\n");
        return ret;
    }
    printk("insmod header_ops detect module\n");
    return 0;
}

static void __exit fini(void)
{
    nf_unregister_hooks(header_ops, ARRAY_SIZE(header_ops));
    printk("remove header_ops detect module.\n");
}

module_init(init);
module_exit(fini);

论坛徽章:
0
2 [报告]
发表于 2013-04-02 18:03 |只看该作者
学习下。。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2013-04-02 23:05 |只看该作者
回复 1# lawrence2013
你这么做跳过了很多三层要对数据包的处理动作,有些动作虽然是在 NF 上,但是是通用的。

建议你先了解一下网络层一般都要对数据包做哪些处理,然后再考虑直接传输到四层。


   

论坛徽章:
0
4 [报告]
发表于 2013-04-02 23:48 |只看该作者
多谢你的回复。我应该就跳过了一个函数,ip_rcv_finish,这个函数来查找确定是不是本地的数据包,是本地就调用ip_local_deliver,不是本地就调用ip_forward,从理论上似乎没啥问题?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2013-04-03 09:44 |只看该作者
回复 4# lawrence2013
那你确定已经将所有 dst ip 不是本地的报文都已经过滤掉了吗。

而且不仅仅是查询,还有路由的设置等。这些动作你都得确认,如果你跳过了,对你是没有影响的。


   

论坛徽章:
0
6 [报告]
发表于 2013-04-03 15:01 |只看该作者
似乎跟这个问题没关系,我设置仅捕获到本地的icmp包,系统直接panic了。我尝试在NF_IP_LOCAL_IN的钩子上,系统似乎也panic了...

论坛徽章:
0
7 [报告]
发表于 2013-04-05 21:24 |只看该作者
你挂在loca_in的位置,不就死循环了么?
挂在pre_routing的最开始的话,就把conntrack和defrag的hook跳过去了,但是local_in里面的一些hook,可能会用到ct相关数据,这里可能出现异常。
你可以调用ip_local_deliver_finish,不要调用ip_local_deliver,我觉得这样更可靠一些。

论坛徽章:
0
8 [报告]
发表于 2013-04-08 01:31 |只看该作者
嗯,多谢你的提醒。那天GOOGLE看到有人说在LOCAL_IN挂deliver成功了,于是我就直接试了吧,忘了钩子直接在deliver上了。

不过调用ip_local_deliver_finish似乎也有问题,那我慢慢调调吧,似乎没啥问题的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP