免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
1 [报告]
发表于 2008-12-20 12:25 |显示全部楼层

This problem has been resolved

修改后的代码如下:
1 #include <linux/module.h>
  2 #include <linux/skbuff.h>
  3 #include <linux/ip.h>
  4 #include <linux/udp.h>
  5 #include <linux/icmp.h>
  6 #include <net/icmp.h>
  7 #include <net/ip.h>
  8 #include <net/tcp.h>
  9 #include <net/route.h>
10 #include <net/dst.h>
11 #include <net/net_namespace.h>
12 #include <linux/netfilter/x_tables.h>
13 #include <linux/netfilter_ipv4/ip_tables.h>
14 #ifdef CONFIG_BRIDGE_NETFILTER
15 #include <linux/netfilter_bridge.h>
16 #endif
17
18 MODULE_LICENSE("GPL");
19 MODULE_AUTHOR("zj");
20 MODULE_DESCRIPTION("Xtables: packet \"winnuke\" target for IPv4");
21
22 static unsigned int
23 /*
24 reject_tg(unsigned int hooknum,
25                    struct sk_buff *skb,
26                    const struct net_device *in,
27                    const struct net_device *out,
28                    int (*okfn)(struct sk_buff *))
29 */
30 reject_tg(struct sk_buff *skb,
31           const struct net_device *in,
32           const struct net_device *out,
33           unsigned int hooknum,
34           const struct xt_target *target,
35           const void *targinfo)
36 {
37     const struct iphdr *oiph;
38     const struct tcphdr *oth;
39     struct tcphdr _otcph;
40
41     oiph = ip_hdr(skb);
42     if (oiph->frag_off & htons(IP_OFFSET))
43         return NF_DROP;
44     switch (oiph->protocol)
45         {
46                 case IPPROTO_TCP:
47                         printk("TCP PACKET!!!\n");
48                         break;
49                 case IPPROTO_UDP:
50                       printk("UDP PACKET!!!\n");
51                         break;
52                 case IPPROTO_ICMP:
53                       break;
54                 default:
55                         return NF_ACCEPT;
56         }
57     oth = skb_header_pointer(skb, ip_hdrlen(skb),
58                  sizeof(_otcph), &_otcph);
59     if (oth == NULL)
60         return NF_DROP;
61
62     if (oth->urg)
63         return NF_DROP;
64     else
65         {
66             printk("urg ok!!!!!");
67             printk("s_port:%d,d_port:%d",oth->source,oth->dest);
68         }
69         return NF_ACCEPT;
70 }
71
72 static struct xt_target reject_tg_reg __read_mostly = {
73     .name        = "reject",
74     .family        = PF_INET,
75     .target        = reject_tg,
76     .hooks        = (1 << NF_INET_LOCAL_IN) | (1 << NF_INET_FORWARD) |
77               (1 << NF_INET_LOCAL_OUT),
78     .me        = THIS_MODULE,
79 };
80
81 extern int
82 xt_register_target(struct xt_target *target);
83 extern void
84 xt_unregister_target(struct xt_target *target);
85 static int __init reject_tg_init(void)
86 {
87     return xt_register_target(&reject_tg_reg);
88 }
89
90 static void __exit reject_tg_exit(void)
91 {
92     xt_unregister_target(&reject_tg_reg);
93 }
94
95 module_init(reject_tg_init);
96 module_exit(reject_tg_exit);


Makefile我没有改你的。
编译后不会再有warning,当你执行insmod ipt_REJECT.ko(ipt_REJECT是我给这个target的命名)的时候,dmesg会看到如下信息:
ipt_REJECT: Unknown symbol xt_register_target
ipt_REJECT: Unknown symbol xt_unregister_target
于是,问题很明显了,就是xt_register_target和xt_unregister_target这两个符号没有找到,所以加载失败。
分析一下失败的原因:既然编译都通过了,那么头文件什么的应该没有问题;问题很可能就是实现这两个函数的模块没有加载。我们在源码中找到,这两个函数实在x_tables这个模块中实现的,lsmod | grep x_tables 确实没有找到,于是手动加载:modprobe x_tables
ok,继续执行insmod ipt_REJECT.ko
ok,这下成功了,哈哈,大功告成。

评分

参与人数 1可用积分 +15 收起 理由
Godbach + 15 感谢分享

查看全部评分

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-12-20 12:31 |显示全部楼层
原帖由 Godbach 于 2008-12-20 12:28 发表
dreamice兄真强啊。

解析不到符号的时候,要考虑依赖的其他模块是否加载。


呵呵,以前我也没有考虑到还有这种情况。昨天LZ兄弟问我这个程序,就试着查了一下,调了一下代码,总算是解决了,呵呵。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2008-12-20 13:32 |显示全部楼层

回复 #14 iptabler 的帖子

是的,不需要extern,我是调试的时候加的,忘了删除了

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-12-20 13:33 |显示全部楼层
原帖由 iptabler 于 2008-12-20 13:19 发表
首先感谢大家的回复#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef CONFIG_BRIDGE_NETFILTER
#i ...


要想测试这个target,还得写一个用户层的程序,并通过iptables命令加载这个target才行

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
5 [报告]
发表于 2008-12-20 13:54 |显示全部楼层

回复 #17 iptabler 的帖子

这个target没有错,剩下的还需要写一个用户层的程序来解析你加载的iptables命令。一个单独的target即使成为内核模块了,也需要iptables命令来加载它作为一个target才行。
这方面,还是多了解一下iptables/netfilter hack howto吧

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2008-12-21 12:16 |显示全部楼层
原帖由 iptabler 于 2008-12-21 12:08 发表
要想测试这个target,还得写一个用户层的程序,并通过iptables命令加载这个target才行
dreamice版主的这句话又和解?????
我tail -f /var/log/message根本就没有printk的信息



通常你要限制什么,你是不是需要:
iptables —t [table] -p[protocol] -m [match] -j [target]
你写好一个target,没有match,没有加载,如何能调度到它?
因此,你就必须加载这个target。
question: 如何加载这个target?
必须写一个用户层的解析函数,仿照iptables的例子吧,编译成动态链接库的形式,然后把它拷贝到你系统的
iptable存放动态链接库的目录下,调用iptables命令,进行加载。
这些,我昨天给你的文档上面讲的很详细啊。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 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的执行没有搞清楚。

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


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

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2008-12-22 09:17 |显示全部楼层
原帖由 Godbach 于 2008-12-21 22:17 发表
我没有去写过iptables模块的target和matc,一般都是在内核完成对数据包的处理。那我假设你说的是正确的。那么数据包在什么情况下会经过你的target。是否需要配置iptables规则?


哎,昨晚系统坏了,郁闷……
其实target和match都不一定要全部自己实现,iptables系统中有很多默认的match和target。
比如,你加一条:
iptables -t filter -p TCP -m --state NEW -j DROP
实际上-m --state NEW 就是一个match,DROP就是一个默认的target。
他这个问题在于libipt没有写好

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2008-12-22 10:22 |显示全部楼层
原帖由 Godbach 于 2008-12-22 09:50 发表

我昨天下午也高了一个下午Debian,还编译内核的问题。最后做出来的initrd文件还是有问题。



对,有原来的匹配可以用,只是加一条规则指定使用新的target即可啊。那就是iptables命令行代码要进行修改一下。


就是他这个libipt写得有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP