免费注册 查看新帖 |

Chinaunix

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

[Linux] linux内核中怎样根据端口号获得与之对应sock [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-14 14:17 |只看该作者 |倒序浏览
刚刚接触linux内核编程,在练习写一个netfilter的模块:通过local_in和local_out两个点来截取数据包,之后从数据包里面获取struct sock的指针。
在local_out里面可以在sk_buff直接获取。但是,local_in就有麻烦了,sk_buff里面的sk成员因为还在ip层,没有填写(为NULL)。
试过:分协议,利用IP层以上的函数来查找。以TCP为例用inet_lookup函数获取,但是得到的还是null。
求解:有什么办法可以解决?

论坛徽章:
0
2 [报告]
发表于 2014-05-14 14:20 |只看该作者
二楼附上代码:
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/netfilter.h>
  4. #include <linux/netfilter_ipv4.h>
  5. #include <linux/skbuff.h>
  6. #include <linux/tcp.h>
  7. #include <linux/udp.h>
  8. #include <net/tcp.h>
  9. #include <net/inet_hashtables.h>
  10. #include <linux/ip.h>
  11. #include <linux/net.h>
  12. #include <net/sock.h>

  13. static struct nf_hook_ops nfno;
  14. static struct nf_hook_ops nfno2;

  15. static unsigned int my_hook_fun(unsigned int hooknum,
  16.                                         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 iphdr * iph = (*skb)->nh.iph;
  22.         struct tcphdr * tcph = (struct tcphdr *)((__u32*)iph+iph->ihl);
  23.         struct udphdr * udph = (struct udphdr *)((__u32*)iph+iph->ihl);
  24.         struct sock *sk;
  25.         if(hooknum == NF_IP_LOCAL_OUT)
  26.         {
  27.                 printk("send a pack\n");
  28.         }
  29.         else
  30.         {
  31.                 printk("recv a pack\n");
  32.         }
  33.         sk = (*skb)->sk;
  34.         if(iph->protocol == 6 )
  35.         {
  36.                 printk("tcp,source port %d , dst port %d\n",ntohs(tcph->source),ntohs(tcph->dest));
  37.                 if(sk==NULL)
  38.                 {
  39.                         sk = inet_lookup(&tcp_hashinfo,iph->saddr,tcph->source,iph->daddr,ntohs(tcph->dest),inet_iif(*skb));
  40.                        
  41.                 }
  42.        
  43.         }
  44.         else if(iph->protocol == 17)
  45.         {
  46.                 printk("udp,source prot %d, dst prot %d\n",ntohs(udph->source),ntohs(udph->dest));
  47.         }
  48.        
  49.         if(sk!=NULL && sk->sk_socket!=NULL)
  50.         printk("socket:%x \n",(unsigned int)(sk->sk_socket) );
  51.         else
  52.         {
  53.                 if(sk==NULL)
  54.                 {
  55.                         printk("sk\n");
  56.                 }
  57.                 else
  58.                 {
  59.                         printk("socket\n");
  60.                 }
  61.         }
  62.         return NF_ACCEPT;
  63. }

  64. static int __init drop_pack_ini(void)
  65. {
  66.         nfno.hook = my_hook_fun;
  67.         nfno.hooknum = NF_IP_LOCAL_OUT;
  68.         nfno.pf = PF_INET;
  69.         nfno.priority = NF_IP_PRI_LAST;
  70.         nf_register_hook(&nfno);
  71.         nfno2.hook = my_hook_fun;
  72.         nfno2.hooknum = NF_IP_LOCAL_IN;
  73.         nfno2.pf = PF_INET;
  74.         nfno2.priority = NF_IP_PRI_LAST;
  75.         nf_register_hook(&nfno2);
  76.         return 0;
  77. }

  78. static void  drop_pack_exe(void)
  79. {
  80.         nf_unregister_hook(&nfno);
  81.         nf_unregister_hook(&nfno2);
  82. }

  83. module_init(drop_pack_ini);
  84. module_exit(drop_pack_exe);
  85. MODULE_LICENSE("GPL");



复制代码

论坛徽章:
0
3 [报告]
发表于 2014-05-14 14:21 |只看该作者
另外,我用的是2.6.18版本的linux内核源代码

论坛徽章:
0
4 [报告]
发表于 2014-05-14 16:45 |只看该作者
问题已解决:
sk = inet_lookup(&tcp_hashinfo,iph->saddr,tcph->source,iph->daddr,ntohs(tcph->dest),inet_iif(*skb));
应改为:
sk = inet_lookup(&tcp_hashinfo,iph->saddr,tcph->source,iph->daddr,tcph->dest,inet_iif(*skb));
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP