免费注册 查看新帖 |

Chinaunix

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

关于netfilter中5个垂钓点的疑问! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-04-21 22:46 |只看该作者
貌似skb_buff结构中有些不能直接操作,复制一下就好了!

论坛徽章:
0
12 [报告]
发表于 2008-04-21 22:58 |只看该作者
跟层次没关系,你要的东西从skb中取就行

论坛徽章:
0
13 [报告]
发表于 2008-04-22 09:52 |只看该作者

回复 #10 kimguobin 的帖子

版本够新阿,我是在7.10下作的,应该没什么问题的。要不你把代码贴出来。

论坛徽章:
0
14 [报告]
发表于 2008-04-22 12:11 |只看该作者

回复 #13 helight 的帖子

我把你提供的代码复制编译了下,编译是可以,模块加载的时候也可以,但是在抓包的时候内核会死掉(Caps Lock和scroll Lock指示灯一直闪烁),
把 struct sk_buff *pskb=*skb; 注释掉或者直接对skb 操作就没事,我用skb_copy函数复制了一份,如:struct sk_buff *sk=skb_copy(skb,1);再对SK操作。
代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/if_ether.h>
#include <linux/netfilter_ipv4.h>

MODULE_LICENSE("GPL");

static unsigned int in_device_fil (unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int(*okfn)(struct sk_buff *))
{
        struct sk_buff *sk=skb_copy(skb,1);
/*        struct ethhdr *ethh = (struct ethhdr*)eth_hdr(sk);
        unsigned char *src_mac=ethh->h_source;
       printk("mac=%02X:%02X:%02X:%02X:%02X:%02X\n", src_mac[0],src_mac[1],src_mac[2],src_mac[3],src_mac[4],src_mac[5]);
*/        struct iphdr *iph = (struct iphdr*)ip_hdr(sk);
        if(iph->protocol==6)
        {
                struct tcphdr *tcph = (struct tcphdr*)tcp_hdr(sk);
                printk("A  TCP packet from: %d.%d.%d.%d:%u to %d.%d.%d.%d:%u ",NIPQUAD(iph->saddr),ntohs(tcph->source),NIPQUAD(iph->daddr),ntohs(tcph->dest));
        }
        if(iph->protocol==17)
        {
                struct udphdr *udph =(struct udphdr *)udp_hdr(sk);       
                printk("A  UDP packet from: %d.%d.%d.%d:%u to %d.%d.%d.%d:%u ",NIPQUAD(iph->saddr),ntohs(udph->source),NIPQUAD(iph->daddr),ntohs(udph->dest));
        }
        return NF_ACCEPT;       
}

static struct nf_hook_ops kim_net={
.list = {NULL,NULL},
.hook = in_device_fil,
.pf = PF_INET,
.hooknum = NF_IP_PRE_ROUTING,
.priority = NF_IP_PRI_FIRST,
};

static void kim_init_net(void)
{
nf_register_hook(&kim_net);
}
static void kim_cleanup_net(void)
{
nf_unregister_hook(&kim_net);
}

module_init(kim_init_net);
module_exit(kim_cleanup_net);

这是我的代码,感觉应该没什么问题,但是在实际运行的时候输出的信息很奇怪,源地址和目的地址能正确输出,端口号很乱,不管从哪个地址发来的包显示的端口号都是一样的,而目的端口却总在变化,(我在寝室用路由器上网,和这个有关系吗?)
还有那个被注释掉的显示MAC地址的语句,那么写对吗?,那要怎么写才能正确显示出来呢?
nf_hook_ops这个结构还有个成员 *owner  这个用填写吗??

[ 本帖最后由 kimguobin 于 2008-4-22 12:43 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2008-04-22 12:42 |只看该作者
纠正一下, 获取MAC的语句是对的!
不管那个地址发来的包都显示同一个MAC地址是因为路由器的关系,那个MAC地址是路由器的地址,或许端口号总不变也是那个原因吧!

论坛徽章:
0
16 [报告]
发表于 2008-04-23 16:20 |只看该作者
很奇怪阿,你用的是哪一个发行版阿,我是ubuntu7.10。我用skb_copy就会死机,和你说的想象一样。我的内核版本是2.6.22,你是2.6.24是吧 ?

论坛徽章:
0
17 [报告]
发表于 2008-04-23 16:50 |只看该作者
>这是我的代码,感觉应该没什么问题,但是在实际运行的时候输出的信息很奇怪,源地址和目的地址能正确输出,端口号很乱,不管从哪个地址发来的包显示的端口号都是一样
>的,而目的端口却总在变化,(我在寝室用路由器上网,和这个有关系吗?)

你的端口显示是有问题.


>还有那个被注释掉的显示MAC地址的语句,那么写对吗?,那要怎么写才能正确显示出来呢?

MAC的显示是对的,至少在我这里是可以的。

>nf_hook_ops这个结构还有个成员 *owner  这个用填写吗??

struct module *owner, 用来指向管理该模块的模块.可以填写,一般填写THIS_MODULE.

论坛徽章:
0
18 [报告]
发表于 2008-04-23 20:22 |只看该作者

回复 #9 kimguobin 的帖子

我的毕业设计也是防火墙,你做的是什么方向??

论坛徽章:
0
19 [报告]
发表于 2008-04-23 20:50 |只看该作者
端口从skb->data中读才正确,否则就会有问题,我以前遇到过:

http://bbs.chinaunix.net/thread-1059245-1-1.html

论坛徽章:
0
20 [报告]
发表于 2008-04-28 10:32 |只看该作者
原帖由 helight 于 2008-4-23 16:20 发表
很奇怪阿,你用的是哪一个发行版阿,我是ubuntu7.10。我用skb_copy就会死机,和你说的想象一样。我的内核版本是2.6.22,你是2.6.24是吧 ?

恩,我的是2.6.24     我遇到的问题正好和你相反呢。。现在用的是 8.04 LTS
这几天断网了 。

谢谢你的热心回答!!

[ 本帖最后由 kimguobin 于 2008-4-28 10:41 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP