2015-02-06 32 views
0

我正在开发一个内核模块,它将使用netfilter钩子以各种方式对数据包进行压缩/过滤,但是为了避免绕过其他任何使用该钩子的东西(例如iptables),以便我的模块不会“不会干扰他们的正常运作。到目前为止,我的研究还没有得到任何有关访问同一个钩子的多个服务/模块如何交互的信息。多个内核模块可以使用相同的netfilter钩子而不会相互影响吗?

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

+0

你能显示一些代码吗?我很久以前使用过'ebtables',但如果我有机会查看代码,我可能会找出一些东西。理想情况下,你需要发布一个完整的内核模块来安装钩子(但钩子不需要实际做任何事情)。 – Shahbaz 2015-02-06 10:36:41

+0

谢谢你的建议Shahbaz。在这个阶段,我还没有编写任何代码,但我想知道这是否可行,或者我需要在用户空间中做些什么。如果没有别的东西在弹出,我肯定会发布一些代码。再一次感谢你的帮助。 – Ian 2015-02-06 13:57:52

+0

我明白了。 netfilter是否支持针对特定事件或单个事件的多个挂钩?在前面的例子中,从逻辑上讲,应该是在其他钩子之前或之后安装钩子的方式。在后面的例子中,逻辑上应该是一种获取旧处理程序的方法,以便您可以自己调用它(如下所示:'old_handler = install_my_handler(my_handler);'稍后在'my_handler'中调用'old_handler'在最后的正确的开始。这些只是猜测,但没有看到我无法说出的代码。 – Shahbaz 2015-02-06 16:21:00

回答

1

正如你所知道的,钩子只是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和其他钩子根本不会受到影响。

至于钩的顺序中,当网络过滤系统横穿钩下面的优先级被使用(从包括/ 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()时,您可以使用这些值中的任何一个或您自己的值。

相关问题