免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2630 | 回复: 13

[内核模块] netfilter NF_IP_FORWARD 为数据包指定物理出接口 [复制链接]

论坛徽章:
0
发表于 2014-06-09 15:30 |显示全部楼层
购买主题 已有 1 人购买  本主题需向作者支付 50 可用积分 才能浏览

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2014-06-09 16:00 |显示全部楼层
回复 1# jlccwss
现在有一个需求,使用netfilter框架,在NF_IP_FORWARD点做钩子。
把钩到的包从指定的物理接口发出去,这个怎么实现?哪个大侠能举个例子,谢谢

1、偿试修改skb_buff->dev,死机
2、偿试修改skb_buff->mac_header,死机

在NF_IP_FORWARD点,已经决定了路由,也就说决定了从哪个物理网口出了。要想实现从指定的物理接口出来,需要重新修改路由。
类似的代码:

skb_dst_drop(skb);
skb_dst_set(skb, &newroute->dst);
NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, skb_dst(skb)->dev, dst_output);
return NF_STOLEN;


   

论坛徽章:
0
发表于 2014-06-09 16:09 |显示全部楼层
回复 2# 瀚海书香

转发包非本地包,是否NF_INET_LOCAL_OUT应该换成NF_IP_PRE_ROUTING?
设置skb_dst_set(skb, &newroute->dst);之后,这个skb就不会再按系统路由进行封包了,是吗?传说中的自定义路由?

   

论坛徽章:
0
发表于 2014-06-09 16:19 |显示全部楼层
回复 2# 瀚海书香


   
改完路由之后,不能用dev_queue_xmit直接把包放入网卡队列么?必须要重新路由?
如果重新路由的话,那当前的钩子会不会再次抓到次数据包?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2014-06-09 16:39 |显示全部楼层
回复 4# jlccwss
改完路由之后,不能用dev_queue_xmit直接把包放入网卡队列么?必须要重新路由?
如果重新路由的话,那当前的钩子会不会再次抓到次数据包?


改完路由后可以直接调用dev_queue_xmit,不建议这么搞。(ip层做ip层的事情)

重新路由后走OUTPUT链,而你的钩子在FORWARD链上,不会再次抓到的。

论坛徽章:
0
发表于 2014-06-09 17:01 |显示全部楼层
回复 5# 瀚海书香


    再问下,newroute这个是什么结构体?我只查到dst是struct dst_entry结构。
    非常感谢。

    另外,早期内核中用到了get_dev_by_name("eth0"),在2.6.32的内核中无此方法,
    有没有对应的方法可以按给定的ethx获取struct net_device结构?

论坛徽章:
0
发表于 2014-06-09 17:28 |显示全部楼层
回复 5# 瀚海书香


    dev_get_by_name这个是对的,找到了,呵呵

    newroute是什么结构体,这个还没有查到。

论坛徽章:
0
发表于 2014-06-09 21:50 |显示全部楼层
回复 2# 瀚海书香


    skb_dst_set(skb, &newroute->dst);
这里面的newroute->dst怎么设置,能否给出个例子?谢谢

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2014-06-10 08:21 |显示全部楼层
回复 8# jlccwss
  skb_dst_set(skb, &newroute->dst);
这里面的newroute->dst怎么设置,能否给出个例子?谢谢


这些东西你可以从源码自己找的。

看看net/netfilter/ipvs/ip_vs_xmit.c中的函数 __ip_vs_reroute_locally

论坛徽章:
0
发表于 2014-06-10 10:54 |显示全部楼层
回复 9# 瀚海书香


    非常感谢!
    我目前使用的内核是2.6.32没有__ip_vs_reroute_locally函数,
    对于操作路由,我研究了两天,还是没有头绪,现在有一种方法可以实现,贴出来分享下:
struct net *net = dev_net(out);
skb->dev = dev_get_by_name(net, "ethx");
ret = dev_queue_xmit(skb);
    这样包就会从给定的ethx网卡发出去了。

    觉得你说的ip层做ip层的事情是对的,所以我继续研究路由的指定方法。到时候贴出来供大家分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP