免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

Linux内核发送构造数据包的方式 [复制链接]

论坛徽章:
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
51 [报告]
发表于 2009-11-06 22:43 |只看该作者
原帖由 meijusan123 于 2009-11-6 17:41 发表
send_reset()实现的路由基本是由       
        fl.fl_ip_sport = otcph.dest;
        fl.fl_ip_dport = otcph.source;
        dst = ip6_route_output(NULL, &fl);
来实现的,最后,NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, ns ...


对,如果你不手动处理MAC的话,那就得处理路由,这样系统为你封装MAC头,并发送出去

论坛徽章:
0
52 [报告]
发表于 2009-11-07 08:42 |只看该作者
原帖由 godbach 于 2009-11-6 22:43 发表


对,如果你不手动处理MAC的话,那就得处理路由,这样系统为你封装MAC头,并发送出去


谢谢楼主解答,最近试验了3种情况,能否给点建议:

(1)以前,我在hook中,对发送数据包直接修改封装,再手动路由ip_route_output_key()后,可以成功发送出去;
(2)现在,我直接在hook中,alloc_skb()出一个buffer,手动封装了mac,ip,tcp头,再调用dev_queue_xmit()后,也可以成功发出去;
(3)但,现在,我又试验了,在hook中,alloc_skb()出一个buffer,手动封装了ip,tcp头,没有手动封装mac头,再手动路由ip_route_output_key()后,最后再调用dev_queue_xmit(),竟然,发送失败,可能是系统没有帮我构造mac头,自己手动路由失败,导致系统直接丢弃我的构造包。

第3种情况失败的原因,个人感觉是自己路由没成功导致,难道手动ip_route_output_key路由后会失败??

论坛徽章:
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
53 [报告]
发表于 2009-11-07 10:14 |只看该作者
(3)但,现在,我又试验了,在hook中,alloc_skb()出一个buffer,手动封装了ip,tcp头,没有手动封装mac头,再手动路由 ip_route_output_key()后,最后再调用dev_queue_xmit(),竟然,发送失败,可能是系统没有帮我构造mac头,自己手动路由失败,导致系统直接丢弃我的构造包。

你说的第三种情况中函数dev_queue_xmit()应该不用你自己去做调用,而是经过路由之后的数据包要发出去时回调用到这个函数的。

论坛徽章:
0
54 [报告]
发表于 2009-11-07 10:41 |只看该作者
原帖由 godbach 于 2009-11-7 10:14 发表

你说的第三种情况中函数dev_queue_xmit()应该不用你自己去做调用,而是经过路由之后的数据包要发出去时回调用到这个函数的。


我大概明白楼主的意思,就是,手动路由后,不需要自己去发送。
但是,我在hook中去实现这构造包的功能,最终还是需要自己去发送的,难道通过回调函数去实现?hook的回调函数是去实现了有原本系统申请的skb资源的回调,但是,我自己alloc_skb出来的skbuffer,咋整呀,这怎么才能发出去呀?


在linux里用tcpdump没有抓到此包,但,在外面用ethereal可以抓到我构造的一个缺少MAC头的不完整包,结果,还是路由失败出了问题。
不知道咋整呀??

论坛徽章:
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
55 [报告]
发表于 2009-11-07 11:13 |只看该作者

回复 #54 meijusan123 的帖子

路由之后就让按照系统标准的流程进行啊。你看了ipt_REJECT.c的代码了吗?

论坛徽章:
0
56 [报告]
发表于 2009-11-08 09:44 |只看该作者
看了楼主文章,对ipt_REJECT.c的部分分析不错。
但,小弟看了有所疑问,也是最关键的路由部分:

/*这一步比较关键,做的就是更新路由的工作。该函数的主要工作就是将当前数据包的源IP当做路由的目的IP,同时考虑数据包的目的IP,得到去往该源IP的路由*/
        if ((rt = route_reverse(oldskb, oth, hook)) == NULL)
                return;


/*这里就是最终发送数据包的方式,具体方法就是让新数据包经过LOACLOUT的hook点,然后查路由,最后经由POSTROUTING点,将数据包发送出去。
其实这里我还是有1个疑问:(1)为什么不可以直接查找路由,而必须先经过LOCALOUT点*/
        NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, nskb, NULL, nskb->dst->dev,
                dst_output);
        return;


按楼主所述,这两个部分,都是重新路由的过程,我有所不太理解。封装多的数据包是在route_reverse()地方路由过,为什么还需要经过LOACLOUT的hook点,然后查路由????

论坛徽章:
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
57 [报告]
发表于 2009-11-08 10:25 |只看该作者
原帖由 meijusan123 于 2009-11-8 09:44 发表
看了楼主文章,对ipt_REJECT.c的部分分析不错。
但,小弟看了有所疑问,也是最关键的路由部分:

/*这一步比较关键,做的就是更新路由的工作。该函数的主要工作就是将当前数据包的源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
58 [报告]
发表于 2009-11-08 10:27 |只看该作者
源码分析中提到的1个疑问,35楼给出了解释,这里引用过来:

其实,这不是丢到了高层,而是和ip_queue_xmit()发送过程意义一样。
对这包进行重新路由后,封装了头部,之后,放到了NF_IP_LOCAL_IN之前而已。

其实,这里面只要修改了中途修改了ip地址,肯定是需要手动重新路由的。
这就涉及到一些比较复杂的route cache的查找,如果没有就去查找route tables;之后,进行路由结构和neighbour结构的关联,就涉及到邻居子系统的相关操作;接着就涉及到arp cache的查找,如果没有,进行一些操作,arp的过程等等,才找到了相关的ip对应的mac信息。
息。

论坛徽章:
0
59 [报告]
发表于 2009-11-09 10:54 |只看该作者
原帖由 godbach 于 2009-11-8 10:27 发表
源码分析中提到的1个疑问,35楼给出了解释,这里引用过来:




再次 谢谢楼主指示、
现在实验的一个情况是,不在netfilter的hook中去构造数据包,而是直接写个模块,构造数据包,在手动路由,最后调用NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,  skb->dst->dev, dst_output)是可以发送出去的。
但,为什么,就不能使用dev_queue_xmit(skb)呢,难道,他们的过程,很不一样!

而且,如果在hook中使用NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,  skb->dst->dev, dst_output)就会crash了。能否给点建议。

论坛徽章:
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
60 [报告]
发表于 2009-11-09 11:20 |只看该作者
再次 谢谢楼主指示、
现在实验的一个情况是,不在netfilter的hook中去构造数据包,而是直接写个模块,构造数据包,在手动路由,最后调用 NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,  skb->dst->dev, dst_output)是可以发送出去的。
但,为什么,就不能使用dev_queue_xmit(skb)呢,难道,他们的过程,很不一样!

这两种方式的流程是不一样的。一个是按照NF框架进行处理,走完LOCALOUT,还要经过POSTROUTING,最后才会调用到dev_queue_xmit,这中间做了多少工作,你就得了解一下NF框架的处理流程了。

而直接调用dev_queue_xmit,你需要正确的手动处理MAC头部,还要修改skb->data和skb->len.

而且,如果在hook中使用NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,  skb->dst->dev, dst_output)就会crash了。能否给点建议。

crash的原因多种多样。你可以对照ipt_REFECT.c中的处理和你自己代码的处理,寻找一下问题之所在。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP