крюк сетевого фильтра в определенном пространстве имен net

#c #linux #namespaces #netfilter

Вопрос:

Я пытаюсь использовать функцию подключения netfilter в определенном пространстве имен net, но нет ни одного примера, демонстрирующего, как изменить параметр amp;init_net на наши собственные сети, созданные командой ip.

 static unsigned int verify_hookfunc(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
    char srcIP[16];

    struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb);
    
    sock_buff = skb;
    if(!sock_buff)
        return NF_ACCEPT;
    
    memset(srcIP, '', sizeof(srcIP));
    sprintf(srcIP, "%pI4", amp;ip_header->saddr);

    if(strcmp(srcIP, "1.2.3.4") == 0){
        printk("see sent modified packetn");
    }

    return NF_ACCEPT;
}

static int __init init_main(void)
{
    /* Netfilter Hook Function Info */
    nfho.hook     = verify_hookfunc;
    nfho.hooknum  = NF_BR_PRE_ROUTING;
    nfho.pf       = PF_BRIDGE;
    nfho.priority = INT_MIN;
    
    nf_register_net_hook(amp;init_net, amp;nfho);

    printk(KERN_INFO "Successfully inserted the hookn");


    return 0;
}

static void __exit cleanup_main(void)
{
    struct net *net;
   
    nf_unregister_net_hook(amp;init_net, amp;nfho);
    
    printk(KERN_INFO "Successfully unloaded the hookn");
}


module_init(init_main);
module_exit(cleanup_main);

MODULE_LICENSE("GPLv3");

 

Теперь у меня есть 4 сетевых пространства имен, созданных командой ip netns.

 /var/run/netns
├── ns1
├── ns2
├── ns3
└── ns4

 

Я хотел бы подключиться к конкретным сетям, таким как ns1, изменив параметр net в :

 nf_register_net_hook(amp;init_net, amp;nfho);
 

Для

 nf_register_net_hook(net_ns1, amp;nfho);
 

Как я мог бы получить структуру net *net_ns1 в функции крючка netfilter?

Спасибо за помощь!