Могут ли несколько модулей ядра использовать одну и ту же ловушку netfilter, не влияя друг на друга?

Я разрабатываю модуль ядра, который будет использовать перехватчики netfilter для искажения / фильтрации пакетов различными способами, однако при этом я хотел бы избежать обхода чего-либо еще с помощью этого перехватчика (например, iptables), чтобы мой модуль не мешал при штатной их эксплуатации. Мое исследование до сих пор не дало никакой информации о том, как будут взаимодействовать несколько сервисов / модулей, обращающихся к одному и тому же хуку.

Возможно ли это (возможно, это уже происходит автоматически), и если да, могу ли я установить порядок, в котором службы / модули запускаются ловушкой?


person Ian    schedule 06.02.2015    source источник
comment
Вы можете показать код? Я использовал ebtables когда-то очень давно, но если мне представится возможность взглянуть на код, я, возможно, смогу что-то выяснить. В идеале вам нужно будет опубликовать полный модуль ядра, который устанавливает ловушку (но ловушка на самом деле ничего не должна делать).   -  person Shahbaz    schedule 06.02.2015
comment
Спасибо за предложение Шахбаз. На данном этапе я ничего не кодировал, но пытаюсь понять, возможно ли это или мне нужно будет что-то делать в пользовательском пространстве. Я обязательно опубликую код, когда его запустят, если за это время больше ничего не появится. Еще раз, спасибо за помощь.   -  person Ian    schedule 06.02.2015
comment
Я понимаю. Поддерживает ли netfilter несколько перехватчиков для определенного события или одного? В более раннем случае логически должен быть способ установить ваш крючок до или после других хуков или что-то в этом роде. В последнем случае логически должен быть способ получить старый обработчик, чтобы вы могли вызвать его самостоятельно (примерно так: old_handler = install_my_handler(my_handler); и позже в my_handler вы вызываете old_handler либо в самом начале, либо в самом конце. Это просто предположения хотя, не видя кода, я не могу сказать.   -  person Shahbaz    schedule 06.02.2015


Ответы (1)


Как вы знаете, хуки - это просто места в стеке 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