免费注册 查看新帖 |

Chinaunix

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

[内核模块] 请教netfilter抓混杂模式数据包 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-14 18:59 |只看该作者 |倒序浏览
目前在做用netfilter hook的方式抓包,想抓混杂模式下的数据包。查看内核代码在ip_input.c下面的ip_rcv函数里面
        if (skb->pkt_type == PACKET_OTHERHOST)
                goto drop;
注释掉这两句后,neitfilter可以抓到混杂模式下的数据包。但是在抓包时发现一个问题,cpu的软中断占用资源很高,达到85%si.导致用户态和内核其他模块执行时速度很慢,查了下资源说网卡要用napi的模式,不能用传统的中断模式,但具体怎么实现不是很清楚。各位大神有没有碰到这种情况,有知道的给指点一下,兄弟在此感谢了!

论坛徽章:
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
2 [报告]
发表于 2013-08-15 13:10 |只看该作者
回复 1# zmhzcy
抓到之后,你做了什么处理

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2013-08-15 17:17 |只看该作者
回复 1# zmhzcy
目前在做用netfilter hook的方式抓包,想抓混杂模式下的数据包。查看内核代码在ip_input.c下面的ip_rcv函数里面
        if (skb->pkt_type == PACKET_OTHERHOST)
                goto drop;
注释掉这两句后,neitfilter可以抓到混杂模式下的数据包。但是在抓包时发现一个问题,cpu的软中断占用资源很高,达到85%si.导致用户态和内核其他模块执行时速度很慢,查了下资源说网卡要用napi的模式,不能用传统的中断模式,但具体怎么实现不是很清楚。各位大神有没有碰到这种情况,有知道的给指点一下,兄弟在此感谢了!



估计你的内核(网卡驱动)可能已经工作在napi模式了,问题应该出在你添加的处理逻辑上。建议说一下你添加的代码都做了什么工作
   

论坛徽章:
0
4 [报告]
发表于 2013-08-18 13:54 |只看该作者
回复 2# Godbach
抓到后我拿到想要的一些数据,就把这个数据包在netfilter模块中 return NF_DROP;

   

论坛徽章:
0
5 [报告]
发表于 2013-08-18 14:47 |只看该作者
回复 3# 瀚海书香

在ip_input.c文件的ip_rcv()函数中
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
        struct iphdr *iph;
        u32 len;

        /* When the interface is in promisc. mode, drop all the crap
         * that it receives, do not try to analyse it.
         */
        //if (skb->pkt_type == PACKET_OTHERHOST)
        //        goto drop;


        IP_UPD_PO_STATS_BH(dev_net(dev), IPSTATS_MIB_IN, skb->len);

        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
                IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INDISCARDS);
                goto out;
        }

        if (!pskb_may_pull(skb, sizeof(struct iphdr)))
                goto inhdr_error;

        iph = ip_hdr(skb);

        /*
         *        RFC1122: 3.2.1.2 MUST silently discard any IP frame that fails the checksum.
         *
         *        Is the datagram acceptable?
         *
         *        1.        Length at least the size of an ip header
         *        2.        Version of 4
         *        3.        Checksums correctly. [Speed optimisation for later, skip loopback checksums]
         *        4.        Doesn't have a bogus length
         */

        if (iph->ihl < 5 || iph->version != 4)
                goto inhdr_error;

        if (!pskb_may_pull(skb, iph->ihl*4))
                goto inhdr_error;

        iph = ip_hdr(skb);

        if (unlikely(ip_fast_csum((u8 *)iph, iph->ihl)))
                goto inhdr_error;

        len = ntohs(iph->tot_len);
        if (skb->len < len) {
                IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INTRUNCATEDPKTS);
                goto drop;
        } else if (len < (iph->ihl*4))
                goto inhdr_error;

        /* Our transport medium may have padded the buffer out. Now we know it
         * is IP we can trim to the true length of the frame.
         * Note this now means skb->len holds ntohs(iph->tot_len).
         */
        if (pskb_trim_rcsum(skb, len)) {
                IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INDISCARDS);
                goto drop;
        }

        /* Remove any debris in the socket control block */
        memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));

        /* Must drop socket now because of tproxy. */
        skb_orphan(skb);

        return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,
                       ip_rcv_finish);

inhdr_error:
        IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INHDRERRORS);
drop:
        kfree_skb(skb);
out:
        return NET_RX_DROP;
}

注释掉            //if (skb->pkt_type == PACKET_OTHERHOST)
        //        goto drop;
保证混杂模式的数据包可以进入到netfilter的hook里面,在netfilter的hook里面,我拿到想要的数据包信息后,return NF_DROP,把数据给抛掉!逻辑很简单,内核接收数据包把这些包扔到hook里面,在hook里面抛掉

论坛徽章:
1
处女座
日期:2013-08-19 12:39:10
6 [报告]
发表于 2013-08-18 19:21 |只看该作者
你把全部包都收进来处理,当然占cpu了。

论坛徽章:
0
7 [报告]
发表于 2013-08-19 12:14 |只看该作者
回复 6# wsgtrsys
请问有没有其他方式抓混杂模式数据包,数据包量很大,40Gb/s

   

论坛徽章:
1
处女座
日期:2013-08-19 12:39:10
8 [报告]
发表于 2013-08-19 13:07 |只看该作者
回复 7# zmhzcy


    用intel的dpdk试下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP