Как узнать состояние соединения с сетевым фильтром? - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь создать минимальный модуль ядра для регистрации сетевых пакетов, используя netfilter ловушки.Я хочу проверить, установлено ли / подтверждено ли конкретное соединение в обоих направлениях, например, что будет отображать conntrack.

Я получаю информацию о conntrack для каждого буфера сокета, и я хотел бы знать,состояние каждого буфера.Функция nf_ct_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo) принимает перечисление conntrack info, которое имеет член connection established.Есть ли способ получить эту информацию из информационной переменной conntrack.Или я должен просто использовать функцию 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;
 }
...