免费注册 查看新帖 |

Chinaunix

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

linux内核3.0.0-通过sk_buff读取tcp端口的问题!急!谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-30 15:25 |只看该作者 |倒序浏览
我现在用的是ubuntu 11.10,内核是3.0.0-17
问题是我最近想写一个基于netfilter框架的流量程序。现在struct sk_buff结构变了

struct sk_buff {
  .
  .
  sk_buff_data_t transport_header;
  sk_buff_data_t network_header;
  sk_buff_data_t mac_header;
  .
  .
}

现在我在框架中挂一个钩子,怎么运用这个sk_buff结构读出包的目的端口啊?急!!谢谢!
  1. #include <linux/module.h>
  2. #include <linux/tcp.h>
  3. #include <linux/kernel.h>
  4. #include <linux/skbuff.h>
  5. #include <linux/ip.h>
  6. #include <linux/netfilter.h>
  7. #include <linux/netfilter_ipv4.h>

  8. MODULE_LICENSE("GPL");

  9. unsigned char *deny_port = "\x00\x16";

  10. struct nf_hook_ops hookops;
  11. struct tcphdr *tcpth;

  12. unsigned int hook_func(unsigned int hooknum,
  13.                            struct sk_buff *skb,
  14.                            const struct net_device *in,
  15.                            const struct net_device *out,
  16.                            int (*okfn)(struct sk_buff *))
  17. {
  18.     tcpth = NULL;
  19.     tcpth = tcp_hdr(skb);
  20.     printk("source port = %s\n",tcpth->source);
  21.     printk("dest port = %d\n",tcpth->dest);
  22.     printk("len = %d\n",skb->len);
  23.     return NF_ACCEPT;
  24. }

  25. static int example_init(void)
  26. {
  27.    hookops.hook = hook_func;
  28.    hookops.hooknum = NF_INET_LOCAL_IN;
  29.    hookops.pf = PF_INET;
  30.    hookops.priority = NF_IP_PRI_FIRST;

  31.    nf_register_hook(&hookops);
  32.    printk("example module install into kernel!\n");
  33.    return 0;
  34. }

  35. static void example_exit(void)
  36. {
  37.    nf_unregister_hook(&hookops);
  38.    printk("example module removed from kernel!\n");
  39. }

  40. module_init(example_init);
  41. module_exit(example_exit);
复制代码
我输出的dest值一直都是69,source也不确定值,会改变?不知道问什么?是我tcp头地址读错了吗?谢谢

还有一个问题为什么在钩子函数中输出skb->data_len的值是0?

论坛徽章:
0
2 [报告]
发表于 2012-04-30 15:28 |只看该作者
额,那个printk("source port = %s\n",tcpth->source);打错了,是%d的。最后这个的值一直都是69,不管是什么包?求解,谢谢!

论坛徽章:
0
3 [报告]
发表于 2012-04-30 23:00 |只看该作者
额,没人理我

实验发现和以前的版本差不多...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP