我正在开发一个内核模块,它将使用netfilter钩子以各种方式来破坏/过滤数据包,但是这样做我想避免使用该钩子绕过其他任何东西(例如iptables),这样我的模块不会干扰它们的常规操作。到目前为止,我的研究还没有得到关于访问同一个钩子的多个服务/模块如何交互的任何信息。
这是否可能(可能已经自动发生),如果是这样,我可以设置钩子触发服务/模块的顺序吗?
答案 0 :(得分:2)
如您所知,钩子只是TCP / IP堆栈中的一个位置,您可以插入一些函数来执行任何与skbs相关的操作。每个函数通常返回以下之一(参见include / uapi / linux / netfilter.h)
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()
时,您可以使用这些值中的任何一个。