多个内核模块可以使用相同的netfilter挂钩而不会相互影响吗?

时间:2015-02-06 09:36:07

标签: linux-kernel kernel-module netfilter

我正在开发一个内核模块,它将使用netfilter钩子以各种方式来破坏/过滤数据包,但是这样做我想避免使用该钩子绕过其他任何东西(例如iptables),这样我的模块不会干扰它们的常规操作。到目前为止,我的研究还没有得到关于访问同一个钩子的多个服务/模块如何交互的任何信息。

这是否可能(可能已经自动发生),如果是这样,我可以设置钩子触发服务/模块的顺序吗?

1 个答案:

答案 0 :(得分:2)

如您所知,钩子只是TCP / IP堆栈中的一个位置,您可以插入一些函数来执行任何与skbs相关的操作。每个函数通常返回以下之一(参见include / uapi / linux / netfilter.h)

  • NF_DROP -----这是此skb的结尾。删除这个skb并且不要将它传递给其他钩子(当然还有更高层)。
  • 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,};

这意味着IPtables mangle表挂钩将在FILTER挂钩之前执行。注册nf_register_hooks()时,您可以使用这些值中的任何一个。