免费注册 查看新帖 |

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
31 [报告]
发表于 2009-09-02 19:21 |只看该作者
原帖由 platinum 于 2009-9-2 18:28 发表
哦,说的是 ip_route_me_harder 吧?
这个我倒是没仔细看过
但是记得以前自己写 TARGET 的时候,简单交换 PING 包的 SRC/DST,也可以自动选路的


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

这个地方调用了router_reverse,得到oldskb中srcip作为路由表中目的IP时的路由项。
最后,把这个rt赋给了skb的对应成员。

论坛徽章:
0
32 [报告]
发表于 2009-09-02 19:28 |只看该作者
学习了,觉得自己一直缺少实际动手的经验,要向楼上几位学习。

个人觉得只要把mac头也填好,校验和计算好,这个包直接丢给dev_queue_xmit应该也可以发出去,
毕竟路由已经选好了,包的内容也完整了
但是这里应该是为了保证内核整体的一致性。
如果我注册了一个NF_IP_LOCAL_OUT的钩子,对于RST包当然应该能勾到,
另外可能还有很多其他的地方可能也需要保持一致,比如neighbour状态的更新,可能还有其他的吧

论坛徽章:
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
33 [报告]
发表于 2009-09-02 20:29 |只看该作者
个人觉得只要把mac头也填好,校验和计算好,这个包直接丢给dev_queue_xmit应该也可以发出去

调用这个函数的话,就不用查路由了。

论坛徽章:
0
34 [报告]
发表于 2009-09-02 21:15 |只看该作者
我倒认为 ip_route_output_flow 这个才是重新构造路由的函数,参见ip_queue_xmit

论坛徽章:
0
35 [报告]
发表于 2009-09-02 22:13 |只看该作者
原帖由 platinum 于 2009-9-2 18:35 发表

可我怎么觉得是丢掉高层协议栈去了呢

152         NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, nskb, NULL, nskb->dst->dev,
153                 dst_output);



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

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

最近小弟就小小修改了下ip地址,但,自己需要处理的后期操作还真的不少。

论坛徽章:
0
36 [报告]
发表于 2009-09-02 22:15 |只看该作者
如果有朋友也遇到一些route涉及到邻居子系统,arp相关的,可以讨论讨论。不错的东东。

论坛徽章:
0
37 [报告]
发表于 2009-09-03 09:15 |只看该作者
原帖由 meijusan123 于 2009-9-2 22:13 发表



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

其实,这里面只要修改了中途修改了ip地址,肯 ...

原来这么复杂,一直没接触过路由这块的东西,skb->dst 也没接触过,这块知识对我来说还是个空白……

论坛徽章:
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
38 [报告]
发表于 2009-09-03 09:45 |只看该作者
原帖由 platinum 于 2009-9-3 09:15 发表

原来这么复杂,一直没接触过路由这块的东西,skb->dst 也没接触过,这块知识对我来说还是个空白……

send_reset就是修改了skb->dst.

路由这块我也没有深入研究过。

论坛徽章:
0
39 [报告]
发表于 2009-09-03 10:16 |只看该作者
看到路由这一部分,发现讲了好多原理性的东西,
什么多路径路由,策略路由,负载平衡算法,这个表那个表等等,
看了一会儿就摸不着北了,
期待前辈能把学习路由这一块的心得拿出来分享一下

论坛徽章:
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
40 [报告]
发表于 2009-09-03 10:18 |只看该作者
不然。
其实,这不是丢到了高层,而是和ip_queue_xmit()发送过程意义一样。
对这包进行重新路由后,封装了头部,之后,放到了NF_IP_LOCAL_IN之前而已。

这个地方我也是如此理解的,send_reset只是将修改后的数据包放在LOCALOUT点之前。确如ip_queue_xmit类似,最后调用了
  1.         return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
  2.                        dst_output);
复制代码
其实,这里面只要修改了中途修改了ip地址,肯定是需要手动重新路由的。


对路由理解不够深入,如果这里不进行手动路由的话,在交由POSTROUTING之前,不是也会查路由吗?
另外,send_reset实际上只是交换了源和目的IP,如果rtable中已有了srcip->dstip的路由,是否还存在没有dstip->srcip的路由的情况?

这就涉及到一些比较复杂的route cache的查找,如果没有就去查找route tables;之后,进行路由结构和neighbour结构的关联,就涉及到邻居子系统的相关操作;接着就涉及到arp cache的查找,如果没有,进行一些操作,arp的过程等等,才找到了相关的ip对应的mac信息。


这里是否只涉及到路由的查找,或者还有路由的修改?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP