nf_conn结构体为空?
时间:2011-01-24
来源:互联网
本帖最后由 xtlx2000 于 2011-01-24 16:24 编辑
看了netfilter后练习了一个抓包程序,在FORWARD链抓的,钩子函数大概是
复制代码
抓包时有个别包会出现内核崩溃:
查了下原来是有个别包获得的ct = nf_ct_get(sb, &ctinfo)为空,所以访问ct元素会内核崩溃,但我是在FORWARD抓的ftp协议包,skb怎么可能没有ct跟踪?(我还想根据ct来显示NAT信息),请问这是什么原因呢?该如何解决?谢谢
看了netfilter后练习了一个抓包程序,在FORWARD链抓的,钩子函数大概是
- 105 unsigned int hook_func(unsigned int hooknum,
- 106 struct sk_buff *skb,
- 107 const struct net_device *in,
- 108 const struct net_device *out,
- 109 int(*okfn)(struct sk_buff *))
- 110 {
- 111 struct sk_buff *sb = skb;
- 112 struct iphdr *iph;
- 113 struct nf_conn *ct = NULL;
- 114 enum ip_conntrack_info ctinfo;
- 115
- ....
- 118 ct = nf_ct_get(sb, &ctinfo);
-
- ...
- 131 curr->daddr = ct->tuplehash[dir].tuple.dst.u3.ip;
查了下原来是有个别包获得的ct = nf_ct_get(sb, &ctinfo)为空,所以访问ct元素会内核崩溃,但我是在FORWARD抓的ftp协议包,skb怎么可能没有ct跟踪?(我还想根据ct来显示NAT信息),请问这是什么原因呢?该如何解决?谢谢
作者: xtlx2000 发布时间: 2011-01-24
确认一下内核是否启用了 NF_CONNTRACK. 另外,先不要测试 ftp 的 ct,测试一个普通链接,比如 80 端口的。
对于指针,读取之前先判断一下非空。
对于指针,读取之前先判断一下非空。
作者: Godbach 发布时间: 2011-01-24
本帖最后由 xtlx2000 于 2011-01-24 16:52 编辑
回复 Godbach
大多数包都正常,也就是说ct!=NULL,即是开启的,但个别包获取的ct==NULL,这样内核就崩溃了,刚刚加了个if(!ct) return NF_ACCEPT;有了ct==NULL的包内核倒是不再崩溃了,但ftp客户端的ls命令后收不到“226 OK!”这条控制信息了?客户端卡在这里了。囧
这是我的hook函数,我只是从内核提取信息,并没有对内核结构体或skb做什么修改啊?晕了
复制代码
回复 Godbach
大多数包都正常,也就是说ct!=NULL,即是开启的,但个别包获取的ct==NULL,这样内核就崩溃了,刚刚加了个if(!ct) return NF_ACCEPT;有了ct==NULL的包内核倒是不再崩溃了,但ftp客户端的ls命令后收不到“226 OK!”这条控制信息了?客户端卡在这里了。囧
这是我的hook函数,我只是从内核提取信息,并没有对内核结构体或skb做什么修改啊?晕了
- unsigned int hook_func(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 *sb = skb;
- struct iphdr *iph;
- struct nf_conn *ct = NULL;
- enum ip_conntrack_info ctinfo;
-
- iph = ip_hdr(sb);
- tot_len = ntohs(iph->tot_len);
- ct = nf_ct_get(sb, &ctinfo);
- if(!ct){
- printk("No ct!\n");
- return NF_ACCEPT;
- }
- enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
-
- curr = kmalloc(sizeof(struct packet_info) + tot_len, GFP_KERNEL);
- memset(curr, 0, sizeof(struct packet_info) + tot_len);
-
- curr->number = number++;
- curr->tot_len = tot_len;
-
- //--------------------------------------------
- if(ct){
- /* daddr */
- curr->daddr = ct->tuplehash[dir].tuple.dst.u3.ip;
- /* if DNAT, we set nat_daddr */
- if(iph->daddr != ct->tuplehash[dir].tuple.dst.u3.ip){
- curr->nat_daddr = ct->tuplehash[!dir].tuple.src.u3.ip;
- }
- /* saddr */
- curr->saddr = ct->tuplehash[dir].tuple.src.u3.ip;
- /* if SNAT, we set nat_saddr */
- if(iph->saddr != ct->tuplehash[dir].tuple.src.u3.ip){
- curr->nat_saddr = ct->tuplehash[!dir].tuple.dst.u3.ip;
- }
- }
-
- curr->protocol = iph->protocol;
- //--------------------------------------------
-
- /* rtable */
- curr->rt_dst = sb->rtable->rt_dst;
- curr->rt_gateway = sb->rtable->rt_gateway;
-
- if(tot_len){
- memcpy(curr->data, iph, tot_len);
- }
-
- /* send message to user */
- sendnlmsg(curr);
- printk("send OK!number=%d\n", curr->number);
- kfree(curr);
- curr = NULL;
-
- return NF_ACCEPT;
- }
作者: xtlx2000 发布时间: 2011-01-24
QUOTE:
# unsigned int hook_func(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 *sb = skb;
# struct iphdr *iph;
# struct nf_conn *ct = NULL;
# enum ip_conntrack_info ctinfo;
#
# iph = ip_hdr(sb);
# tot_len = ntohs(iph->tot_len);
# ct = nf_ct_get(sb, &ctinfo);
# if(!ct){
# printk("No ct!\n");
# return NF_ACCEPT;
# }
# enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
#
# curr = kmalloc(sizeof(struct packet_info) + tot_len, GFP_KERNEL);
# struct sk_buff *skb,
# const struct net_device *in,
# const struct net_device *out,
# int(*okfn)(struct sk_buff *))
# {
# struct sk_buff *sb = skb;
# struct iphdr *iph;
# struct nf_conn *ct = NULL;
# enum ip_conntrack_info ctinfo;
#
# iph = ip_hdr(sb);
# tot_len = ntohs(iph->tot_len);
# ct = nf_ct_get(sb, &ctinfo);
# if(!ct){
# printk("No ct!\n");
# return NF_ACCEPT;
# }
# enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
#
# curr = kmalloc(sizeof(struct packet_info) + tot_len, GFP_KERNEL);
这两行红色代码,你是不是用的全局变量。curr 是你自己定义的结构体吗。
为了便于定位问题,建议先暂时不要申请内存和sendmsg,只是读取一下 ct 的结果,通过内核 printk 信息出来。调试没问题了,再加其他功能。
作者: Godbach 发布时间: 2011-01-24
回复 Godbach
虽然没找到啥原因,重写了一遍就好了,谢谢版主!
虽然没找到啥原因,重写了一遍就好了,谢谢版主!
作者: xtlx2000 发布时间: 2011-01-24
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28