免费注册 查看新帖 |

Chinaunix

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

(2.6.25)想注入netfilte的NF_INET_POST_ROUTING,转给ip_output问题,实现简单的nat [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-05 17:16 |只看该作者 |倒序浏览
自己主要是想挂个钩子函数,做些处理,完了后再返回给ip_output

下面是2.6.25的ip_output()函数
int ip_output(struct sk_buff *skb)
{
    struct net_device *dev = skb->dst->dev;

    IP_INC_STATS(IPSTATS_MIB_OUTREQUESTS);

    skb->dev = dev;
    skb->protocol = htons(ETH_P_IP);

    return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, NULL, dev,
                ip_finish_output,
                !(IPCB(skb)->flags & IPSKB_REROUTED));
}


但是不知道如何写个动态加载模块(自己尝试写过,但编译出“insmod: error inserting 'my_nat_k.ko': -1 Unknown symbol in module”错误

以下是我写的一个模板:

static unsigned int get_packet_snat(unsigned int hook,
                             struct sk_buff *skb,
                             const struct net_device *in,
                             const struct net_device *out,
                             int (*okfn)(struct sk_buff *))
{

//return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, in, out,
//                            ip_output,
//                            !(IPCB(skb)->flags & IPSKB_REROUTED));//这样写会导致上面的错误


....//这里不知道如何做到传回ip_output()处理了,莫非这里修改完数据包信息后直接return NF_ACCEPT后自动交给下一个函数处理?

我有看到另位大哥写的模块如下:
>> The most important thing it does is at the end:
>>
>>  NF_HOOK(PF_INET, LOCAL_OUT_HOOK, skb, NULL, rt->u.dst.dev,  dst_output);//他这句是什么意思?
>>  return NF_STOLEN;

}

static struct nf_hook_ops nf_mynat_snat_ops =
{
  .hook = get_packet_snat,//函数地址
  .pf = PF_INET,//协议
  .hooknum = NF_INET_POST_ROUTING,//注册点
  .priority = NF_IP_PRI_FILTER -1,//优先级
};

static int  init(void)
{
  nf_register_hook(&nf_mynat_snat_ops);

  return 0;

}




static void  exit(void)
{
    nf_unregister_hook(&nf_mynat_snat_ops);


}


module_init(init);
module_exit(exit);

MODULE_AUTHOR("c_j");  
MODULE_LICENSE("GPL");


G了好久也没有找到资料,还请大家帮帮忙。


[ 本帖最后由 C__J 于 2009-5-5 17:45 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-05-05 17:19 |只看该作者
>....//这里不知道如何做到传回ip_output()处理了,莫非这里修改完 数据包信息后直接return NF_ACCEPT??

为什么不是这样呢?

论坛徽章:
0
3 [报告]
发表于 2009-05-05 17:24 |只看该作者
原帖由 C__J 于 2009-5-5 17:16 发表
static unsigned int get_packet_snat(unsigned int hook,
                             struct sk_buff *skb,
                             const struct net_device *in,
                             const struct net_device *out,
                             int (*okfn)(struct sk_buff *))
{

//return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, in, out,
//                            ip_output,
//                            !(IPCB(skb)->flags & IPSKB_REROUTED));

....//这里不知道如何做到传回ip_output()处理了,莫非这里修改完数据包信息后直接return NF_ACCEPT后自动交给下一个函数处理?
}


你的get_packet_snat已经在NF_HOOK_COND()里运行了,不用再在get_packet_snat()里调NF_HOOK_COND()了。
在get_packet_snat里做完你的动作,return NF_ACCEPT,就又返回到ip_output中了(如果运行完NF_INET_POST_ROUTING里所有hook function的话,那ip_output()就直接return出去了).

论坛徽章:
0
4 [报告]
发表于 2009-05-05 17:27 |只看该作者

回复 #3 new_learner 的帖子

我想实现一个简单的nat,需要更改数据包头消息

修改后能保证ip_output()发送出去的包是修改后的数据包么?

论坛徽章:
0
5 [报告]
发表于 2009-05-05 17:32 |只看该作者
只要你修改的地方正确,就可以保证。。。
实现nat还是比较麻烦的,需要涉及到的数据结构还是比较多,
比如你在ip_output()里做snat,那么对应的你就要保存这些信息,在receive的地方要做dnat,包才能回来。。。

论坛徽章:
0
6 [报告]
发表于 2009-05-05 17:35 |只看该作者

回复 #5 new_learner 的帖子

恩,是要在 NF_IP_PRE_ROUTING 保存信息,并用ip+port来识别是哪台机器的链接


只要能保证数据包的正确,我就可以先做做看了

对了,
你有im or email么?

论坛徽章:
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
7 [报告]
发表于 2009-05-05 17:38 |只看该作者
本身在POSTROUTING处就有nat的钩子函数。LZ 想实现自己的吗?

论坛徽章:
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
8 [报告]
发表于 2009-05-05 17:39 |只看该作者
通常在PREROUTING出作DNAT,POSTROUTING处作SNAT

论坛徽章:
0
9 [报告]
发表于 2009-05-05 17:41 |只看该作者

回复 #7 Godbach 的帖子

能具体告诉我哪个吗? 我一直没找到,也可以参照参照。谢谢版主


是的,我需要实现简单的nat.

[ 本帖最后由 C__J 于 2009-5-5 17:43 编辑 ]

论坛徽章:
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
10 [报告]
发表于 2009-05-05 17:45 |只看该作者
PREROUTING处有hook函数ip_nat_in,POSTROUTING处有ip_nat_out还有ip_nat_adjust
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP