免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2008-12-21 13:03 |只看该作者
那上面的这个程序,如何让target执行呢????这下drop,accept ok了把

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
42 [报告]
发表于 2008-12-21 13:05 |只看该作者
原帖由 iptabler 于 2008-12-21 12:59 发表
我需要的是解决问题,那内核如何才匹配我现在写的这个target呢????
我是了解这个流程阿.....


就是我前面给你回复的。
match可以不写,但应用层的解析程序,你必须实现,然后拷贝到iptables动态链接库的目录下
执行
iptables -t [table] -m [match] -j [your ipt]

论坛徽章:
0
43 [报告]
发表于 2008-12-21 13:05 |只看该作者
我知道效率不行,这样所有的包都处理了,没有之前match...
可是我现在连不要效率的都不行....还谈效率????

论坛徽章:
0
44 [报告]
发表于 2008-12-21 13:13 |只看该作者
算了,放弃!!!!
感谢大家的帮助,虽然问题没有得到解决...
只怨俺不是搞内核的料

[ 本帖最后由 iptabler 于 2008-12-21 13:31 编辑 ]

论坛徽章:
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
45 [报告]
发表于 2008-12-21 13:39 |只看该作者
呵呵,放弃了啊。
其实上面dreamice兄已经给你过建议了。如果你要了解target和match如何搭配工作,那么首先熟悉一下内核的iptables部分代码,看看内核中是如何查找match模块,然后执行target。同时,在研究一下iptables的源码。了解如何命令行代码如何扩展。

独孤九贱的精华帖和端木大侠的博客:http://www.cublog.cn/u/12313/index.html。应该好好学习一下,基本上答复了你的大部分疑问。而且端木大侠的博客上还有一个实例,添加target和match。

是不是学什么的料,也在于能不能发挥自己的积极性去学习和研究。

BTW,不管做什么事情,不要轻言放弃。除非本不是你必须做的或者你不感兴趣。

[ 本帖最后由 Godbach 于 2008-12-21 14:02 编辑 ]

论坛徽章:
0
46 [报告]
发表于 2008-12-21 14:38 |只看该作者
一个十分简单的道理,不是你写的任何代码都会被内核调用到。
内核总得有它自己的执行流吧,它不能因为你是大牛就执行你写的代码,或者因为你是菜鸟就忽略你的代码。
你要做的就是先了解你的代码为什么会被执行,或者为什么不会被执行。

论坛徽章:
0
47 [报告]
发表于 2008-12-21 18:03 |只看该作者
问题更新下,在各位好心人的帮助下,我自己又尝试写了个
ipt_ME.c
#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 <linux/netfilter/x_tables.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include "ipt_ME.h"
#ifdef CONFIG_BRIDGE_NETFILTER
#include <linux/netfilter_bridge.h>
#endif

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Netfilter Core Team <coreteam@netfilter.org>");
MODULE_DESCRIPTION("Xtables: packet \"rejection\" target for IPv4");

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

&nbsp;&nbsp;printk("me port %d!!!\n",reject->port);
&nbsp;&nbsp;
&nbsp;&nbsp;oiph = ip_hdr (skb);
&nbsp;&nbsp;printk("reject_tg call success!!!\n");
&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_DROP;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case IPPROTO_ICMP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk ("ICMP PACKET!!!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;default:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return NF_DROP;
&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;const struct xt_target *target, void *targinfo,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned int hook_mask)
{
&nbsp;&nbsp;&nbsp;&nbsp;const struct ipt_me_info *meinfo = targinfo;
&nbsp;&nbsp;&nbsp;&nbsp;//const struct ipt_entry *e = e_void;


&nbsp;&nbsp;&nbsp;&nbsp;/*if (rejinfo->with == IPT_ICMP_ECHOREPLY) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk("ipt_REJECT: ECHOREPLY no longer supported.\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}*/

&nbsp;&nbsp;&nbsp;&nbsp;printk("me port %d!!!\n",meinfo->port);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return true;
}

static struct xt_target reject_tg_reg __read_mostly = {
&nbsp;&nbsp;&nbsp;&nbsp;.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "REJECT",
&nbsp;&nbsp;&nbsp;&nbsp;.family&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= AF_INET,
&nbsp;&nbsp;&nbsp;&nbsp;.target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= reject_tg,
&nbsp;&nbsp;&nbsp;&nbsp;.targetsize&nbsp;&nbsp;&nbsp;&nbsp;= sizeof(struct ipt_me_info),
&nbsp;&nbsp;&nbsp;&nbsp;//.table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "filter",

&nbsp;&nbsp;&nbsp;&nbsp;.hooks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD) |
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  (1 << NF_INET_LOCAL_OUT),
&nbsp;&nbsp;&nbsp;&nbsp;.checkentry&nbsp;&nbsp;&nbsp;&nbsp;= reject_tg_check,
&nbsp;&nbsp;&nbsp;&nbsp;.me&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= THIS_MODULE,
};

static int __init reject_tg_init(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;return xt_register_target(&reject_tg_reg);
}

static void __exit reject_tg_exit(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;xt_unregister_target(&reject_tg_reg);
}

module_init(reject_tg_init);
module_exit(reject_tg_exit);

论坛徽章:
0
48 [报告]
发表于 2008-12-21 18:04 |只看该作者
ipt_ME.h

#ifndef _IPT_ME_H
#define _IPT_ME_H

struct ipt_me_info {
&nbsp;&nbsp;&nbsp;&nbsp;u_int16_t port;
};

#endif


Makefile
ifneq ($(KERNELRELEASE),)
obj-m := ipt_ME.o

else

KERNEL_SRC ?= $(firstword $(wildcard /lib/modules/$(shell uname -r)/build /usr/src/linux))
ifeq ($(KERNEL_SRC),)
$(error You need to define KERNEL_SRC)
endif

ifneq ($wildcard $(KERNEL_SRC)/include/linux/modversions.h),)
MODVERSIONS = -DMODVERSIONS
endif

_KVER = $(strip $(shell cat $(KERNEL_SRC)/Makefile | grep -e '^VERSION' | cut -d"=" -f2))
_KPL = $(strip $(shell cat $(KERNEL_SRC)/Makefile | grep -e '^PATCHLEVEL' | cut -d"=" -f2))
_KSUB = $(strip $(shell cat $(KERNEL_SRC)/Makefile | grep -e '^SUBLEVEL' | cut -d"=" -f2))
KERNEL_SERIES=$(_KVER).$(_KPL)

ifeq ($(KERNEL_SERIES), 2.6)
&nbsp;&nbsp;&nbsp;&nbsp;TARGET=ipt_ME.ko
else
&nbsp;&nbsp;&nbsp;&nbsp;TARGET=ipt_ME.o
endif

SED = sed
IPTABLES_BIN = iptables

IPTABLES_SRC = /home/zj/domain/iptables-1.4.2

IPTABLES_INCLUDE = -I$(IPTABLES_SRC)/include
IPTABLES_VERSION = $(shell cat $(IPTABLES_SRC)/Makefile | grep -e '^IPTABLES_VERSION:=' | cut -d"=" -f2)
IPTABLES_OPTION = -DIPTABLES_VERSION=\

论坛徽章:
0
49 [报告]
发表于 2008-12-21 18:05 |只看该作者
这样的话,make..make install都是没问题的...
我怀疑是我iptables那一层没写好

论坛徽章:
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
50 [报告]
发表于 2008-12-21 20:19 |只看该作者
LS和LZ是一个人吧,两个ID
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP