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 ...)
'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. –
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. –