免费注册 查看新帖 |

Chinaunix

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

关于在netfilter中使用skb_copy发生的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-23 17:22 |只看该作者 |倒序浏览
本帖最后由 anhongkui 于 2010-11-24 09:23 编辑

在NF_IP_LOCAL_OUT注册了一个hook,   想将一个包变成两个包。



  1. #ifndef __KERNEL__
  2. #define __KERNEL__
  3. #endif

  4. #ifndef MODULE
  5. #define MODULE
  6. #endif

  7. #include <linux/module.h>
  8. #include <linux/skbuff.h>
  9. #include <linux/netdevice.h>
  10. #include <linux/config.h>
  11. #include <linux/ip.h>
  12. #include <linux/tcp.h>
  13. #include <linux/udp.h>
  14. #include <net/ip.h>
  15. #include <linux/netfilter_ipv4.h>



  16. static unsigned int doit(unsigned int hooknum, struct sk_buff **skb,
  17.                          const struct net_device *in,
  18.                          const struct net_device *out,
  19.                          int (*okfn) (struct sk_buff *))
  20. {

  21.     struct sk_buff *newskb = skb_copy(*skb, GFP_ATOMIC);
  22.     if (newskb  != NULL) {
  23.          okfn(newskb);
  24.     }
  25.     return NF_ACCEPT;
  26. }

  27. static struct nf_hook_ops mynetfilter = {
  28.     {NULL, NULL},
  29.     doit,
  30.     PF_INET,
  31.     /* NF_IP_PRE_ROUTING, */
  32.     NF_IP_LOCAL_OUT,
  33. #if 1
  34.     INT_MIN
  35. #else
  36.     NF_IP_PRI_FILTER - 1
  37. #endif
  38. };

  39. int init_module(void)           //注册模块函数
  40. {
  41.     return nf_register_hook(&mynetfilter);
  42. }

  43. void cleanup_module(void)
  44. {
  45.     nf_unregister_hook(&mynetfilter);
  46. }

  47. MODULE_LICENSE("GPL");


复制代码
这样子,只要 insmod test.o(2.4内核),且有数据包,则直接死机


因为设备无法接显示器,所以无法查错误。

希望有人能告诉我怎么回事,谢谢啦。


编译:
  1. gcc -c mynf.c -D__KERNEL__ -DMODULE -I /usr/src/linux-2.4/include -O -Wall
复制代码

论坛徽章:
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 [报告]
发表于 2010-11-23 19:30 |只看该作者
# static unsigned int doit(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 *newskb = skb_copy(*skb, GFP_ATOMIC);
#     if (newskb  != NULL) {
#          okfn(*skb);
#     }
#     return NF_ACCEPT;
# }

你这个地方的逻辑不对, 既然你都调用 okfn 将 skb 发出去了,为什么还 return NF_ACCEPT 呢。
修改为 return NF_STOLEN 试一下

论坛徽章:
0
3 [报告]
发表于 2010-11-24 09:22 |只看该作者
是这样的,我想将复制出来的包发出去,原始包继续走以前的流程(iptables规则链)

上边是我抄代码抄错了,应该是okfn(newskb);

论坛徽章:
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
4 [报告]
发表于 2010-11-24 10:29 |只看该作者
回复 1# anhongkui
如果你把注册点放到NF_IP_PRE_ROUTING上应该没问题吧?
还有对newskb的处理,可以试试用netif_rx(newskb)试试。

论坛徽章:
0
5 [报告]
发表于 2010-11-24 11:07 |只看该作者
谢谢2楼和4楼,是我的代码写错了。

我的代码写成了okfn(*skb);改成okfn(newskb)就ok了。

我太马虎了。~

论坛徽章:
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
6 [报告]
发表于 2010-11-24 11:36 |只看该作者
谢谢2楼和4楼,是我的代码写错了。

我的代码写成了okfn(*skb);改成okfn(newskb)就ok了。

我太马虎了 ...
anhongkui 发表于 2010-11-24 11:07


就是嘛。如果你 okfn 里面传递的 skb,传送完毕之后 skb 就释放了,你还要 return NF_ACCEPT,后续处理模块接收到的 skb 是 NULL,是要出问题的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP