免费注册 查看新帖 |

Chinaunix

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

用户态封装的IP报文 使用内核钩子函数进行路由转发 如何实现呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-25 12:35 |只看该作者 |倒序浏览
用户态封装的IP报文:  BYTE *  p_BufferPacket

point_IP = (IP_HEADER*)p_BufferPacket
数据报文长度(不包括IP头):arg_lengh;

   
unsigned int hook_PocketEncap(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 *skb = NULL;      
                   skb =*pskb;

           /* IP头部填充*/
                  memcpy(skb-> network_header, dwSize_IP, point_IP);

           /* Data数据填充*/
                  memcpy(skb-> tail, dwSize, ++point_IP);
         
          return NF_ACCEPT;
   
}

               
int init_module()
{
   
              struct nf_hook_ops nfho;

                /*填充钩子结构体*/
            nfho.hook     =  hook_func;                  /*函数接口*/
           nfho.hooknum  =  NF_INET_PPOST_ROUTING; /*发送*/
            nfho.pf        =  PF_INET;
           nfho.priority    =  NF_IP_PRI_FIRST;         /*优先级*/

               /*注册钩子结构体*/
               nf_register_hook(&nfho);                  
        
               return 0;
    }


我这样写代码可以吗?   过程是这样的:


         需求:从套接字接受一个报文,修目的IP后,想利用LINUX内核 进行IP层转发

         用户态修改过的IP报文  如何才能让内核认识呢?  我这样直接拷贝不行吧?  如何和套接字缓存区  联系上呢?  
            哪位大侠帮忙指点一下吧  如果借助内核转发3层IP报文的话  也就是路由转发  转发到某一个路由器上, 有哪些实现方法?  代码应该怎么写呢。
        万分感谢!!!

论坛徽章:
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-10-25 13:30 |只看该作者
修改报文要考虑的环节比较多。

想利用 Netfilter 的hook 函数,那么就要对 NF 有一定程度的了解。

如果你是要出来进入系统的包,那么数据包是先经过 IP 层,如果是需要转发的包,数据包就不会往上层传输了。 感觉LZ 的一些概念没有搞清楚。

论坛徽章:
0
3 [报告]
发表于 2010-10-25 18:58 |只看该作者
回复 2# Godbach


   呵呵   我是想把我自己封装的IP报文,目的IP,源IP,是我手工添加的,然后由钩子函数发出去,就这一个功能,应该怎么做呢?

论坛徽章:
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
4 [报告]
发表于 2010-10-25 19:02 |只看该作者
一定要在内核态做吗,否则的话可以在用户态,通过 RAW Socket 构造数据包

论坛徽章:
0
5 [报告]
发表于 2010-10-25 19:19 |只看该作者
本帖最后由 xufeng917 于 2010-10-25 19:37 编辑

是的  就是我通过基于TCP的套接字接受的报文从路由器上发过来的  我这端就是一个LINUX服务器

自己把目的IP封装一下   然后路由转发到其他路由器上

通过 RAW Socket 构造数据包? 而后

是传给内核直接转发吗?

请你多指点下吧  多谢多谢

论坛徽章:
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-10-26 10:08 |只看该作者
是的  就是我通过基于TCP的套接字接受的报文从路由器上发过来的  我这端就是一个LINUX服务器

自己把目的IP封装一下   然后路由转发到其他路由器上

没太理解你的需求,顺便再说一下你的拓扑结构吧

论坛徽章:
0
7 [报告]
发表于 2010-10-26 23:55 |只看该作者
拓扑结构很简单啊: 就是路由器通过套接字发到LINUX服务器上一个不含目的IP的IP报文

服务器查找目的IP,然后封装,而后进行路由转发,也就是说只知道目的路由器的IP地址,进行转发

用原始套接字进行发送吗?

用钩子函数可以不可以呢? 用户态的这个IP报文,我不知道怎么才传到内核钩子机制内部

请  Godbach (哥德巴赫) 大哥   指点指点吧  应该采用哪种方法比较好呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP