免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4251 | 回复: 10
打印 上一主题 下一主题

关于netfilter获取conntrack表项的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-15 18:04 |只看该作者 |倒序浏览
内核编译选项关于netfilter的全部选上了
iptable规则,是在pre-routing上加了一条规则链

修改了nfnetlink_queue.c文件
在nfqnl_recv_verdict函数中添加了

    struct nf_conn *ct;
    enum ip_conntrack_info ctinfo;

    ct = nf_ct_get(entry->skb, &ctinfo);//通过skb->nfct获取连接在conntrack表中表项



entry->skb存在(即通过netfilter queue id 从其queue中获得的skb),但是ct为NULL,skb->nfct也为NULL。因此无法获取到conntrack表的表项。

谁遇到过类似的问题,或者对netfilter比较熟悉,能看出其中的问题?

请帮帮小弟我。

论坛徽章:
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
2 [报告]
发表于 2010-12-15 18:28 |只看该作者
iptable规则,是在pre-routing上加了一条规则链

说一下详细情况,加在那个表上了

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2010-12-15 18:36 |只看该作者
回复 1# chenshko
conntrack也是发生在prerouting上,所以说如果你的优先级比conntrack的优先级高的话,那么你的代码就会比conntrack更早调用,而这个时候ct应该就是NULL了。

论坛徽章:
0
4 [报告]
发表于 2010-12-15 19:32 |只看该作者
回复 2# Godbach


    在mangle表上

论坛徽章:
0
5 [报告]
发表于 2010-12-15 19:33 |只看该作者
本帖最后由 chenshko 于 2010-12-15 19:47 编辑
回复  chenshko
conntrack也是发生在prerouting上,所以说如果你的优先级比conntrack的优先级高的话,那么 ...
瀚海书香 发表于 2010-12-15 18:36



    我试着在forward链上加规则,也是同样的情况。

   在这nfqnl_recv_verdict函数是在用户态返回处理意见以后才被调用。

论坛徽章:
0
6 [报告]
发表于 2010-12-15 19:50 |只看该作者
这是规则脚本

  1. TABLE=mangle
  2. function remove_chain(){
  3.     echo -n removing chain...
  4.     {
  5.         /sbin/iptables -t ${TABLE} -D PREROUTING -j NF_QUEUE_CHAIN
  6.         /sbin/iptables -t ${TABLE} -D OUTPUT -j NF_QUEUE_CHAIN
  7.         /sbin/iptables -t ${TABLE} -F NF_QUEUE_CHAIN
  8.         /sbin/iptables -t ${TABLE} -X NF_QUEUE_CHAIN
  9.     } &>/dev/null
  10.     echo done
  11. }
  12. function create_chain(){
  13.     echo -n creating chain...
  14.     /sbin/iptables -t ${TABLE} -N NF_QUEUE_CHAIN
  15.     echo hello
  16.     /sbin/iptables -t ${TABLE} -A NF_QUEUE_CHAIN -p tcp -d 192.168.0.220 -m mark --mark 0 -j NFQUEUE --queue-num 8010
  17.     /sbin/iptables -t ${TABLE} -A NF_QUEUE_CHAIN -p tcp -s 192.168.0.220 -m mark --mark 0 -j NFQUEUE --queue-num 8010
  18.     /sbin/iptables -t ${TABLE} -A NF_QUEUE_CHAIN -j MARK --set-mark 0
  19.     /sbin/iptables -t ${TABLE} -I OUTPUT -j NF_QUEUE_CHAIN
  20.     /sbin/iptables -t ${TABLE} -I PREROUTING -j NF_QUEUE_CHAIN
  21.     echo done
  22. }
  23. function on_iqh(){
  24.     remove_chain
  25.     exit 1
  26. }
  27. trap on_iqh INT QUIT HUP
  28. remove_chain
  29. create_chain
  30. exit 0
  31. ./nf_queue_test 8010
  32. remove_chain

复制代码

论坛徽章:
2
申猴
日期:2013-12-26 22:11:31天秤座
日期:2014-12-23 10:23:19
7 [报告]
发表于 2010-12-16 00:20 |只看该作者
看看

  1. static inline struct nf_conn *
  2. resolve_normal_ct(struct net *net,
  3.                   struct sk_buff *skb,
  4.                   unsigned int dataoff,
  5.                   u_int16_t l3num,
  6.                   u_int8_t protonum,
  7.                   struct nf_conntrack_l3proto *l3proto,
  8.                   struct nf_conntrack_l4proto *l4proto,
  9.                   int *set_reply,
  10.                   enum ip_conntrack_info *ctinfo)
  11. {
  12.         struct nf_conntrack_tuple tuple;
  13.         struct nf_conntrack_tuple_hash *h;
  14.         struct nf_conn *ct;

  15.         if (!nf_ct_get_tuple(skb, skb_network_offset(skb),
  16.                              dataoff, l3num, protonum, &tuple, l3proto,
  17.                              l4proto)) {
  18.                 pr_debug("resolve_normal_ct: Can't get tuple\n");
  19.                 return NULL;
  20.         }

  21.         /* look for tuple match */
  22.         h = nf_conntrack_find_get(net, &tuple);
  23.         if (!h) {
  24.                 h = init_conntrack(net, &tuple, l3proto, l4proto, skb, dataoff);
  25.                 if (!h)
  26.                         return NULL;
  27.                 if (IS_ERR(h))
  28.                         return (void *)h;
  29.         }
  30.         ct = nf_ct_tuplehash_to_ctrack(h);

复制代码

论坛徽章:
0
8 [报告]
发表于 2010-12-16 16:43 |只看该作者
顶上去~

论坛徽章:
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
9 [报告]
发表于 2010-12-16 16:51 |只看该作者
你这样测试一下,单独写一个小模块,取一个 skb 的 ct,看看能否成功

论坛徽章:
0
10 [报告]
发表于 2010-12-16 18:27 |只看该作者
谢谢楼上各位,问题解决了~

通过跟内核发现,nf_conntrack_ipv4没有被加载,手动加载进去就好了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP