如何获取netfilter conntrack的连接状态?

时间:2019-02-05 11:43:05

标签: c linux-kernel netfilter

我正在尝试使用netfilter钩子创建一个最小的网络数据包日志记录内核模块。我想检查是否在两个方向上都建立/确认了特定的连接,例如conntrack将显示什么。

我正在获取每个套接字缓冲区的conntrack信息,并且我想知道每个缓冲区的状态。函数nf_ct_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo)接受一个conntrack info枚举,该枚举具有一个connection established成员。 有没有办法从conntrack info变量中获取此信息。 还是应该只使用nf_ct_is_confirmed(const struct nf_conn *ct)函数? 我不确定此功能是否是检查已建立连接的正确功能。

static unsigned int device_all_incoming_hook(unsigned int hooknum, struct sk_buff *skb,
                        const struct net_device *in, const struct net_device *out,
                           int (*okfn)(struct sk_buff *)) {
    struct iphdr *packet;
    struct nf_conn *conntrack;
    enum ip_conntrack_info ctinfo;

    socket_buffer = skb_clone(skb, GFP_KERNEL);

    if (!socket_buffer)
         return NF_ACCEPT;
    packet = (struct iphdr *) skb_network_header(socket_buffer);
    if (packet->protocol < 0)
         return NF_ACCEPT;

    if (packet->protocol != IPPROTO_TCP) {
         return NF_ACCEPT;
    }
    conntrack = nf_ct_get(socket_buffer, &ctinfo);
    printk(KERN_INFO "Info is %d\n", &ctinfo);
    return NF_ACCEPT;
 }

 static struct nf_hook_ops device_hooks[] __read_mostly = {
    {
        .hook       = device_all_incoming_hook,
        .pf         = NFPROTO_IPV4,
        .hooknum    = NF_INET_PRE_ROUTING,
        .priority   = NF_IP_PRI_FIRST,
   },

 };

 static int device_init(void) {
    int result;
    result = nf_register_hooks(device_hooks, ARRAY_SIZE(device_hooks));
     if (result > 0) {
    ;
}
     pr_debug("Loading device into kernel!\n");
     return 0;
 }

0 个答案:

没有答案