多个内核模块是否可以使用相同的 netfilter hook 而不会相互影响?

Can multiple kernel modules use the same netfilter hook without affecting each other?

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

这可能吗(也许它已经自动发生了),如果是的话,我可以设置钩子触发 services/modules 的顺序吗?

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

  • NF_DROP ----- 本次skb到此结束。删除这个 skb,不要将它传递给其余的钩子(当然还有更高层)。
  • NF_ACCEPT -- 这个skb我做完了,转发skb到下一​​个hook
  • NF_STOLEN -- 我劫持了这个skb(模块将skb排队等待后续处理)

IPtables 使用这些钩子来实现所需的防火墙规则。您当然可以存在 IPtables(和任何其他挂钩),但是如果由于某种原因您的函数在 IPtables 挂钩和 returns NF_DROP 之前被调用, skb 不会被转发到 IPtables.另一方面,如果你总是returnNF_ACCEPT,那么系统中的IPtable和其他钩子根本不会受到影响。

关于hook的顺序,netfilter系统遍历hook时使用的优​​先级如下(来自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,};

这意味着 IPtable 的 mangle table 挂钩将在 FILTER 挂钩之前执行。当您注册 nf_register_hooks().

时,您可以使用这些值中的任何一个或您自己的值