免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1993 | 回复: 8

[实践] 关于网络钩子函数 [复制链接]

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2013-08-12 18:35 |显示全部楼层
已经知道接收发送函数很大一部分是一个完整的软中断过程。
中间的钩子函数处理完返回值有NF_DROP NF_STOLEN NF_ACCEPT;
但问题是如果即使是返回点是不是有可能实现软中断过程的处理终结?
或者我想在某个钩子处处理完后立刻终结这个软中断长链的处理过程该如何做?

论坛徽章:
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
发表于 2013-08-13 08:12 |显示全部楼层
回复 1# smalloc
已经知道接收发送函数很大一部分是一个完整的软中断过程。
中间的钩子函数处理完返回值有NF_DROP NF_STOLEN NF_ACCEPT;
但问题是如果即使是返回点是不是有可能实现软中断过程的处理终结?
或者我想在某个钩子处处理完后立刻终结这个软中断长链的处理过程该如何做?


貌似不好处理吧。因为你的钩子处理的可能只是一个skb的副本,还有很多其他的流程在处理这这个副本。比如你在钩子处drop数据包,另一个应用注册了ptype_all类型的协议处理,那么不管你的钩子如何处理,ptype_all都是可以收到数据包处理的。

   

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2013-08-13 09:47 |显示全部楼层
回复 2# 瀚海书香


    也就是一个数据包过来。在哪里终结处理是确定的?只有几个确定的结束点?

论坛徽章:
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
发表于 2013-08-13 09:49 |显示全部楼层
回复 1# smalloc
发包的时候,直接调用 dev_queue_xmit 之类的接口?


   

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2013-08-13 10:11 |显示全部楼层
一般来说个一个包的流程应该是:
{
fun();
fun();
NF();
fun();
fun();
}
每个fun()又递归为上面的形式。
想终结一个这样的流程只能长转跳。

论坛徽章:
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
发表于 2013-08-13 10:11 |显示全部楼层
回复 3# smalloc
也就是一个数据包过来。在哪里终结处理是确定的?只有几个确定的结束点?


数据包被终结继续处理的点比较多,但并不是说这个点之后数据包就被彻底放弃了,因为数据包可能走了另一个流程了。

1、ip数据包头非法
2、数据包校验和错误
3、未找到删除协议处理函数
4、未找到相应的socket对应
5、数据包提交到socket接收队列
。。。。
   

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2013-08-13 17:20 |显示全部楼层
回复 6# 瀚海书香


    http://bbs.chinaunix.net/thread-4082396-1-1.html

参看这个帖子还是可以的。
包的处理流程通常是:
{
fun();
fun();
fun();
fun();
NF(fun());
}
而NF()中调用的fun()
又可以具有如上形式,这样本质上就是一个函数链,在NF处有选择终止往下走的流程。或者将余下的调用链完全替换成自己的流程。

论坛徽章:
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
发表于 2013-08-14 13:26 |显示全部楼层
回复 7# smalloc

参看这个帖子还是可以的。
包的处理流程通常是:
{
fun();
fun();
fun();
fun();
NF(fun());
}
而NF()中调用的fun()
又可以具有如上形式,这样本质上就是一个函数链,在NF处有选择终止往下走的流程。或者将余下的调用链完全替换成自己的流程。


可以这么理解。但问题的关键是你所关注的skb并不只走着一个流程,还可能在另一个流程里。比如tcpdump的时候,不管你是否drop,它都可以抓到数据包。
   

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2013-08-14 13:48 |显示全部楼层
回复 8# 瀚海书香


    2个流程中走的包应该算是2个包了。虽然可能共用数据区,不过那是被kfree_skb所隐藏的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP