Как вы знаете, хуки - это просто места в стеке TCP / IP, в которые вы можете вставить некоторые функции, чтобы делать все, что с skbs. Каждая функция обычно возвращает одно из следующего (см. Include / uapi / linux / netfilter.h)
- NF_DROP ----- Это конец этого скб. Отбросьте этот скб и не передавайте его остальным хукам (и конечно более высоким слоям).
- NF_ACCEPT - я закончил с этим skb, пересылаю skb на следующий хук
- NF_STOLEN - я угнал этот skb (модуль поставил skb в очередь для последующей обработки)
IPtables использует эти перехватчики для реализации необходимых правил брандмауэра. Конечно, вы можете существовать с IPtables (и любыми другими хуками), но если по какой-то причине ваша функция вызывается до перехвата IPtables и возвращает NF_DROP, skb не будет перенаправлен в IPtables. С другой стороны, если вы всегда возвращаете NF_ACCEPT, то IPtables и другие хуки в системе не пострадают.
Что касается порядка перехватов, то при обходе перехватчиков системой netfilter используются следующие приоритеты (из include / uapi / linux / netfilter_ipv4.h):
enum nf_ip_hook_priorities {
NF_IP_PRI_FIRST = INT_MIN,
NF_IP_PRI_CONNTRACK_DEFRAG = -400,
NF_IP_PRI_RAW = -300,
NF_IP_PRI_SELINUX_FIRST = -225,
NF_IP_PRI_CONNTRACK = -200,
NF_IP_PRI_MANGLE = -150,
NF_IP_PRI_NAT_DST = -100,
NF_IP_PRI_FILTER = 0,
NF_IP_PRI_SECURITY = 50,
NF_IP_PRI_NAT_SRC = 100,
NF_IP_PRI_SELINUX_LAST = 225,
NF_IP_PRI_CONNTRACK_HELPER = 300,
NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,
NF_IP_PRI_LAST = INT_MAX,};
Это означает, что перехватчики таблиц mangle IPtables будут выполняться до перехватов FILTER. Вы можете использовать любое из этих значений или свое собственное при регистрации в nf_register_hooks()
.
person
srd
schedule
16.02.2015
ebtables
когда-то очень давно, но если мне представится возможность взглянуть на код, я, возможно, смогу что-то выяснить. В идеале вам нужно будет опубликовать полный модуль ядра, который устанавливает ловушку (но ловушка на самом деле ничего не должна делать). - person Shahbaz   schedule 06.02.2015old_handler = install_my_handler(my_handler);
и позже вmy_handler
вы вызываетеold_handler
либо в самом начале, либо в самом конце. Это просто предположения хотя, не видя кода, я не могу сказать. - person Shahbaz   schedule 06.02.2015