我正在开发一个内核模块,它将使用netfilter钩子以各种方式对数据包进行压缩/过滤,但是为了避免绕过其他任何使用该钩子的东西(例如iptables),以便我的模块不会“不会干扰他们的正常运作。到目前为止,我的研究还没有得到任何有关访问同一个钩子的多个服务/模块如何交互的信息。多个内核模块可以使用相同的netfilter钩子而不会相互影响吗?
这是可能的(也许它已经自动发生),如果是这样,我可以设置钩子触发服务/模块的顺序吗?
我正在开发一个内核模块,它将使用netfilter钩子以各种方式对数据包进行压缩/过滤,但是为了避免绕过其他任何使用该钩子的东西(例如iptables),以便我的模块不会“不会干扰他们的正常运作。到目前为止,我的研究还没有得到任何有关访问同一个钩子的多个服务/模块如何交互的信息。多个内核模块可以使用相同的netfilter钩子而不会相互影响吗?
这是可能的(也许它已经自动发生),如果是这样,我可以设置钩子触发服务/模块的顺序吗?
正如你所知道的,钩子只是TCP/IP协议栈中的一个地方,你可以插入一些函数来做任何与skbs相关的功能。每个函数通常返回以下内容之一(请参阅include/uapi/linux/netfilter.h)
的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()
时,您可以使用这些值中的任何一个或您自己的值。
你能显示一些代码吗?我很久以前使用过'ebtables',但如果我有机会查看代码,我可能会找出一些东西。理想情况下,你需要发布一个完整的内核模块来安装钩子(但钩子不需要实际做任何事情)。 – Shahbaz 2015-02-06 10:36:41
谢谢你的建议Shahbaz。在这个阶段,我还没有编写任何代码,但我想知道这是否可行,或者我需要在用户空间中做些什么。如果没有别的东西在弹出,我肯定会发布一些代码。再一次感谢你的帮助。 – Ian 2015-02-06 13:57:52
我明白了。 netfilter是否支持针对特定事件或单个事件的多个挂钩?在前面的例子中,从逻辑上讲,应该是在其他钩子之前或之后安装钩子的方式。在后面的例子中,逻辑上应该是一种获取旧处理程序的方法,以便您可以自己调用它(如下所示:'old_handler = install_my_handler(my_handler);'稍后在'my_handler'中调用'old_handler'在最后的正确的开始。这些只是猜测,但没有看到我无法说出的代码。 – Shahbaz 2015-02-06 16:21:00