免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2009-09-03 11:42 |只看该作者
我看的2.6.28内核里面协议栈中的路由选择是在NF_IP_LOCAL_OUT之前啊,在ip_queue_xmit或者udp_sendmsg里面
就是说这里必须自己来选择路由

只要路由选定了,它对应的neighbour也就定了,需不需要arp请求那就是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
42 [报告]
发表于 2009-09-03 13:28 |只看该作者
如果是在FORWARD点上修改了数据包,应该也需要查路由吧,之后发送的时候应该走那个hook点呢。

论坛徽章:
0
43 [报告]
发表于 2009-09-03 20:06 |只看该作者
原帖由 Godbach 于 2009-9-3 13:28 发表
如果是在FORWARD点上修改了数据包,应该也需要查路由吧,之后发送的时候应该走那个hook点呢。


看代码的话整个forward流程似乎只在ip_rcv_finish中调用ip_route_input查了一次路由
这么说来如果在forward中修改了数据包的目的地址,那么是否可以这样:
假如目的地址改成本地的,交给dst_input处理,走ip_local_deliver
假如目的地址非本地,直接返回NF_ACCEPT继续按原路走下去,也就是被forward

本人没什么修改数据包的经验,纯粹凭想象瞎说。

论坛徽章:
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
44 [报告]
发表于 2009-09-03 20:38 |只看该作者
假如目的地址改成本地的,交给dst_input处理,走ip_local_deliver

那就相当于让包会退到PREROUTING之后,查路由之前了

论坛徽章:
0
45 [报告]
发表于 2009-09-05 08:35 |只看该作者
(2),oldskb的由谁进行释放了?

这个问题好解答
static unsigned int reject(struct sk_buff **pskb,
                           const struct net_device *in,
                           const struct net_device *out,
                           unsigned int hooknum,
                           const void *targinfo,
                           void *userinfo)
{


      。。。。。。。。。


        case IPT_TCP_RESET:
                send_reset(*pskb, hooknum);
        case IPT_ICMP_ECHOREPLY:
                /* Doesn't happen. */
                break;
        }

        return NF_DROP;
}


当reject 函数返回值为NF_DROP, 上一层函数自动会free skb

论坛徽章:
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
46 [报告]
发表于 2009-09-05 10:54 |只看该作者

回复 #45 xduser 的帖子

是的,多谢LS的。一直光记着分析send_reset,忘了它其实只是REJECT模块的子函数。返回DROP正好。

论坛徽章:
0
47 [报告]
发表于 2009-10-02 00:44 |只看该作者
我是菜鸟 我不懂

论坛徽章:
0
48 [报告]
发表于 2009-10-06 03:18 |只看该作者
学习

论坛徽章:
2
巨蟹座
日期:2014-03-09 21:37:25射手座
日期:2014-04-16 16:23:03
49 [报告]
发表于 2009-10-08 23:58 |只看该作者
留个名,有空再看!以前曾经仿照send_reset写过一个HTTP劫持模块,从未想过系统地去分析总结,Godbach强!

论坛徽章:
0
50 [报告]
发表于 2009-11-06 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, nskb, NULL, nskb->dst->dev,dst_output);过程去节间调用dev_queue_xmit()来把封装好的帧发送出去。

现在,有点疑惑,如果我直接在hook中去实现封装发送数据包。对数据包的封装,最后调用dev_queue_xmit()来发送,但,前提是,我没有手动去封装MAC头,这是不是,我要手动去路由一次,才行?

是不是也是通过fl.fl_ip_sport = otcph.dest;
        fl.fl_ip_dport = otcph.source;
        dst = ip6_route_output(NULL, &fl);来实现?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP