2013-02-08 8 views
10

Jeśli napiszę kilka modułów jądra i we wszystkich z nich sprecyzuję, że powinny one być pierwszym (lub ostatnim) hakiem netfiltra, w jakiej kolejności będą one wywoływane?Jaką kolejność mają przechwyty Netfiltra, jeśli wszystkie określają NF_IP_PRI_LAST lub NF_IP_PRI_FIRST?

netfilter_ops_out.hook  = hook_func_out; 
netfilter_ops_out.pf  = PF_INET; 
netfilter_ops_out.hooknum = NF_IP_LOCAL_OUT; 
netfilter_ops_out.priority = NF_IP_PRI_FIRST; 

ret = nf_register_hook(&netfilter_ops_out); 
if (0 > ret) { 
    printk("Error registering netfilter hook: %d\n", ret); 
    return ret; 
}  

netfilter_ops_in.hook  = hook_func_in; 
netfilter_ops_in.pf  = PF_INET; 
netfilter_ops_in.hooknum = NF_IP_LOCAL_IN; 
netfilter_ops_in.priority = NF_IP_PRI_LAST; 

ret = nf_register_hook(&netfilter_ops_in); 
if (0 > ret) { 
    printk("Error registering netfilter hook: %d\n", ret); 
    return ret; 
}  

Eksperymentalnie, zrobiłem dwa moduły, insmod ed je w dwóch różnych porządków - ale dali ten sam rezultat, co oznacza, że ​​jest jakiś podrząd to nie tylko „kto pierwszy ten lepszy”. (To także nie jest alfabetycznie ...)

+1

'nf_register_hook()' jest wywoływane w funkcji 'module_init'. Starsze jądro: 2.6.18. Jeden moduł modyfikuje pakiet, drugi rejestruje go, oba używają tego samego kodu rejestracyjnego (powyżej). Ale niezależnie od tego, w jakiej kolejności ładuję moduły, zawsze widzę pakiet zmodyfikowany w rejestratorze. Pomyślałem, że powinienem móc uruchomić rejestrator przed modyfikatorem ... ale bez kości. –

+1

Przepraszam, moje wyjaśnienie po prostu rozwiało problem dalej. Mam cztery haki, po 2 z LOCAL_IN i LOCAL_OUT. Obydwa moduły łączą się z wejściami i wyjściami, ale koncentruję się tylko na przychodzeniu. –

Odpowiedz

3

Z kodów nf_register_hook() możemy wiedzieć, że jeśli dwa haki należą do tego samego nf_hooks [reg-> pf] [reg-> hooknum], sekwencja wykonania haka to decyzja priorytetowa. Jeśli priorytet jest taki sam, sekwencja to "kto pierwszy, ten lepszy". Zobacz następujące kody:

int nf_register_hook(struct nf_hook_ops *reg) 
{ 
    struct nf_hook_ops *elem; 
    int err; 

    err = mutex_lock_interruptible(&nf_hook_mutex); 
    if (err < 0) 
     return err; 
    list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) { 
     if (reg->priority < elem->priority) 
      break; 
    } 
    list_add_rcu(&reg->list, elem->list.prev); 
    mutex_unlock(&nf_hook_mutex); 
#if defined(CONFIG_JUMP_LABEL) 
    static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]); 
#endif 
    return 0; 
} 
Powiązane problemy