【问题标题】:Can multiple kernel modules use the same netfilter hook without affecting each other?多个内核模块可以使用同一个 netfilter 钩子而不相互影响吗?
【发布时间】:2015-04-06 09:50:31
【问题描述】:

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

这可能吗(也许它已经自动发生了),如果可以,我可以设置挂钩触发服务/模块的顺序吗?

【问题讨论】:

  • 你能显示一些代码吗?很久以前我用过ebtables,但如果我有机会看一下代码,我可能会想出一些办法。理想情况下,您需要发布一个完整的内核模块来安装钩子(但钩子实际上不需要做任何事情)。
  • 感谢沙巴兹的建议。在这个阶段我还没有编写任何代码,但我试图了解这是否可能,或者我是否需要在用户空间中做一些事情。如果在此期间没有其他任何内容弹出,我一定会在我启动并运行一些代码时发布一些代码。再次感谢您的帮助。
  • 我明白了。 netfilter 是否支持特定事件的多个挂钩或单个事件?在较早的情况下,逻辑上应该有一种方法可以在“之前”或“之后”安装其他钩子或类似的东西。在后一种情况下,逻辑上应该有一种方法来获取旧处理程序,以便您可以自己调用它(如下所示:old_handler = install_my_handler(my_handler); 和稍后在 my_handler 中,您调用 old_handler 或者在右边的开头结束。不过,这些只是猜测,没有看到我无法判断的代码。

标签: linux-kernel kernel-module netfilter


【解决方案1】:

如您所知,挂钩只是 TCP/IP 堆栈中的位置,您可以插入一些函数来对 skb 执行任何操作。每个函数通常返回以下之一(参见 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 和其他钩子完全不会受到影响。

关于 hooks 的顺序,netfilter 系统遍历 hooks 时使用以下优先级(来自 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() 注册时,您可以使用这些值中的任何一个或您自己的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多