免费注册 查看新帖 |

Chinaunix

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

内核模块编程求救 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-12-21 12:33 |只看该作者
感谢god兄的回复
现在关键是这句都没打印
printk("reject_tg call success!!!\n");
还有我hook的时候
.hooks = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD) | (1 << NF_INET_LOCAL_OUT)
不是表示从三个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
32 [报告]
发表于 2008-12-21 12:34 |只看该作者

回复 #30 iptabler 的帖子

你的这个程序我没有细看。看的是你的17楼的程序,我后来的回复是指的这个程序。

你不是后来说先研究17楼的程序吗?

论坛徽章:
0
33 [报告]
发表于 2008-12-21 12:35 |只看该作者
dreamice还要有兴趣的话
看看
http://bbs.chinaunix.net/viewthread.php?tid=791863
我现在在仿这个写,就是你所谓的思路....
那给的九贱的那个我也写了的...insmod是成功的,可是跟上面的domain是一样的,没效果...

其实我一直觉得我这个真的没必要iptables

论坛徽章:
0
34 [报告]
发表于 2008-12-21 12:36 |只看该作者
17楼的程序是我自己在2.6.18内核上写的 是测试通过的

论坛徽章:
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
35 [报告]
发表于 2008-12-21 12:38 |只看该作者
原帖由 iptabler 于 2008-12-21 12:36 发表
17楼的程序是我自己在2.6.18内核上写的 是测试通过的


如果你改装成了target。那你需要告诉内核什么时候执行这个target。也就是所谓匹配的问题。

论坛徽章:
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
36 [报告]
发表于 2008-12-21 12:39 |只看该作者

回复 #33 iptabler 的帖子

你测试了UDP和ICMP报文了吗?

论坛徽章:
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
37 [报告]
发表于 2008-12-21 12:43 |只看该作者
原帖由 iptabler 于 2008-12-21 12:35 发表
dreamice还要有兴趣的话
看看
http://bbs.chinaunix.net/viewthread.php?tid=791863
我现在在仿这个写,就是你所谓的思路....
那给的九贱的那个我也写了的...insmod是成功的,可是跟上面的domain是一样的,没效 ...



注册成hook函数就可以直接处理你的数据包了。所谓target和match是iptables在内核中的体现。
iptables本身也是需要注册hook函数的。是ipt_hook函数。在这个函数内部进行了match的匹配和target的执行。
对于你自身的hook函数,你完全可以在内部直接处理。而没有必要注册成一个target,因为使用target,是需要有相应match的。这个比较麻烦。

论坛徽章:
0
38 [报告]
发表于 2008-12-21 12:59 |只看该作者
我需要的是解决问题,那内核如何才匹配我现在写的这个target呢????
我是了解这个流程阿.....

论坛徽章:
0
39 [报告]
发表于 2008-12-21 13:01 |只看该作者
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/icmp.h>
#include <net/icmp.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/route.h>
#include <net/dst.h>
#include <net/net_namespace.h>
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#ifdef CONFIG_BRIDGE_NETFILTER
#include <linux/netfilter_bridge.h>
#endif

MODULE_LICENSE ("GPL");
MODULE_AUTHOR ("zj");
MODULE_DESCRIPTION ("Xtables: packet \"winnuke\" target for IPv4");

static unsigned int
reject_tg (struct sk_buff *skb,
&nbsp;&nbsp;&nbsp;&nbsp;   const struct net_device *in,
&nbsp;&nbsp;&nbsp;&nbsp;   const struct net_device *out,
&nbsp;&nbsp;&nbsp;&nbsp;   unsigned int hooknum,
&nbsp;&nbsp;&nbsp;&nbsp;   const struct xt_target *target, const void *targinfo)
{
&nbsp;&nbsp;const struct iphdr *oiph;
&nbsp;&nbsp;const struct tcphdr *oth;
&nbsp;&nbsp;struct tcphdr _otcph;

&nbsp;&nbsp;oiph = ip_hdr (skb);
&nbsp;&nbsp;printk("reject_tg call success!!!\n");
&nbsp;&nbsp;if (oiph->frag_off & htons (IP_OFFSET))
&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;
&nbsp;&nbsp;switch (oiph->protocol)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_TCP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("TCP PACKET!!!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_UDP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("UDP PACKET!!!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_ACCEPT;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_ICMP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_ACCEPT;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;default:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_ACCEPT;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;oth = skb_header_pointer (skb, ip_hdrlen (skb), sizeof (_otcph), &_otcph);
&nbsp;&nbsp;if (oth == NULL)
&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;

&nbsp;&nbsp;if (oth->urg)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("urg ok!!!!!");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("urg ok!!!!!");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("s_port:%d,d_port:%d", oth->source, oth->dest);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;return NF_ACCEPT;
}

static bool
reject_tg_check(const char *tablename, const void *e_void,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const struct xt_target *target, void *targinfo,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int hook_mask)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk("check called!!!.\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;
}

static struct xt_target reject_tg_reg __read_mostly = {
&nbsp;&nbsp;.name = "reject",
&nbsp;&nbsp;.family = PF_INET,
&nbsp;&nbsp;.target = reject_tg,
&nbsp;&nbsp;.hooks = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD) |
&nbsp;&nbsp;&nbsp;&nbsp;(1 << NF_INET_LOCAL_OUT),
&nbsp;&nbsp;.checkentry = reject_tg_check,
&nbsp;&nbsp;.me = THIS_MODULE,
};

static int __init
reject_tg_init (void)
{
&nbsp;&nbsp;printk("insmod success!!\n");
&nbsp;&nbsp;return xt_register_target (&reject_tg_reg);
}

static void __exit
reject_tg_exit (void)
{
&nbsp;&nbsp;printk("rmmod success!!\n");
&nbsp;&nbsp;xt_unregister_target (&reject_tg_reg);
}

module_init (reject_tg_init);
module_exit (reject_tg_exit);

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
40 [报告]
发表于 2008-12-21 13:03 |只看该作者
原帖由 Godbach 于 2008-12-21 12:43 发表



注册成hook函数就可以直接处理你的数据包了。所谓target和match是iptables在内核中的体现。
iptables本身也是需要注册hook函数的。是ipt_hook函数。在这个函数内部进行了match的匹配和target的执行。
对 ...


如果是个测试程序,按17楼程序这样做no problem,但是,如果实际应用,这样的效率却不敢恭维。
我谈的是他这target的程序模块。
我觉得,最大的症结,还是这位兄弟对netfilter架构以及iptables的执行没有搞清楚。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP