Chinaunix

标题: 关于netfilter获取conntrack表项的问题 [打印本页]

作者: chenshko    时间: 2010-12-15 18:04
标题: 关于netfilter获取conntrack表项的问题
内核编译选项关于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比较熟悉,能看出其中的问题?

请帮帮小弟我。
作者: Godbach    时间: 2010-12-15 18:28
iptable规则,是在pre-routing上加了一条规则链

说一下详细情况,加在那个表上了
作者: 瀚海书香    时间: 2010-12-15 18:36
回复 1# chenshko
conntrack也是发生在prerouting上,所以说如果你的优先级比conntrack的优先级高的话,那么你的代码就会比conntrack更早调用,而这个时候ct应该就是NULL了。
作者: chenshko    时间: 2010-12-15 19:32
回复 2# Godbach


    在mangle表上
作者: chenshko    时间: 2010-12-15 19:33
本帖最后由 chenshko 于 2010-12-15 19:47 编辑
回复  chenshko
conntrack也是发生在prerouting上,所以说如果你的优先级比conntrack的优先级高的话,那么 ...
瀚海书香 发表于 2010-12-15 18:36



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

   在这nfqnl_recv_verdict函数是在用户态返回处理意见以后才被调用。
作者: chenshko    时间: 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

复制代码

作者: goter    时间: 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);

复制代码

作者: chenshko    时间: 2010-12-16 16:43
顶上去~
作者: Godbach    时间: 2010-12-16 16:51
你这样测试一下,单独写一个小模块,取一个 skb 的 ct,看看能否成功
作者: chenshko    时间: 2010-12-16 18:27
谢谢楼上各位,问题解决了~

通过跟内核发现,nf_conntrack_ipv4没有被加载,手动加载进去就好了
作者: Godbach    时间: 2010-12-17 10:07
原来是这样。。。:wink:




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2