0

我需要删除内核中的一个 conntrack 条目。有许多函数,如nf_ct_deletenf_ct_put。目前,我在一个skb->nfct(每个跟踪的 skb 上的块)上都使用两者。起初它似乎工作正常,但几秒钟后内核就崩溃了。

我目前的代码如下:

struct nf_conntrack *con = skb->nfct;
nf_conntrack_get(sub_conntrack);
//... do some stuff 
nf_ct_delete((struct nf_conn *) con, 0, 0);
nf_ct_put((struct nf_conn *) con);

在执行 delete 和 put 语句后,我立即检查条目conntrack -L conntrack并且它们消失了(如预期的那样)。但一分钟左右后,系统冻结。我猜 conntrack 会启动一些计时器,这些计时器在触发时会崩溃。

所以我的问题是:如何立即删除特定连接的所有内容?包括停止任何计时器和清理所有状态。

4

1 回答 1

0

这是改编自netfilter代码

int delete_nat_entry(u32 loc_ip, u32 rem_ip, u16 loc_port, u16 rem_port) {
        struct nf_conntrack_tuple_hash *h;
        struct nf_conntrack_tuple tuple;
        struct nf_conn *ct;

        memset(&tuple, 0, sizeof(tuple));

        //layer 3
        tuple.src.l3num = PF_INET;
        tuple.src.u3.ip = htonl(loc_ip);
        tuple.dst.u3.ip = htonl(rem_ip);

        //layer 4
        tuple.dst.protonum = IPPROTO_TCP;
        tuple.dst.dir = IP_CT_DIR_ORIGINAL;
        tuple.src.u.tcp.port = htons(loc_port);
        tuple.dst.u.tcp.port = htons(rem_port);

        h = nf_conntrack_find_get(&init_net, NF_CT_DEFAULT_ZONE, &tuple);
        if (!h) {
                debug_msg(KERN_INFO "cannot find conntrack tuple\n");
                return -ENOENT;
        }
        ct = nf_ct_tuplehash_to_ctrack(h);

        if (del_timer(&ct->timeout))
                nf_ct_delete(ct, 0, 0);

        nf_ct_put(ct);

        return 0;
}
于 2015-02-03T13:54:26.040 回答